关于C语言内嵌汇编代码的问题...
偶然看到一段这样的代码 :
#define do_div(n, base)({\ int __res;\
__asm__("divl %4" : "=a" (n), "=d" (__res) : "0"(n), "1" (0), "r"(base);)\
__res;})
有如下几个疑点 :
内嵌汇编代码的input和output的执行顺序是不是先input再output, 上图汇编中的第二部分将%eax的值赋给n, 将%edx赋给__res是不是在其后面的input部分之后执行呢?
input部分的 "0"和"1"代表什么 ? 我只知道"a", "b"之类的所代表的寄存器, 这里我能猜可能是%eax, %edx, 但是不知道具体的规则.
最后一行 __res;单独成句, 这一句有什么意义呢?
另外在查阅相关资料的时候看到了如下代码 :
int main(int __argc, char* __argv[]) {
int cr0 = 5;
__asm__ __volatile__("movl %%cr0, %0":"=a" (cr0));
return 0;
}
$ gcc -S example2.c
$ cat example2.s
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $5, -4(%ebp) # cr0 = 5
#APP
movl %cr0, %eax
#NO_APP
movl %eax, %eax
movl %eax, -4(%ebp) # cr0 = %eax
movl $0, %eax
leave
ret
这里我很奇怪这一行代码 movl %cr0, %eax
, %cr0这算什么寄存器 ?
回答:
原谅我实在懒得开截图工具。。就直接简单粗暴把屏幕撸上去了。。
简单说明:
左侧:测试代码
右侧:gcc -s的汇编代码(v5.3.0)
红圈内的内容:宏定义的反汇编结果。
基本可以解决主问题了吧。。
那个__res指的是返回值。因为宏定义定义的是一个代码块,代码块的返回值默认为块的最后一行值。写了个验证代码。
至于cr0,我也是百度的=。=但是看到不同的应用环境里它的定义也是不一样的。笼统来说就是个控制寄存器。具体情况具体分析吧。
以上是 关于C语言内嵌汇编代码的问题... 的全部内容, 来源链接: utcz.com/p/195157.html