嵌入式汇编

发布于 2022-09-18 10:40:48 字数 4240 浏览 12 评论 0

    我在做有关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 技术交流群。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文