小编Sei*_*zh7的帖子

为什么使用 %ebx 寄存器会导致我的汇编代码出现分段错误

我正在处理一小段 i386 汇编代码,并在使用 %ebx 寄存器时遇到分段错误。我希望能了解一些关于为什么会发生这种情况的见解。

我有一个非常简单的汇编函数的两个版本。该函数的目的是将两个整数参数相加。当我使用 %ecx 寄存器时,该函数可以正常工作。但是,当我切换到使用 ebx 寄存器时,会导致分段错误。这是两个版本的代码:

版本 1(导致分段错误):

.globl addArgs
.text
addArgs:
    movl 4(%esp), %eax
    movl 8(%esp), %ebx
    addl %ebx, %eax
    ret
Run Code Online (Sandbox Code Playgroud)

我缺少有关 ebx 寄存器的特定信息吗?

所以下面的版本可以完美运行。

版本 2(工作正常):

.globl addArgs
.text
addArgs:
    movl 4(%esp), %eax
    movl 8(%esp), %ecx
    addl %ecx, %eax
    ret
Run Code Online (Sandbox Code Playgroud)

我正在 32 位 x86 系统上编译我的代码并使用 GCC 进行编译。

在这种情况下,下面是使用该函数的 C 代码:

#include <stdio.h>

int addArgs();

int main(){
    int a = 1, b = 2;
    printf("%d\n",  addArgs(a, b));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是我编译它的方式:

.globl addArgs
.text
addArgs: …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly cpu-registers calling-convention

3
推荐指数
1
解决办法
92
查看次数

标签 统计

assembly ×1

c ×1

calling-convention ×1

cpu-registers ×1

x86 ×1