assembly - 程序集 x86 中的分段错误
问题描述
在以 at&t 语法运行以下代码时,我遇到了分段错误,而它应该打印了 3。我尝试在调用 bar 之前返回,它按预期工作。我认为调用 bar 后, esp 的值会发生变化。
我试图用汇编语言编写以下 C 代码:-
int foo () {
int a, b, c, d, e, f;
a = 0, b = 1, c = 2, d = 3;e = 5, f = 6;
bar(b, c, d, f);
return a + b + c;
}
int bar(int a, int b, int c, int d) {
int x, y, z, w;x = a, y = b, z = c, w = d;
return x + y + z + w;
}
生成文件
default:
rm -f assembly.o code.o
as -32 assembly.s -o assembly.o
gcc -m32 -c code.c -o code.o
gcc -m32 code.o assembly.o -o prog
./prog
装配体.s
.global foo
foo:
subl $24, %esp
movl $0, 20(%esp)
movl $1, 16(%esp)
movl $2, 12(%esp)
movl $3, 8(%esp)
movl $5, 4(%esp)
movl $6, (%esp)
subl $16, %esp
movl 16(%esp), %eax
movl %eax, 12(%esp)
movl 24(%esp), %eax
movl %eax, 8(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl 32(%esp), %eax
movl %eax, (%esp)
call bar
add $16, %esp
movl (%esp), %edi
movl 4(%esp), %esi
movl 8(%esp), %edx
movl 12(%esp), %ecx
movl 16(%esp), %ebx
movl 20(%esp), %eax
addl %ebx, %eax
addl %ecx, %eax
add $24, %esp
ret
bar:
movl 4(%esp), %eax
movl 8(%esp), %ebx
movl 12(%esp), %ecx
movl 16(%esp), %edx
add %ebx, %eax
add %ecx, %eax
add %edx, %eax
ret
代码.c
#include<stdio.h>
extern int foo();
int main(){
int a = foo();
printf("%d\n", a);
return 0;
}
解决方案
推荐阅读
- r - 故障排除警告消息,条件长度 > 1,仅使用第一个元素
- php - 1970 年 1 月 1 日的时间戳变为 -3600
- python - NGINX 和 Docker 中的 Gunicorn 中的权限错误:connect() 到 unix:/tmp/gunicorn.sock 在连接到上游时失败(13:权限被拒绝)
- c# - 在 JSON 响应中访问数组的问题
- c++ - C++中二维数组的大小
- javascript - 无法从循环内的文本框中传递数据
- terraform - 如何对外部程序隐藏 AWS 凭证?
- css - 图像最大宽度属性导致意外行为
- python - 为什么 datetime 在 Windows 上无法转换为时间戳 < 86400?
- python-3.x - 可以使用 subprocess.Popen 函数将字典作为参数发送吗?