嵌入式汇编
我在做有关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,实验证明这一句导致程序崩溃,无法正确执行下去。
我猜测是编译器的原因,但是我实验了使用各种级别的优化,都不起作用。如何避免这种情况?(最好不改源代码)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论