纳斯姆回归结构

时间:2016-04-09 11:05:30

标签: assembly x86 nasm

小作业问题。

我们有* .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             

1 个答案:

答案 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