为什么不能将FS寄存器的PID块的值分配给无符号的int?

DNS*_*zus 0 c x86 assembly

简短说明(32位版本)

为什么这会引发不正确的操作数错误?

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov id, fs:[0x20];
    }
    return id;
Run Code Online (Sandbox Code Playgroud)

但是不是吗?

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov ebx, fs:[0x20];
        mov id, ebx;
    }
    return id;
}
Run Code Online (Sandbox Code Playgroud)

我是在C中使用汇编语言的新手,我想对使用它时工作原理进行一些解释。

注意。我知道使用此功能获取当前进程ID是错误的。这只是一个实验,还可以学习操作系统。

附带问题:可以在汇编括号中编写函数的一半吗?然后用C完成功能?还是每个功能都应该全部为C或全部为汇编?

Sev*_*yev 5

英特尔程序集不支持MOV从内存到内存。id是一个内存位置。您只能将MOV从内存移动到寄存器,反之亦然。

也就是说,请检查__readfsdword编译器内在函数。