2013-05-02 55 views
0

我對程序集x86體系結構有疑問。如何在程序集x86中使用mod

INCLUDE Irvine32.inc 
.data 
day BYTE 0 
month BYTE 0 
year BYTE 0 

a BYTE 0 
y BYTE 0 
m BYTE 0 
count BYTE 0 

prompt1 BYTE "enter month: ",0 
prompt2 BYTE "enter day: ",0 
prompt3 BYTE "enter an year: ",0 
prompt4 BYTE " the day of the week is ",0 
.code 
main PROC 

mov edx, OFFSET prompt1 
call writeString 
mov eax, OFFSET month 
mov ecx, 19 
call readInt 
call crlf 

mov edx, OFFSET prompt2 
call writeString 
mov eax, OFFSET day 
mov ecx, 19 
call readInt 
call crlf 

mov edx, OFFSET prompt3 
call writeString 
mov eax, OFFSET year 
mov ecx, 19 
call readInt 
call crlf 

mov al, 14 
sub al, month 
mov bl, 12 
div bl 
mov a, al 
mov al, 0 

mov ah, year 
sub ah, a 
mov y, ah 
mov ah, 0 

mov bh, 12 
mul a 
add bh, a 
mov ch, 2 
sub bh, ch 
mov m, bh 
mov bh, 0 
mov ch, 0 

mov al, 31 
mul m 
mov ah, 12 
div ah 

mov bl, y 
mov bh, day 
add bh, y 

mov cl, y 
mov ch, 4 
div ch 
add bh, cl 

mov dl, y 
mov dh, 4 
div dh 
add bh, cl 
add bh, al 
mov al, 0 

mov al, 7 // mod 7 
div al 



    exit 
main ENDP 

END main 

所以我應該做的這些算術等式:

a = (14 - month)/12 
y = year - a 
m = month + (12 * a) - 2 
d = (day + y + y/4 - y/100 + y/400 + (31 * m/12)) % 7 

對於mod 7最後一個方程,我得到了一個錯誤,「整數溢出」,這是由於使用bl我想。

如果我做這樣的事情

mov ax, "thing in parenthesis" 
mov cl, 7 
div cl  

然後我會得到al是商,ah是餘數。

但我該怎麼辦mod而不必使用ax註冊?

回答

0

除以一個字節值,您將除以AX並將商存儲在AL中。因此,您需要確保商數符合8位,否則會出現您在問題中描述的錯誤。

完成此操作的一種方法是在分割前清除AH。即

MOV AH,0 

XOR AH,AH 

對於簽署師(IDIV)你會使用CBW中符號擴展ALAX

如果你的問題是如何解決你的問題,而不必碰AH,那麼答案是「你不能」。因爲AH仍然會被DIV指令修改(保留其餘部分),所以無論如何都沒有意義。

+0

將AH設置爲0後仍然出現相同的錯誤 – bluebk 2013-05-02 06:27:08

+0

您的代碼中有多個'div',因此您需要修復所有這些錯誤。 'div啊'顯然不得不改爲使用'ah'以外的另一個除數。 – Michael 2013-05-02 06:32:50