【发布时间】:2014-07-19 06:53:54
【问题描述】:
下面的x86汇编代码汇编很好,它曾经在我学校的linux服务器上完美运行,但是在我的linux虚拟机(ubuntu 14.04)应用相同的代码时,突然导致分段错误。
堆栈约定是否改变了,这是 GNU 汇编程序的问题吗?我错过了什么备忘录? 我在 64 位机器上运行,这是构建操作系统主干的热身,所以我需要能够使用 16 位实数、32 位保护和 64 位模式都在同一个程序中。所以我想我真正需要的是关于使所有模式在同一个程序中有效的小细节。我知道在更改模式时使用 .code16/32/64 ,但我想我缺少什么(并且似乎在任何操作系统教程中都找不到,是如何在 64 位架构上执行此操作。
.code32
.text
.global _start
_start:
pushl $str1
pushl $len1
call print
addl $8, %esp <-cleans up the stack pointer
exit:
movl $1, %eax
movl $0, %ebx
int $0x80
print:
pushl %ebp
movl %esp, %ebp
movl $4, %eax
movl $1, %ebx
movl 12(%ebp), %ecx <- This is where the Seg Fault occurs according to GDB
movl 8(%ebp), %edx
int $0x80
popl %ebp
ret
.data
str1 : .ascii "String1\n"
len1 = . - str1
【问题讨论】:
-
感谢 Dark,我不知道如何修复 linux 代码中的回车和换行。有什么简单的技巧吗?
-
格式化工具栏上有一个按钮,或者:stackoverflow.com/editing-help
-
非常感谢先生。
-
我不明白问题的最后编辑。 64 位线程将具有 64 位堆栈,32 位线程将具有 32 位堆栈,而 16 位线程将具有 16 位堆栈。您只是无法在这些模式之间共享堆栈,因此您当前的代码只能在 64 位环境中运行。
-
其实我目前的代码只能在32位环境下工作。我现在不断发展的问题和问题是:我如何组装一个引导扇区程序,它将 CPU 从其启动模式(16 位实数)引导到 32 位模式,它可以识别所有外围设备的存在,最后到将运行所有进程的 64 位模式?显然,这必须是可行的,因为这就是操作系统的制作方式,但是我如何在一个包含所有模式代码的程序的范围内正确地进行转换?
标签: linux assembly x86 segmentation-fault runtime-error