ASM/NASM中MUL结果存入结构体异常:为何返回值全为0?
汇编乘法结果未写入结构体的问题解答
问题代码
NASM汇编实现
global mymul mymul: mov rax, rdi mul rsi ret
C测试代码
#include <stdio.h> typedef struct { unsigned long long high; unsigned long long low; } resmul; void mymul(unsigned long long, unsigned long long, resmul *res); int main() { resmul res; mymul(3, 6, &res); printf("mymul(3, 6); res.high=0x%llx, res.low=0x%llx\n", res.high, res.low); //预期输出:mymul(3, 6); res.high=0x0, res.low=0x12 return 0; }
问题原因
你的汇编代码仅完成了乘法运算,完全没有将运算结果写入第三个参数指向的resmul结构体:
- 按照x86-64 System V调用约定,第三个参数
resmul *res存储在RDX寄存器中,指向目标结构体的内存地址 mul rsi执行后,结果高位确实在RDX、低位在RAX,但代码直接ret返回,没有对RDX指向的内存做任何写入操作,结构体的high和low字段始终是初始的0值
修正后的汇编代码
global mymul mymul: mov rax, rdi ; 将第一个乘数移入RAX,作为MUL的默认操作数 mul rsi ; 执行无符号乘法,结果高位存RDX,低位存RAX mov [rdx].high, rdx ; 将高位结果写入结构体的high字段 mov [rdx].low, rax ; 将低位结果写入结构体的low字段 ret
内容的提问来源于stack exchange,提问作者1111 B
相关产品推荐
相关产品推荐

