c - 为什么我不能将FS寄存器的PID block 的值赋值给一个unsigned int?

标签 c assembly x86

简短描述(32 位版本)

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

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov id, fs:[0x20];
    }
    return id;

但不是这个?

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov ebx, fs:[0x20];
        mov id, ebx;
    }
    return id;
}

我不熟悉在 C 语言中使用汇编语言,我希望得到一些解释,说明我在使用它时是如何工作的。

注意。我知道使用这个函数来获取当前进程 ID 是不好的。这只是一个实验,我也在学习操作系统。

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

最佳答案

Intel 程序集不支持从内存到内存的MOVid 是一个内存位置。您只能从内存向寄存器移动,反之亦然。

就是说,检查一下 __readfsdword 编译器内在的。

关于c - 为什么我不能将FS寄存器的PID block 的值赋值给一个unsigned int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56043897/

相关文章:

x86 - AVX-512 浮点比较和屏蔽

c++ - C++ 单元测试框架

c - 如何在内核驱动中获取sk_buff_head?

c++ - printf 和 scanf 中 %lli 和 %lld 之间的区别?

assembly - 如何在程序集 8086 中输出存储在变量中的值?

xcode - ARM NEON 汇编程序错误 : "instruction cannot be conditional"

linux - 汇编代码在 Linux 上不起作用

c - 如何通过 x86 程序集访问整数数组中的元素

c - 为什么在打印特定范围的素数后会得到内存位置值?

c - int *q = p++ 和 int c = a++ 的汇编 lea 指令