assembly ASM/NASM -返回类型结构中穆尔的高低

vnjpjtjt  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(113)

第一个
目标是将第一个参数与第二个参数相乘,并将结果发送到最后一个参数第一个参数= RDI /第二个参数= RSI目标是将结果高/低发送到typestruct
我不明白为什么它给0的两个结果RAX和RDX应该返回,但我没有

jtw3ybtb

jtw3ybtb1#

你的mymul函数在C中声明为接受一个指针参数,它应该把结果存储在内存中,但实际上它把结果留在rdx:rax寄存器中,根本不把任何东西存储在内存中,完全忽略了指针。
第三个参数将在rdx寄存器中传递,这会使事情变得有点复杂,因为mul会覆盖它。

global mymul
mymul:
    mov rcx, rdx  ; save argument
    mov rax, rdi
    mul rsi
    mov [rcx], rdx
    mov [rcx+8], rax
    ret
2w3rbyxf

2w3rbyxf2#

您告诉编译器您的函数返回void,因此调用者不会查看RDX:RAX。
使用调试器和/或查看调用方中的asm;它将从堆栈中加载其未初始化的局部变量res,而未写入的堆栈内存恰好为零。
要在x86-64 SysV调用约定的RDX:RAX中正确声明一个返回的函数,返回一个结构,或者返回unsigned __int128(如果您使用GNU扩展)。

#include <stdio.h>
#include <stdint.h>

typedef struct {
        uint64_t low;         // low first, the low half of RDX:RAX
        uint64_t high;
} resmul;              // x86-64 System V will return this in RDX:RAX, like __int128

resmul mymul(uint64_t, uint64_t);  // your function doesn't look for a pointer in RDX

int main() {
    resmul res = mymul(3, 6);
    printf("mymul(3, 6); res.high=%#lx, res.low=%#lx\n", res.high, res.low);
    //mymul(3, 6); res.high=0x0, res.low=0x12
    return 0;
}

Godbolt,还包括编译为相同asm的函数的GNU C实现:
第一次

相关问题