从ASM返回int *

时间:2014-04-04 11:08:43

标签: c pointers assembly

我正在ASM中编写一个函数,它应该将(常量)值2复制到.data中声明的数组的每个索引中。我的代码编译,但我没有通过我的C程序获得任何输出。这是代码:

        .globl my_func
        .globl _my_func

my_func:
_my_func:
    movl    %esp,%ebp
    pushl   %ebp
    movl    $0,%ecx
    leal    array,%eax
    jmp     continue


continue:
_continue:
    movl    $2,array(%ecx,4)
    cmpl    $1024,%ecx
    jne     incr
    je      finish

incr:
_incr:
    addl    $4,%ecx
    jmp     continue


finish:
_finish:
    popl    %ebp
    ret

        .data

    .align 4
array:  .fill   1024

从这里调用:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

extern int* my_func();

int main(int argc, const char * argv[])
{
    int i = 0;
    int* a = my_func();
    for(i = 0; i < 1024/4; i++){
        printf("%d\n", a[i]);
    }

    return 0;
}

如前所述,程序会编译并运行,但主函数不会向终端输出任何内容。是的,我知道代码不是最优的 - 我目前正在学习计算机体系结构和ASM的入门课程,我只是检查指令和数据。

我正在使用LLVM5.1在带有OSX10.9的Intel Mac上汇编IA32的代码

提前致谢。

2 个答案:

答案 0 :(得分:3)

保存前一帧指针并为新堆栈帧设置的函数序言应该是:

pushl   %ebp
movl    %esp,%ebp

你的顺序是相反的,所以当你的函数返回时,调用者的帧指针将是不正确的。

答案 1 :(得分:0)

返回值通常位于eax,因此您需要将eax设置为要在finish中返回的内存开头的地址。

fyi:您不需要两次声明您的标签,只需要从C中访问的公共函数需要前导下划线