【发布时间】:2014-09-19 17:17:53
【问题描述】:
我有内联汇编代码:
#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 是否总是知道正确的寄存器大小?
【问题讨论】:
-
我相信是因为
0x173的类型是int,所以gcc使用了32位的mov指令 -
mov cx, 0x173不会将ecx设置为 0x173。高 16 位将包含早期计算中剩余的任何值。 -
@RaymondChen:我知道你说什么。我想知道为什么gcc知道必须使用“ecx”。
-
@RaymondChen 我相信问题是问 GCC 如何知道“c”约束是指
ecx而不是cx或rcx。如果我是正确的,那么您的编辑会改变其含义。
标签: gcc assembly x86 inline-assembly