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

发布于 2022-09-03 03:24:46 字数 933 浏览 21 评论 0

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

#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这算什么寄存器 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱你不解释 2022-09-10 03:24:46

图片描述

原谅我实在懒得开截图工具。。就直接简单粗暴把屏幕撸上去了。。
简单说明:
左侧:测试代码
右侧:gcc -s的汇编代码(v5.3.0)
红圈内的内容:宏定义的反汇编结果。

基本可以解决主问题了吧。。
那个__res指的是返回值。因为宏定义定义的是一个代码块,代码块的返回值默认为块的最后一行值。写了个验证代码。
图片描述

至于cr0,我也是百度的=。=但是看到不同的应用环境里它的定义也是不一样的。笼统来说就是个控制寄存器。具体情况具体分析吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文