焚海拦江 发表于 2020-12-6 17:13:41

求助:汇编输出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

xia米丶不吃鱼 发表于 2020-12-6 21:48:09

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]
查看完整版本: 求助:汇编输出99乘法表