【问题标题】:MASM function not returning the right valueMASM 函数没有返回正确的值
【发布时间】:2019-12-14 17:08:33
【问题描述】:

我需要调用从汇编代码中添加 3 个三个整数的函数; 整数本身在装配部分中设置;

一切看起来都正确,但是 masm 函数似乎没有返回正确的值。它存储在 eax 中,应该作为函数值返回,但是在运行 C 代码时,它不会 printf 任何内容,并且想要的值(在本例中为 15)实际上是程序的退出代码。那么有没有办法打印这个结果?

MASM 代码:

.586
.MODEL FLAT, C
.DATA
a1 DWORD 6
a2 DWORD 5
a3 DWORD 4
.CODE

func_asm PROC C

push a3
push a2
push a1

EXTRN numbers: proc
call numbers 
leave
ret
func_asm ENDP 
END

C 代码:

#include <stdio.h>

extern int __cdecl func_asm();
int numbers(int, int, int);

int main()
{
    printf("%d", func_asm());
}
int numbers(int a1, int a2, int a3)
{
    return a1 + a2 + a3;
}

【问题讨论】:

    标签: c assembly masm


    【解决方案1】:

    好的,事实证明,您必须在返回值之前推送 eax 在这之前我们需要自己创建一个栈,所以最终的代码是:

    .586
    .MODEL FLAT, C
    .STACK
    .DATA
     a1 DWORD 6
     a2 DWORD 5
     a3 DWORD 4
    .CODE
    func_asm PROC C
    
    push ebp
    mov ebp, esp
    
    push a3
    push a2
    push a1
    
    EXTRN numbers: proc
    
    call numbers 
    push eax
    leave
    ret
    func_asm ENDP
    
    END
    

    C 代码保持不变

    【讨论】:

    • 不,你不必push eax。您确实需要将 EBP 设置为 leave 的帧指针才能工作:它是 mov esp,ebp 的紧凑版本; pop ebp。那是你唯一的问题;临走前多加推总是没有意义的。
    • 哦,有道理。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多