2012-10-24 49 views
0

我遇到了Visual Studio问题,它无法识别asm中的“byte ptr”。有谁知道我应该用什么来代替?我使用visual studio是因为我只是想在C++代码旁边做一些asm来加速一些事情。所以任何人也可以检查代码,因为我不确定返回(这只是一个测试)。这是否也适用于uint?Visual Studio中的汇编

__declspec(naked) void bewerken(int letter) 
{ 
    __asm 
    { 
     push ebp 
     mov ebp, esp 
     sub esp, 1  // ruimte maken voor 1 variabele van 1 byte 
     mov byte ptr [eax], [ebp+8] 
     mov esp, ebp 
     pop ebp 
     ret 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* bYte; 
    int letter; 
    printf_s("Voer een letter in:\n"); 
    letter = getchar(); 

    if (letter < 128) 
    { 
     __asm 
     { 
      push letter 
      call bewerken 
      add esp, 4 
      mov byte ptr bYte, eax 
     } 
    } 
    else 
    { 
     printf_s("Te hoog.\n"); 
    } 

    getchar(); 
    return 0; 
} 

注: “BYTE PTR” 不编译任

+0

如果您使用MSVC内联汇编提高性能,您将需要使用比此更大的块。已知MSVC程序集有很多启动和结束开销,因为所有操作数都必须通过内存传入。 – Mysticial

+0

尝试使用'mov al,byte ptr [esp + 8]'你可能首先根据你如何使用eax来做'xor eax,eax'。编辑:另外我不认为这里应该有太多的开销,由于裸露的功能,我已经使用了它们很多,并且从未见过Mysticial正在讨论的开销。用于'debug.exe'的 – user1520427

回答

4

没有有效的寻址模式mov whatever [eax], [ebp+8]

人们可以mov al, [ebp+8]mov ax,[ebp+8]mov eax,[ebp+8],也mov rax,[ebp+0x132220],也可以移动的立即转到具有即时偏移的地址。这将是唯一的情况下,需要明确的宽度属性:mov byte ptr 0x01,[ebp+8]至少这是它在debug.exe时代的工作方式...

在其他任何情况下,操作的宽度应该是清楚的。

+0
相关问题