Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C visualstudio中的汇编_C_Visual Studio_Assembly - Fatal编程技术网

C visualstudio中的汇编

C visualstudio中的汇编,c,visual-studio,assembly,C,Visual Studio,Assembly,我对Visual Studio有问题,它无法识别asm中的“字节ptr”。有人知道我应该用什么来代替吗?我使用VisualStudio,因为我只想在C++代码旁边做一点ASM,以加快速度。因此,任何人也可以检查代码,因为我不确定返回(这只是一个测试)。这对in也适用于uint吗 __declspec(naked) void bewerken(int letter) { __asm { push ebp mov ebp, esp su

我对Visual Studio有问题,它无法识别asm中的“字节ptr”。有人知道我应该用什么来代替吗?我使用VisualStudio,因为我只想在C++代码旁边做一点ASM,以加快速度。因此,任何人也可以检查代码,因为我不确定返回(这只是一个测试)。这对in也适用于uint吗

__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;
}
\uuuu declspec(裸)void bewerken(整数字母)
{
__asm
{
推ebp
电动汽车
子esp,1//ruimte maken voor 1变量van 1字节
mov字节ptr[eax],[ebp+8]
电除尘器
流行ebp
ret
}
}
int _tmain(int argc,_TCHAR*argv[]
{
字符*字节;
整数字母;
打印文件(“信在:\n”);
letter=getchar();
如果(字母<128)
{
__asm
{
推送信
打电话给bewerken
添加esp,4
mov字节ptr字节,eax
}
}
其他的
{
打印文件(“Te hoog.\n”);
}
getchar();
返回0;
}

注意:“字节PTR”也不编译,没有有效的寻址模式
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时代它是这样工作的


在任何其他情况下,操作的宽度都应清晰。

没有有效的寻址模式
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时代它是这样工作的


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

如果要使用MSVC内联汇编来提高性能,则需要使用比这更大的块。众所周知,MSVC程序集的启动和结束开销很大,因为所有操作数都必须通过内存传入。请尝试
mov al,byte ptr[esp+8]
您可能希望首先执行
xor eax,eax
,这取决于您如何使用eax。编辑:另外,由于裸函数,我认为这里不应该有太多的开销,我已经使用了很多,也从来没有见过神秘的开销。如果你使用MSVC内联汇编来提高性能,你需要使用更大的块。众所周知,MSVC程序集的启动和结束开销很大,因为所有操作数都必须通过内存传入。请尝试
mov al,byte ptr[esp+8]
您可能希望首先执行
xor eax,eax
,这取决于您如何使用eax。编辑:另外,由于裸体功能,我认为这里不应该有太多的开销,我已经用了很多次了,从来没有看到过神秘故事中所说的开销。