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
小作业题。
我们有具有某种结构的 *.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