gpt4 book ai didi

assembly - 如何打印MUL产品的输出?

转载 作者:行者123 更新时间:2023-12-02 21:34:01 24 4
gpt4 key购买 nike

我在汇编 (MASM) 中使用 MUL 来将两个整数相乘。

根据 MA​​SM 指令集文档,乘积存储在 EDX:EAX 中,即 EDX 和 EAX 寄存器的组合(如果我理解正确的话)。

所以我尝试先打印 EDX 寄存器的结果,然后再打印 EAX 寄存器的结果来打印整个数字。

但是当我得到一个据称超过 32 位(小数点后 10 位)的产品时,我得到了一个奇怪的答案。

例如 100000 * 100000 = 2141006540​​8 ,这是错误的。但对于小乘法,它是有效的。

这是汇编代码:

; MULTIPLY 
mov eax, var1 ; var1 and var2 from user input
mul var2
mov productResultEDX, edx
mov productResultEAX, eax


; PRINT RESULT
; mov edx, OFFSET productMsg
call WriteString
mov eax, productResultEDX
call WriteDec ; prints out EAX register data
;mov eax, productResultEAX
;call WriteDec

所有变量均声明为 32 位 DWORDS

我的做法是错误的吗?

最佳答案

我相信您正在使用尔湾图书馆?它无法打印出 64 位数字,至少我不记得它能够打印出来。

因此,除非您想编写自己的64位数字打印例程,否则只需使用c函数printf,masm32将其称为crt_printf

您可以创建一个 qword 变量来存储 edx:eax,也可以使用结构体。

include masm32rt.inc
include msvcrt.inc
includelib msvcrt.lib

BigNum struc
LoWord dd ?
HiWord dd ?
BigNum ends

.data
fmtqw1 db "100000 * 100000 = %llu",13, 10, 0
fmtqw2 db "400030 * 500020 = %llu",13, 10, 0

.data?
myqword dq ?
BigNumber BigNum <>

.code
start:

mov eax, 100000
mov ecx, 100000
mul ecx
mov dword ptr[myqword], eax
mov dword ptr[myqword + 4], edx
invoke crt_printf, offset fmtqw1, myqword

mov eax, 400030
mov ecx, 500020
mul ecx
mov BigNumber.LoWord, eax
mov BigNumber.HiWord, edx
invoke crt_printf, offset fmtqw2, BigNumber

inkey
invoke ExitProcess, 0
end start

64 bit mul results

关于assembly - 如何打印MUL产品的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21213611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com