我正在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的代码
提前致谢。
答案 0 :(得分:3)
保存前一帧指针并为新堆栈帧设置的函数序言应该是:
pushl %ebp
movl %esp,%ebp
你的顺序是相反的,所以当你的函数返回时,调用者的帧指针将是不正确的。
答案 1 :(得分:0)
返回值通常位于eax
,因此您需要将eax
设置为要在finish
中返回的内存开头的地址。
fyi:您不需要两次声明您的标签,只需要从C中访问的公共函数需要前导下划线