我就不废话了,下面直接给出汇编语言实现乘法口诀的代码,详细说明在请看代码注释。
;输出乘法口诀表 ; 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
运行效果图: