免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2573 | 回复: 6

do_IRQ函数中的一段内联汇编,请各位帮我看看怎么区分输入部,输出部? [复制链接]

论坛徽章:
0
发表于 2008-03-31 17:34 |显示全部楼层
下面这段代码是do_IRQ中的一段内联汇编:
asm volatile(

" xchgl %%ebx,%%esp \n"

" call __do_IRQ \n"

" movl %%ebx,%%esp \n"

: "=a" (arg1), "=d" (arg2), "=b" (ebx)

: "0" (irq), "1" (regs), "2" (isp)

: "memory", "cc", "ecx"

);
对内联汇编一直是一知半解。这段代码的输入域的对应关系是怎么对应的?为什么没有%0,1%那样的占位符?

[ 本帖最后由 dengcainiao 于 2008-3-31 17:44 编辑 ]

论坛徽章:
0
发表于 2008-03-31 17:51 |显示全部楼层
在本例中, %0就是%%eax,%1就是%%edx,%2就是ebx, 使用它们来传递参数和设置堆栈给__do_IRQ()函数,相当于隐式使用

fixme

论坛徽章:
0
发表于 2008-03-31 19:23 |显示全部楼层
albcamus版主说的从这段代码的作用上看确实应该是这样。但不知内联汇编的语法究竟是怎么规定这种没有明确指出占位符情况下的内联汇编的?

论坛徽章:
0
发表于 2008-04-01 12:31 |显示全部楼层
原帖由 dengcainiao 于 2008-3-31 19:23 发表
albcamus版主说的从这段代码的作用上看确实应该是这样。但不知内联汇编的语法究竟是怎么规定这种没有明确指出占位符情况下的内联汇编的?

同问,x86的汇编一直搞不清楚,看来还是要买一本《汇编语言设计》看看

论坛徽章:
0
发表于 2008-04-02 10:13 |显示全部楼层
原帖由 zx_wing 于 2008-4-1 12:31 发表

同问,x86的汇编一直搞不清楚,看来还是要买一本《汇编语言设计》看看



老大肯定没仔细看贴


%0、%1这些东西没啥玄虚的, 就是 把输出部和输入部算在一起, 参数从头数数, 第一个就是%0, 第二个就是%1……依此类推。


在本例中, 既然%%ebx就是%2, 那么汇编代码中 需要访问ebx的时候, 写作任何一个都是可以的,没什么区别。 何必一定要%2这种写法呢?

论坛徽章:
0
发表于 2008-04-02 10:55 |显示全部楼层
原帖由 albcamus 于 2008-4-2 10:13 发表



老大肯定没仔细看贴


%0、%1这些东西没啥玄虚的, 就是 把输出部和输入部算在一起, 参数从头数数, 第一个就是%0, 第二个就是%1……依此类推。


在本例中, 既然%%ebx就是%2, 那么汇编代码 ...

能详细说说吗,为什么%%ebx就是%2?

论坛徽章:
0
发表于 2008-04-02 11:00 |显示全部楼层
原帖由 dengcainiao 于 2008-4-2 10:55 发表

能详细说说吗,为什么%%ebx就是%2?



"=a" (arg1), "=d" (arg2), "=b" (ebx)


从0开始数数, eax是第零个,也就是%0, edx就是%1, ebx就是%2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP