2013-05-02 47 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