关于linux:x86 GNU汇编器奇怪的更改段错误

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


我猜您有一台64位计算机,而您的程序显然是32位。

我有一台64位计算机,如果用此命令编译它,它将失败,与您所在的行相同:

1
$ gcc -nostdlib test.s

但是,如果我编译一个32位可执行文件:

1
$ gcc -nostdlib -m32 test.s

一切都很好。

请注意,您可能需要一些软件包才能在64位计算机上编译32位程序(g++-multilib或目前称为它们的任何东西)。