x86 GNU Assembler Strange Change Seg Fault
以下x86汇编代码可以很好地汇编,并且可以在我学校的linux服务器上正常运行,但是将相同的代码应用于linux虚拟机(ubuntu 14.04)时,突然会导致分段错误。
堆栈约定是否更改,这是GNU汇编程序问题吗?我想念什么备忘录?
我正在64位计算机上运行,??这是构建OSBackbone 网的热身,所以我需要能够使用16位实型,32位受保护的和64位模式全部在同一个程序中。因此,我想我真正需要的是有关使所有模式在同一程序中有效的小细节。我知道在更改模式时会使用.code16 / 32/64,但是我想我所缺少的(而且在任何OS教程中似乎都找不到,是如何在64位体系结构上做到这一点的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| .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\
"
len1 = . - str1 |
- 谢谢Dark,我不知道如何从Linux代码中修复回车符和换行符。有一个简单的把戏吗?
-
在格式工具栏上有一个按钮,或:stackoverflow.com/editing-help
-
先生非常感谢您。
-
我不明白问题的最后编辑。 64位线程将具有64位堆栈,32位线程将具有32位堆栈,而16位线程将具有16位堆栈。您只是无法在这些模式之间共享堆栈,因此您当前的代码仅可在64位环境中工作。
-
实际上,我当前的代码只能在32位环境中工作。我现在正在发展的问题是:我如何组装一个引导程序程序,该程序将CPU从其启动模式(16位实数)引导到32位模式,从而识别所有外围设备的存在,最后64位模式将在其中运行所有进程?显然,这必须可行,因为这是操作系统的制作方法,但是如何在包含所有模式代码的一个程序的范围内正确进行转换呢?
-
@ patrickjp93:嗯!我认为这显然是不合时宜的。您真的应该问另一个问题。
-
我意识到这可能会带来其他问题,但是我确实需要从这里开始。当我必须一直向上遍历时,我不能仅仅忽略标准库(我认为),因此至少获得将处理器从64位模式更改为32位模式的答案将是有帮助的。
-
不幸的是,有关这些内容的现有指南仅上升到32位级别,甚至有些人甚至忘记了寄存器,RAM和硬盘/ CD驱动器之间字节序差异的事实。我什至搜索了Ubuntu的启动代码,但是找不到比内核更低的东西。
-
@ patrickjp93:如果您想完全了解Linux的启动代码,请进行询问。但是请不要在评论中添加新问题,而要创建一个新问题。评论是对当前问题的评论。请记住,StackOverflow不是讨论论坛,而是问
-
我猜您有一台64位计算机,而您的程序显然是32位。
我有一台64位计算机,如果用此命令编译它,它将失败,与您所在的行相同:
但是,如果我编译一个32位可执行文件:
1
| $ gcc -nostdlib -m32 test.s |
一切都很好。
请注意,您可能需要一些软件包才能在64位计算机上编译32位程序(g++-multilib或目前称为它们的任何东西)。
我猜您有一台64位计算机,而您的程序显然是32位。
我有一台64位计算机,如果用此命令编译它,它将失败,与您所在的行相同:
但是,如果我编译一个32位可执行文件:
1
| $ gcc -nostdlib -m32 test.s |
一切都很好。
请注意,您可能需要一些软件包才能在64位计算机上编译32位程序(g++-multilib或目前称为它们的任何东西)。
- 我确实有64位计算机,但是目前我正在学习如何编写功能全面的引导程序(为类构建OSBackbone),并且我需要能够在16位计算机之间进行转换位,32位和64位模式,而不会出现段错误。换句话说,我确实需要标准库EVENTUALLT,所以我不能只编译没有它的成品(我不认为...)。这里有人对此事有专家吗?
-
您要问的还不清楚。这回答了紧迫的问题-您的代码是32位x86程序集,因此需要针对32位x86模式进行编译。如果您需要在x64模式下编写更多的代码/端口,这似乎是一个不同的问题。编写引导区程序时,您也不希望/能够使用任何gcc启动或系统库代码。