关于C语言内嵌汇编代码的问题...

偶然看到一段这样的代码 :

#define do_div(n, base)({\

int __res;\

__asm__("divl %4" : "=a" (n), "=d" (__res) : "0"(n), "1" (0), "r"(base);)\

__res;})

有如下几个疑点 :

  1. 内嵌汇编代码的input和output的执行顺序是不是先input再output, 上图汇编中的第二部分将%eax的值赋给n, 将%edx赋给__res是不是在其后面的input部分之后执行呢?

  2. input部分的 "0"和"1"代表什么 ? 我只知道"a", "b"之类的所代表的寄存器, 这里我能猜可能是%eax, %edx, 但是不知道具体的规则.

  3. 最后一行 __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

回到顶部