2016-05-03 9 views
-1

次のプログラムは問題なく動作しますが、これまで理解できていない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

まあ、それは簡単である:EBX(32ビット)のオペランドでEAX(ビット31-0):DIVは、EDX(ビット63-32)の64ビット値を分割し。

subzeros edx

the DIV instructionの一般的な手順は

EDX(上位32ビット)である:EAX(下位32ビット)DIV SRCオペランド(32ビット)=> EAX

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のあなたの場合にはEDX(32ビット)が

中(32ビット)と余り

EAXmiles,EBXgallonsに設定してから、をsub edx,edxにリセットします(EDXを0に設定)。だから、

  • EAX =マイル
  • EBX =ガロンEBX(32ビット)によってEDX:EAX(64ビット)を分割DIV EBX実行手段= 0

  • EDXを持っています。したがって、64ビット値を分割しない場合は、DIVの実行前にEDXを0に設定する必要があります。

    EDXは、分割時には0ではないため、64ビット(EDX:EAX)×32ビット(EBX)分割の一部として含まれます。これは偽の結果をもたらすでしょう。従ってEDXdiv ebxの前に0によってSUB EDX, EDXに設定されます。

    私はそれをクリアすることを望む。

  • +0

    'edx:eax'と書くときは、常にハイハーフを入れてください。 –