装配部门 - MASM

时间:2016-05-03 16:33:26

标签: assembly x86 masm masm32

以下程序完美无缺,但我需要了解到目前为止我还不了解的一个步骤。

首先查看代码:我会在问题所在的位置旁边将问题标注为评论。

.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

1 个答案:

答案 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) )。你有

  • EAX =英里
  • EBX =加仑
  • 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

我希望能够清除它。