免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1768 | 回复: 0
打印 上一主题 下一主题

嵌入式汇编 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-12 22:56 |只看该作者 |倒序浏览
    我在做有关linux0.11内核方面的实验。当使用fork()系统调用建立新任务的时候,在copy_proess()函数中的嵌入式汇编出现错误。源代码如下:

在头文件中的宏定义如下:
#define _set_tssldt_desc(n,addr,type) \
__asm__ ("movw $104,%1\n\t" \

"movw%%ax,%2\n\t" \

"rorl$16,%%eax\n\t" \

"movb%%al,%3\n\t" \

"movb$" type ",%4\n\t" \

"movb$0x00,%5\n\t" \

"movb%%ah,%6\n\t" \

"rorl$16,%%eax" \

::"a"(addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), \


"m" (*(n+5)), "m"(*(n+6)), "m" (*(n+7)) \

)
#define set_tss_desc(n,addr)_set_tssldt_desc(((char *) (n)),addr,"0x89")
#define set_ldt_desc(n,addr)_set_tssldt_desc(((char *) (n)),addr,"0x82")

调用函数如下
set_tss_desc (gdt + (nr << 1) +FIRST_TSS_ENTRY, &(p->tss));
set_ldt_desc (gdt + (nr << 1) +FIRST_LDT_ENTRY, &(p->ldt));

相对应得汇编代码如下:
L62:

movl-4(%ebp),%ecx

addl$744,%ecx

movl%ecx,-44(%ebp)//把(ebp-4)的值+744存入到ebp-44中。

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-40(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-24(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-28(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-32(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-36(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-16(%ebp)

movl-40(%ebp),%ecx

movl-24(%ebp),%ebx

movl-28(%ebp),%esi

movl-32(%ebp),%edi

movl-36(%ebp),%edx

movl-16(%ebp),%ebp//此处竟然修改了ebp,可是这是堆栈指针,怎么能修改?

movl-44(%ebp),%eax//这样eax中就不是原来存储的值了。
/APP

movw$104,_gdt+32(,%ecx,8 )

movw%ax,_gdt+34(,%ebx,8 )

rorl$16,%eax

movb%al,_gdt+36(,%esi,8 )

movb$0x89,_gdt+37(,%edi,8 )

movb$0x00,_gdt+38(,%edx,8 )

movb%ah,_gdt+39(,%ebp,8 )

rorl$16,%eax
/NO_APP

movl-4(%ebp),%ecx

addl$720,%ecx

movl%ecx,-44(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-40(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-24(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-28(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-32(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-36(%ebp)

movl8(%ebp),%ecx

addl%ecx,%ecx

movl%ecx,-20(%ebp)

movl-40(%ebp),%ecx

movl-24(%ebp),%ebx

movl-28(%ebp),%esi

movl-32(%ebp),%edi

movl-36(%ebp),%edx

movl-20(%ebp),%ebp//此处也有相同的情况。

movl-44(%ebp),%eax
/APP

movw$104,_gdt+40(,%ecx,8 )

movw%ax,_gdt+42(,%ebx,8 )

rorl$16,%eax

movb%al,_gdt+44(,%esi,8 )

movb$0x82,_gdt+45(,%edi,8 )

movb$0x00,_gdt+46(,%edx,8 )

movb%ah,_gdt+47(,%ebp,8 )

rorl$16,%eax
/NO_APP

问题在我注释的语句,尤其第二个带注释的语句,在没有调用函数的情况下竟然修改了ebp,实验证明这一句导致程序崩溃,无法正确执行下去。

我猜测是编译器的原因,但是我实验了使用各种级别的优化,都不起作用。如何避免这种情况?(最好不改源代码)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP