2017-11-11 119 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不工作」的問題,但有些具體的回答是不是搜索好欺騙我更容易(如果別人標記將刪除答案一個好)。

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 

現在,這是越來越不只是因爲你是在MASM怪癖模式下使用TASM,在TASM「理想」的模式,這將是語法錯誤IIRC錯誤編譯(的確在1994 - 1999年〜TASM使用,所以我可能記得它錯了)。

問題是,目前還不清楚,什麼是數據的大小。在裝配有經驗的程序員更喜歡源非常精確和大約意圖明確,即idiv byte ptr [a],這使得讀取源,尋找漏洞要容易得多。

這樣idiv按字節值5被執行。如果您要檢查IDIV description,那麼您應該能夠識別出您正在使用ax/"r/m8"變體,因此結果將存儲在al(商)和ah(其餘部分)中。

1/5 = 0,餘數1 ...所以al = 0, ah = 1。但這意味着,整個16位寄存器的ax現在包含值0100h = 256

mov bx, ax 

你猜怎麼着是越來越 印刷 存入bx這裏。 (打印是通過下一行使用那個醜陋的宏完成的,我個人更喜歡將該宏作爲子程序移動到代碼中,而不是像call那樣......但它看起來像你剛剛開始用asm開始,所以目前專注於基礎知識,將宏代碼移動到子例程很簡單,但如果您不瞭解asm,可能會出錯)。

順便說一句,如果你安裝了TASM,你也有TD(Turbo Debugger)。用它來看看你自己,看看每條指令後CPU中發生了什麼。這使得學習ASM變得更容易。

+0

非常感謝你,我瞭解正在發生的事情以及如何出現256,是的,你是對的,我是新手,我們剛剛開始在大學學習。 –

+0

要查找劃分的規範複製目標,請查看[x86標記wiki](https://stackoverflow.com/tags/x86/info)並搜索「idiv」。這是我添加FAQ部分的原因之一。 (嗯,這不是一個確切的*重複的,因爲這裏的問題並沒有意識到剩下的是AH,而不是沒有清除上半部分的股息,但是Michael對鏈接dup的回答是8位操作數大小劃分確實提到了它是如何工作的部分。不同的問題相同的答案。)無論如何,我不會建議刪除這個答案,這很好。 –