x86 GNU汇编奇怪的更改Seg错误

下面的x86汇编代码很好的组装,它用来在我学校的linux服务器上完美地运行,但是当我的linux虚拟机(ubuntu 14.04)使用相同的代码时,它突然间会导致分段错误

堆栈规范改变了,这是一个GNU汇编器问题吗? 我错过了什么备忘录? 我在一台64位的机器上运行,这是构build操作系统骨干的热身,所以我需要能够使用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 

Solutions Collecting From Web of "x86 GNU汇编奇怪的更改Seg错误"

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

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

 $ gcc -nostdlib test.s 

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

 $ gcc -nostdlib -m32 test.s 

一切都很好。

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