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

查看:122
本文介绍了asm - 关于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,我也是百度的=。=但是看到不同的应用环境里它的定义也是不一样的。笼统来说就是个控制寄存器。具体情况具体分析吧。

这篇关于asm - 关于C语言内嵌汇编代码的问题...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆