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

标签 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

最佳答案

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

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

$ gcc -nostdlib test.s

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

$ gcc -nostdlib -m32 test.s

一切都很好。

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

关于linux - x86 GNU 汇编程序奇怪的更改段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938907/

相关文章:

Windows 64 ABI,如果我不调用 Windows API,正确的寄存器使用?

assembly - 我的 memset 实现结果仅打印更改,而不是整个结果字符串

linux - 无法打印在 NASM 堆栈上推送的换行符

java - Xlib:使用 XAddToChangeSet 向保存集添加窗口在 Java/JNI 中不起作用

linux - Go:在 exec.Command 中使用字符串时出现奇怪的结果

c - bash : ./comp.out:权限被拒绝

algorithm - 什么是最有效的给出素数的算法,最高值(所有 32 位机器都可以处理)

linux - python在执行下面的代码时运行缓慢

assembly - 将寄存器设置为零有多少种方法?

c - 从 SSE vector 中提取标量值