macOS上的堆栈预留大小

时间:2019-05-31 16:02:02

标签: macos assembly x86 memory-alignment callstack

我目前正在尝试在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

0 个答案:

没有答案