汇编语言两数相乘

编制并调试另一个简单程序:从键盘读入两个一位数(操作人员按键时保证按下的是数字键),输出他们的积。我的程序如下,请问错在哪里?或者告诉我具体算法与需要注意的事项。
code segment
assume cs:code
start:
mov ah,1
int 21h
mov bl,al
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
mov ah,1
int 21h
mov bh,al
mov ah,2
mov dl,10
int 21h
mov ah,2
mov dl,13
int 21h
sub bh,30h
sub bl,30h
mov al,bh
mul bl
mov bl,al
mov cl,0fh
mov ah,0
div cl
mov dl,al
add dl,30h
mov ah,2
int 21h
and bl,0fh
mov dl,bl
add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start

先看看这个,还没看你的程序,可能就是BCD与ASCII运算的问题,你自己看了检查一下.有问题可以再讨论

十进制调整指令
80x86微型机提供了一组十进制调整指令,用来处理ASCII码和BCD码表示的数。

BCD码:
BCD(Binary Coded Decimal)是用二进制编码表示的十进制数(见表3.3),十进制数采用0~9十个数字,是人们最常用的。在计算机中,同一个数可以用两种BCD格式来表示:①压缩的BCD码 ②非压缩的BCD码

压缩的BCD码:
压缩的BCD码用4位二进制数表示一个十进制数位,整个十进制数用一串BCD码来表示。例如,十进制数59表示成压缩的BCD码为0101 1001,十进制数1946表示成压缩的BCD码为0001 1001 0100 0110。

非压缩的BCD码:
非压缩的BCD码用8位二进制数表示一个十进制数位,其中低4位是BCD码,高4位是0。例如,十进制数78表示成压缩的BCD码为0000 0111 0000 1000。

从键盘输入数据时,计算机接收的是ASCII码,要将ASCII码表示的数转换成BCD码是很简单的,只要把ASCII码的高4位清零即可。

压缩的BCD码调整指令
DAA和DAS指令完成加法和减法的调整功能。

DAA 加法的十进制调整(decimal adjust for addition)
执行操作:(AL)← 把AL中的和调整为压缩的BCD格式

DAS 减法的十进制调整(decimal adjust for subtraction)
执行操作:(AL)← 把AL中的差调整为压缩的BCD格式

DAA和DAS指令的调整方法如下:
执行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,
1.如果结果的低4位 (AL)0~3>9或AF=1,则(AL)←(AL)±06H,且AF置1;
2.如果结果的高4位 (AL)4~7>9或CF=1,则(AL)←(AL)±60H,且CF置1。

对上述方法,加法调整作+06H和+60H,减法调整作-06H和-60H。这两个调整的条件,如果满足其一,则±06H或±60H;如果同时满足,则±06H后,再±60H。

非压缩的BCD码调整指令
AAA 加法的ASCII调整(ASCII adjust for add)
执行操作:
(AL)← 把AL中的和调整为非压缩的BCD格式
(AH)←(AH)+ 调整产生的进位值

AAS 减法的ASCII调整(ASCII adjust for sub)
执行操作:
(AL)← 把AL中的差调整为非压缩的BCD格式
(AH)←(AH)- 调整产生的借位值

加法和减法的操作数可以直接使用ASCII码,而不必把高位0011清为0000,AAA和AAS指令就是专门为ASCII码操作数或非压缩BCD码操作数的加减法而设计的。

AAA和AAS的调整方法如下:
执行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,结果存放在AL寄存器中:
(1)如果(AL)0~3= 0~9,且AF=0,则(AL)4~7= 0,AF的值送CF;
(2)如果(AL)0~3=A~F,或AF=1,则(AL)←(AL)±06H,(AL)4~7= 0,(AH)←(AH)±1,AF的值送CF。
AAA和AAS指令除影响AF和CF标志外,其余标志位均无定义。

AAM 乘法的ASCII调整(ASCII adjust for mul)
执行操作:(AX)← 把AX中的积调整为非压缩的BCD格式

AAD 除法的ASCII调整(ASCII adjust for div)
执行操作:(AX)← AX中的被除数(非压缩的BCD格式)转化为二进制数

以上两条指令是专为非压缩的BCD码的乘除法而设计的,它们将乘法和除法的结果转换为非压缩的BCD码。

注意:AAM和AAD都只对AX寄存器中的数进行调整,它们只影响SF、ZF和PF标志位,其它标志位无定义。

AAM的调整方法为:
执行乘法指令(MUL)后,调整存放在AL寄存器中的乘积:
(AH)←(AL)/ 0AH的商
(AL)←(AL)/ 0AH的余数

AAM实际上是将两个一位数的非压缩BCD码相乘后得到的乘积进行二化十的转换,十位数放在AH中,个位数放在AL中,那么AX中就是乘积的非压缩BCD码。

注意:如果是两个ASCII码数相乘,要先将它们转换成非压缩BCD码。

AAD的调整方法为:
执行除法指令之前,对AX中的非压缩BCD码(被除数)执行:
(AL)←(AH)×10+(AL)
(AH)← 0

与其它调整指令不同的是,AAD用在DIV指令之前,即先将AX中的被除数调整成二进制数,并存放在AL中,再用DIV指令作二进制数的除法。AX中的被除数是二位非压缩BCD码,AH中的十位数乘10,再加上AL中的个位数,即转换为二进制数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-11-17
你这个程序在输出上有问题.我已经帮你搞定了,已经试验过了,可以运行,完全符合题意.
code segment
assume cs:code
main proc far
start:
push dx
mov ax,0
push ax
mov bx,0
mov ah,1
int 21h
mov bl,al
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h

mov ah,1
int 21h
mov bh,al
mov ah,2
mov dl,10
int 21h
mov ah,2
mov dl,13
int 21h

sub bh,30h
sub bl,30h
mov al,bh
mul bl

;mov bl,al ;这个地方两个数向乘的积在AX中保存着
mov bx,ax
call binidec
ret
main endp

binidec proc near
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
dec_div endp
binidec endp
code ends
end start本回答被提问者采纳
第2个回答  2007-11-17
用C语言 简单啊
第3个回答  2007-11-16
怎么看都太麻烦了 你可以省掉很多指令,加个mul 这只是我的建议,因为我不知道你是在什么软件上编制的..
相似回答