我有内联汇编代码:
#define read_msr(index, buf) asm volatile ("rdmsr" : "=d"(buf[1]), "=a"(buf[0]) : "c"(index))
使用该宏的代码:
u32 buf[2];
read_msr(0x173, buf);
我发现反汇编是(使用gnu工具链):
mov eax,0x173
mov ecx,eax
rdmsr
mov DWORD PTR [rbp-0xc],edx
mov DWORD PTR [rbp-0x10],eax
问题是0x173小于0xffff,为什么gcc不使用mov cx, 0x173
? gcc会分析下面的指令吗rdmsr
? gcc 总是知道正确的寄存器大小吗?
这取决于传递的值或变量的大小。
如果你传递一个“short int”,它将设置“cx”并从“ax”和“dx”读取数据(如果buf也是一个short int)。
对于 char 它将访问“cl”等等。
所以“c”指的是“ecx”寄存器,但是根据访问的大小,可以使用“ecx”、“cx”或“cl”来访问它,我认为这是有道理的。
要进行测试,您可以尝试传递(无符号短)0x173,它应该更改代码。
没有对内联程序集进行分析(实际上它是在文本替换后直接复制到输出程序集,包括语法错误)。此外,没有默认的寄存器大小,具体取决于您的目标是 32 位还是 64 位。这将是一种限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)