x86 GNU汇编程序奇怪的更改段错误

时间:2014-05-29 17:06:04

标签: linux assembly x86 segmentation-fault runtime-error

以下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

1 个答案:

答案 0 :(得分:1)

我猜你有64位机器,而你的程序显然是32位。

我有一台64位机器,如果我用这个命令编译它,它会失败,和你一样:

$ gcc -nostdlib test.s

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

$ gcc -nostdlib -m32 test.s

一切都很好。

请注意,您可能需要一些软件包才能在64位计算机(g++-multilib或他们现在称之为的任何内容)中编译32位程序。