以下程序完美无缺,但我需要了解到目前为止我还不了解的一个步骤。
首先查看代码:我会在问题所在的位置旁边将问题标注为评论。
.data
mesg byte "How many miles did you fill:", 0dh, 0ah, 0
mesg1 byte "How many gallons did you drive:", 0dh, 0ah, 0
mesg2 byte "Your car goes miles per gallon:", 0dh, 0ah, 0
miles DWORD ?
gallons DWORD ?
.code
main proc
mov EDX, OFFSET mesg
call writestring
call readint
mov miles, EAX
mov EDX, OFFSET mesg1
call writestring
call readint
mov gallons, EAX
mov EDX, OFFSET mesg2
call writestring
mov eax, miles
mov ebx, gallons
SUB EDX, EDX <-----what dose this do? because if i didn't do it, i get junk result
div ebx
call writeint
exit
main endp
end main
答案 0 :(得分:2)
嗯,很简单:DIV
将EDX的64位值(位63-32)除以:EAX(位31-0)由EBX
的操作数(32位) )。
sub
zeros edx
the DIV
instruction的一般程序是
EDX(更高的32位):EAX(低32位)DIV src-Operand(32位)=&gt; EAX(32位)和EDX中的余数(32位)
所以在你的情况下
mov eax, miles
mov ebx, gallons
SUB EDX, EDX <-----what dose this do? because if i didn't do it, i get junk result
div ebx
您将EAX
设置为miles
,将EBX
设置为gallons
,然后将EDX
重置为sub edx,edx
(将EDX设置为0) )。你有
执行DIV EBX
表示将EDX:EAX
(64位)除以EBX
(32位)。因此,如果您没有划分64位值,则必须在执行0
之前将EDX设置为DIV
。
如果EDX
在除法时不是0
,它将作为64位(EDX:EAX)的一部分包含在32位(EBX)除法中。这会产生错误的结果。因此EDX
之前0
的{{1}}设置为SUB EDX, EDX
。
我希望能够清除它。