2016-05-03 39 views
-1

下面的程序工作得很好,但我需要了解到目前爲止我不明白的一個步驟。裝配分部 - MASM

先看看代碼:我會在問題所在的地方指出問題的評論。

.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

'edx = edx-edx',你認爲這樣的結果怎麼樣? –

回答

2

那麼,它是簡單的:DIV確實劃分EDX(位63-32)的64位的值:通過EBX(32位)操作數EAX(位31-0)。

subzeros edx

the DIV instruction的一般程序是

EDX(高32位):EAX(低32位)DIV SRC-操作數(32位)=> 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 
012的情況下

您將EAX設置爲miles,EBXgallons,然後通過sub edx,edx(將EDX設置爲0)將EDX重置爲零。所以,你必須

  • EAX =英里
  • EBX =加侖
  • EDX = 0

執行DIV EBX裝置分割EDX:EAX(64位)由EBX(32位)。因此,如果您不劃分64位值,則在執行DIV之前,必須將EDX設置爲0

如果EDX在劃分時不是0,那麼它將作爲64位(EDX:EAX)的一部分被32位(EBX)劃分。這會導致錯誤的結果。因此,在div ebx之前EDX被設置爲0,SUB EDX, EDX

我希望清除它。

+0

在編寫'edx:eax'時,總是先放高半。 –