При выполнении следующего кода в синтаксисе 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;
}
Makefile
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;
}