2012-10-24 84 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
相關問題