2017-11-11 15 views
0

次の問題があります: 小さな数値を大きな数値に分割しようとすると商が非常に高くなり、なぜ理解できません。ここで私は1から5までを分割しようとしているプログラムがあり、結果は256です(変数 'a'と 'b'はdb型でなければなりません) 誰かが私を助けることができますか?事前にありがとうは大きな数値に小さな数値を割り算すると商が得られません0

.model small 
afisareanr macro nr 
local m11 
local m 
xor ax, ax 
mov ax, nr 
push ax    
mov si, 10   
mov di, 5   

mov dx, 0   
cmp ax, 0   
jge m    
neg ax    

m:div si    
add dl, 30h   

mov s[di],dl   

xor dx,dx   
dec di    
cmp ax, 0   

jne m    

pop ax    

cmp ax, 0   
jge m11    
mov s[di], '-'  

m11: 
mov ah, 9   
lea dx, s 
int 21h 
endm 

.stack 
.data 
a db 5 
b db 1 
s db 6 dup(" "), '$' 

.code 
mov ax, @data 
mov ds, ax 

xor ax, ax 
xor bx, bx 
mov al, b 
idiv a 
mov bx, ax 
afisareanr bx 

mov ax, 4c00h 
int 21h 

end 

答えて

1

の重複しているように見えるすべてのものを(やや特定し、それが良いだまされやすい人を探しよりも私にとっては簡単です答え、質問に「DIVが動作しない理由を」他人マーク場合は回答を削除します1つの良い)。

mov al, b  ; AL = b (1) .. and i prefer squared bracket Intel style 
       ; like mov al,[b] - to see easily memory is accessed 
idiv a 

は今、これはあなたが、これはIIRC構文エラーになりTASM「理想的な」モードでは、MASMの気まぐれモードでTASMを使用しているという理由だけで、エラーなしでコンパイルなっている(〜1994年から1999年にTASMを使用しなかったので、Iそれを間違って覚えているかもしれませ

アセンブリでは、経験豊富なプログラマーは、ソースを非常に正確で明確にすることを希望しています。すなわち、idiv byte ptr [a]は、ソースを読み込み、バグを探しやすくなります。

バイトの値5によってidivが実行されるように。あなたがIDIV descriptionをチェックする場合は、あなたがax/"r/m8"バリアントを使用しているので、結果はal(商)とah(余り)に格納されていることを、認識することができるはずです。

1/5 = 0、余り1 ...のでal = 0, ah = 1。しかし、つまり、は16ビットレジスタ全体として値0100h = 256を含むようになりました。

mov bx, ax 

そして、ここでbxに格納 印刷 を取得しているものと思います。 (印刷は醜いマクロ、私は個人的にサブルーチンとしてコードにそのマクロを移動することを好むとすることを使用して、次の行で行われているというcallいる...しかし、あなたはちょうどそう基本的に一瞬フォーカスのために、ASMで今すぐ開始ように見え、マクロコードをサブルーチンに移動するのは簡単ですが、asmについて何も知らなければ間違ってしまう可能性があります)。あなたはTASMがインストールされている場合

ところで、あなたはまた、TD(ターボデバッガ)を持っています。それを使用して、各命令の後にCPUで何が起きているかを自分で調べます。 ASMの学習ははるかに簡単です。

+0

どうもありがとう、私は何が起こっているかを理解し、どのように256が表示され、そうあなたは私が初心者だと右が、私たちは大学でのasmを学ぶために始めています。 –

+0

除算のための正規のdup-targetsを見つけるには、[x86タグwiki](https://stackoverflow.com/tags/x86/info)で 'idiv'を検索してください。それが私がFAQセクションを追加した理由の一部です。 (ここで問題となっているのは、残余が配当の上半分をクリアできないのではなく、残りがAHになることを認識していないからです。しかし、マイケルの答えは8ビット別の質問と同じ答えです。)とにかく、この回答を削除することはお勧めできません。 –