我目前正在尝试在macOS 10.13.6中运行某些程序集。
我要达到的目的是获得两个输入,然后从第二个输入中减去第一个输入,然后打印结果。
所以...我正在尝试在python中做类似的事情:print -input() + input()
。通过与另一个C对象文件链接,我依靠输入并打印到libc。
我不明白的是,当我将堆栈保留大小从8更改为4时,程序崩溃了。
下面是有效的汇编代码:
.section __TEXT,__text
.globl _main
_main:
push %ebp
mov %esp, %ebp
subl $8, %esp
call _input
neg %eax
mov %eax, -4(%ebp)
call _input
add -4(%ebp), %eax
push %eax
call _print_int_nl
add $4, %esp
mov $0, %eax
leave
ret
下面是不起作用的代码。
.section __TEXT,__text
.globl _main
_main:
push %ebp
mov %esp, %ebp
subl $4, %esp
call _input
neg %eax
mov %eax, -4(%ebp)
call _input
add -4(%ebp), %eax
push %eax
call _print_int_nl
add $4, %esp
mov $0, %eax
leave
ret
如您所见,除了堆栈保留大小,没有其他修改。
这是我要链接的C文件:
#include <stdio.h>
void print_int_nl(int x) { printf("%d\n", x); }
int input() {
printf("In input...\n");
int i;
scanf("%d", &i);
return i;
}
我目前正在通过以下方式进行编译/组装/链接:
$ clang -c -arch i386 runtime.c
$ as -arch i386 example.s -o example.c
$ ld example.o runtime.o -lc -arch i386
$ ./a.out