小作业问题。
我们有* .c文件,有一些结构
typedef struct{
int min;
int max;
} M;
M mima( int N, ...);
int main(){
M l = mima(5, 1, -2, 4 , 90, 4);
printf("mi = %d, ma = %d \n", l.min, l.max);
return 0;
}
我们必须在nasm写下写“mima”。 我唯一的问题是,在我找到min和max后,我无法将它们作为结构发送到我的“c”程序。而不是-2和90,我得到一些随机的负数。
我们被告知发回结构就足够了。
mov eax, (here is our min)
mov edx, (here is our max)
但不幸的是,它不起作用。
以下是我的asm文件的样子
BITS 32
section .text
global mima
mima:
push ebp
mov ebp, esp
start:
; doing magic
leave
ret
答案 0 :(得分:3)
有两种约定用于返回短结构。正如你所说的那样在edx
/ eax
中,或者像隐藏的第一个参数所指向的更大的结构一样。显然你被误导了你环境中使用的默认约定。必须更改调用者或被调用者以使其约定匹配。如果您使用的是gcc
,则会有一个-freg-struct-return
命令行开关,可以根据需要启用寄存器返回。您也可以更改装配面,这应该类似于:
mima:
push ebp
mov ebp, esp
start:
; doing magic
mov eax, [ebp+8] ; hidden arg pointing to return space
mov [eax], min ; fill in return values
mov [eax + 4], max
; must leave pointer in eax
leave
ret