我就不废话了,下面直接给出汇编语言实现乘法口诀的代码,详细说明在请看代码注释。
;输出乘法口诀表
; 1*1=1
; 1*2=2 2*2=4
; 1*3=3 2*3=6 3*3=9
; 1*4=4 2*4=8 3*4=12 4*4=16
; 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
; 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
; 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
; 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
; 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
; 定义数据段
data segment
a db ?
b db ?
c1 db ? ; C是关健字不可以用作变量名
data ends
; 定义代码段
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
mov a, 1
lp2:
mov b, 1
lp1:
mov al, a
mul b ; a*b结果保存在AL中(b为字节,所以16位的乘积送到ax中)
mov c1, al ; 送入c1保存第一个结果
call disp ; 显示计算的结果
add b, 1
mov al, b
cmp al, a
jbe lp1 ; 如果b<=a,则转到lp1执行;否则换行
call dad ; 将光标移动到下一行的行首
add a, 1
cmp a, 9
jbe lp2 ; 如果a<=9,则转移到lp2
mov ah, 4ch ; 程序正常结束 大于九则结束
int 21h
; 子程序名:disp
; 功 能:打印2*3=6类似表达式
; 入口参数:
; 出口参数:无
disp proc
mov dl, b ; 输出存储单元b的值且转换成十进制
or dl, 30h
call dispCh
mov dl, '*' ; 输出一个‘*’号
call dispCh
mov dl, a ; 输出存储单元a的值且转换成十进制
or dl, 30h
call dispCh
mov dl, '=' ; 输出一个‘=’号
call dispCh
mov dl, c1 ; 把乘积的结果送入DL
cmp dl, 9
ja aa1 ; 如果结果大于9,则转移到aa1
or dl, 30h
call dispCh
mov dl, ' '
call dispCh
jmp over ; 跳转到结束
aa1:
mov bl, dl
mov dl, 0
aa3:
cmp bl, 10
jb aa2 ; bl < 10,则跳转
sub bl, 10 ; 主要是为了调整大于9的十进制数输出(例如25-10 DL=2 BL=5这样就可以输出结果)
inc dl ; 用dl来保存进位
jmp aa3 ; 再次比较是否大于十
aa2:
or dl,30h ; 先输出进位部分
call dispCh
mov dl, bl ; 输出最后的差
or dl, 30h ; 调整为十进制
call dispCh
mov dl, ' '
call dispCh
over:
ret
disp endp
; 子程序名:dad
; 功 能:将光标定位到下一行的开始
; 入口参数:无
; 出口参数:无
dad proc
push dx
push ax
mov dl, 0ah ; 换行
mov ah, 2
int 21h
mov dl, 0dh
int 21h
pop ax
pop dx
ret
dad endp
; 子程序名:dispCh
; 功 能:输出dl中的ascii码字符
; 入口参数:(dl)=将要输出的ascii码
; 出口参数:无
dispCh proc
push ax
mov ah, 2h
int 21h
pop ax
ret
dispCh endp
code ends
end start运行效果图:
