assume cs:code,ds:data,ss:stack
data segment
num1 dw 1;乘数1
num2 dw 1;乘数2
num3 dw 1;乘积
char1 dw '*;乘号
char2 dw '=;等号
char3 dw 0ah,';空格
char4 dw 0dh,';回车
char0 dw 0,0,0,0,';储存数字转换成的字符串
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax;初始化
mov di,9;记录外层循环次数
s1:
mov cx,ds:[num1];内层循环次数由num1决定,如2*1这一行内部循环2次
s2:;进入内层循环
call instack;跳转到instack,用于将数字转换为字符输出
mov dx,[num1]
mov al,dl
mov ah,0;设置al为乘数1
mov dx,[num2]
mul dl;结果存入ax中
mov [num3],ax;将结果存入num3中
add [num3],30h;将num3转换为字符
mov ax,[num3]
mov [char0+4],ax;存入放字符的数据段中
call output;跳转到输出
inc [num2];乘数2自增1
loop s2;内层循环
lea dx,[char4]
mov ah,9
int 21h;一次内层循环完毕后,输出换行
mov [num2],1;乘数2变回1
dec di;记录外层循环的数字-1
mov cx,di;外层循环次数
inc [num1];乘数1自增1
loop s1;外层循环
mov ah,4ch
int 21h
instack:
push [num1];将乘数1入栈
mov si,0
add ss:[si],30h;乘数1转换为字符
pop [char0+0];将乘数1字符送入储存字符的数据段中
push [num2];乘数2同理
mov si,0
add ss:[si],30h
pop [char0+2]
ret;跳转回主程序
output:
mov si,0
lea dx,[char0+si]
mov ah,9
int 21h;输出乘数1的字符
lea dx,char1
mov ah,9
int 21h;输出乘号
mov si,2
lea dx,[char0+si]
mov ah,9
int 21h;输出乘数2的字符
lea dx,char2
mov ah,9
int 21h;输出等号
mov si,4
lea dx,[char0+si]
mov ah,9
int 21h;输出乘数2的字符
lea dx,char3
mov ah,9
int 21h;输出空格
ret;返回
code ends
end start