Nasm return 结构

Nasm return structure

小作业题。

我们有具有某种结构的 *.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             

return短结构有两种约定。如您所说,在 edx/eax 中,或者像更大的结构,在隐藏的第一个参数指向的内存中。显然,您对环境中使用的默认约定有误导。必须更改调用者或被调用者,以便它们的约定匹配。如果您使用 gcc,则有一个 -freg-struct-return 命令行开关可以根据需要启用寄存器 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