【问题标题】:Nasm return structureNasm 返回结构
【发布时间】:2016-07-30 16:20:46
【问题描述】:

小作业问题。

我们有一些结构的 *.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 中编写 write "mima"。 我唯一的问题是,在找到 min 和 max 后,我无法将它们作为结构发送到我的“c”程序。我得到一些随机负数,而不是 -2 和 90。

我们被告知将 struct 发回就足够了。

 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             

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    返回短结构有两种约定。正如您所说,在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
    

    【讨论】:

    • 感谢您的回答。程序与 eax 一起工作。但是,它也适用于 leave mov [ebp-16], min mov [ebp-20], max ret。我找不到任何解释为什么。
    • 这只是偶然的,如果调用者碰巧在那个位置分配了返回缓冲区,而不关心eax返回。
    猜你喜欢
    • 2015-06-14
    • 2015-02-25
    • 2021-12-12
    • 1970-01-01
    • 2014-04-22
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多