求助:汇编输出99乘法表
汇编编写输出99乘法表的程序:输出是无限循环,而且是乱码,求各位大佬帮忙看一下是哪里有问题,万分感谢!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决定,如2*1这一行内部循环2次
s2:;进入内层循环
call instack;跳转到instack,用于将数字转换为字符输出
mov dx,
mov al,dl
mov ah,0;设置al为乘数1
mov dx,
mul dl;结果存入ax中
mov ,ax;将结果存入num3中
add ,30h;将num3转换为字符
mov ax,
mov ,ax;存入放字符的数据段中
call output;跳转到输出
inc ;乘数2自增1
loop s2;内层循环
lea dx,
mov ah,9
int 21h;一次内层循环完毕后,输出换行
mov ,1;乘数2变回1
dec di;记录外层循环的数字-1
mov cx,di;外层循环次数
inc ;乘数1自增1
loop s1;外层循环
mov ah,4ch
int 21h
instack:
push ;将乘数1入栈
mov si,0
add ss:,30h;乘数1转换为字符
pop ;将乘数1字符送入储存字符的数据段中
push ;乘数2同理
mov si,0
add ss:,30h
pop
ret;跳转回主程序
output:
mov si,0
lea dx,
mov ah,9
int 21h;输出乘数1的字符
lea dx,char1
mov ah,9
int 21h;输出乘号
mov si,2
lea dx,
mov ah,9
int 21h;输出乘数2的字符
lea dx,char2
mov ah,9
int 21h;输出等号
mov si,4
lea dx,
mov ah,9
int 21h;输出乘数2的字符
lea dx,char3
mov ah,9
int 21h;输出空格
ret;返回
code ends
end start
assume cs:code,ds:data,ss:stack
data segment
db 100 dup(0)
data ends
stack segment
dw 100 dup(0)
stack ends
code segment
;dl*dh=ax
show:
push si
push dx
push ax
;被乘数
mov si,0
add dl,48
mov ,dl
;乘号
inc si
mov byte ptr ,'*'
;乘数
inc si
add dh,48
mov ,dh
;等号
inc si
mov byte ptr ,'='
;前面 mul dl 的积 一直是存放在 ax 中,现在拿ax 除以10 ,如果商为0 说明只有一位数,直接转换成对应的 ascii码 存入到内存中
inc si
mov dl,10
div dl
;判断al商是否为0
cmp al,0
je zero
;如果这里被执行,说明商有2位数,这里只需要把个位转换就下了,十位ah ,永远都会被转换
add al,48
mov byte ptr ,al
inc si
;al商为零就跳转到这里来
zero:
add ah,48
mov byte ptr ,ah
;结果后面加个空格方便好看
inc si
mov word ptr ,''
add si,2
mov byte ptr ,'
;打印
mov dx,0
mov ah,9
int 21h
pop ax
pop dx
pop si
ret;返回到94行 inc dh
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,200
mov cx,9
mov dl,1;dl*dh-->dl*al
s0:
push cx
mov dh,1 ;dh=1
mov cl,dl ;cl=1
mov ch,0 ;ch=0
s1:
mov al,dh ;al=1
mul dl ;dh*dl
call show
inc dh ;dh++
loop s1
push dx
mov ah,2h
mov dl,0ah
int 21h
mov ah,2h
mov dl,0dh
int 21h
pop dx
inc dl;dl++
pop cx
loop s0
mov ax,4c00h
int 21h
code ends
end start
页:
[1]