我正在处理一小段 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)