注册 登录
编程论坛 汇编论坛

一个简单的99乘法表

神vLinux飘飘 发布于 2006-03-18 07:54, 5052 次点击

;九九乘法口诀表
;作者:神vLinux飘飘
stack segment stack
stack ends

data segment
author db "Write by vlinux$"
data ends

code segment
assume cs:code,ds:data,ss:stack
_main:
mov ch,1d
_main_next_1:
call _print_crlf
mov cl,1d
_main_next_2:
mov ah,0d
mov al,cl
call _print_int
mov dl,42
mov ah,2
int 21h
mov ah,0d
mov al,ch
call _print_int
mov dl,61
mov ah,2
int 21h
mov ah,0d
mov al,cl
mul ch
call _print_int
call _print_tab
mov dl,ch
inc dl
inc cl
cmp cl,dl
jne _main_next_2
inc ch
cmp ch,10d
jne _main_next_1
call _print_crlf
call _print_crlf
mov ax,data
mov ds,ax
mov dx,offset author
mov ah,9
int 21h
mov ah,4ch
int 21h

_print_int:
push ax
push bx
push cx
push dx
pushf
mov cx,10000d
mov bl,0d
_print_int_next_1:
cwd
div cx
push ax
push dx
cmp al,0d
jne _print_int_flag_1
cmp bl,0d
je _print_int_flag_2
_print_int_flag_1:
mov ah,2
mov dl,al
add dl,48
int 21h
mov bl,1d
_print_int_flag_2:
mov ax,cx
mov cx,10d
cwd
div cx
mov cx,ax
pop ax
pop dx
cmp cx,1d
jne _print_int_next_1
mov dl,al
add dl,48
mov ah,2
int 21h
popf
pop dx
pop cx
pop bx
pop ax
ret

_print_tab:
push ax
push dx
mov dl,9
mov ah,2
int 21h
pop dx
pop ax
ret

_print_crlf:
push ax
push dx
mov dl,10
mov ah,2
int 21h
pop dx
pop ax
ret
code ends
end _main

8 回复
#2
苦味酸2006-03-19 22:16

能把你这段程序的流程图参考一下么?
这样直接读代码很困难
联系方式:xia0tan2006@126.com

#3
Fudan_Men2006-04-04 14:53
问一下关于输出寄存器中的数字怎么输出啊?
#4
big_min2006-06-02 19:01

能不能将一些语句解释一下啊?我看不懂。请LZ或是高手们帮帮忙!

联系方式:big_min@sohu.com
QQ:395669069

#5
big_min2006-06-02 21:17
_print_tab:
push ax
push dx
mov dl,9
mov ah,2
int 21h
pop dx
pop ax
ret

_print_crlf:
push ax
push dx
mov dl,10
mov ah,2
int 21h
pop dx
pop ax
ret
最后这两段代码有什么用,代表什么意思?
#6
云中雾2006-06-04 10:15

慢慢研究一下

#7
ly2008boy2007-09-12 20:34
  搞个注释更完美..
#8
xieriguo2007-09-13 16:08
我也想看看注释
#9
succinum2014-06-01 12:36
;在屏幕上显示99乘法表
code segment
    assume cs:code
    _main:
            ;清空屏幕
            MOV AH,6
            MOV AL,0
            MOV CH,0
            MOV CL,0
            MOV DH,24
            MOV DL,79
            MOV BH,01110000B
            INT 10H
            ;置光标
            MOV AH,2
            MOV DH,0
            MOV DL,0
            MOV BH,0
            INT 10H
        
            mov ch,1d
    _main_next_1:
            call _print_nextline    ;输出换行
            mov cl,1d
    _main_next_2:
            ;输出被乘数
            mov ah,0d    ;ax高位清零
            mov al,cl   
            call _print_int
            
            ;dos功能调用,输出*号
            mov dl,42        
            mov ah,2
            int 21h
            
            ;输出乘数
            mov ah,0d
            mov al,ch   
            call _print_int
            
            ;dos功能调用,输出=号
            mov dl,61        
            mov ah,2
            int 21h
            
            mov ah,0d
            mov al,cl        ;ch总是乘数,cl总是被乘数
            mul ch
            call _print_int
            call _print_tab
            
            mov dl,ch
            inc dl
            inc cl
            cmp cl,dl        ;如果相等,乘数等于被乘数,跳出循环,换行
            jne _main_next_2
            inc ch
            cmp ch,10d        ;如果乘数之前是等于9的,跳出循环
            jne _main_next_1
            call _print_nextline
            call _print_nextline
               
            mov ah,4ch
            int 21h
            
    _print_int:            ;输出AX的数值,同时
            push ax
            push bx
            push cx
            push dx
            pushf        ;标志寄存器进栈
            mov cx,10000d    ;从万位依此输出
            mov bl,0d        ;bx低位清零
    _print_int_next_1:
            cwd        ;ax扩展为dx ax双字
            div cx    ;dx存放余数,ax存放商
            push ax
            push dx
            cmp al,0d        
            jne _print_int_flag_1
            cmp bl,0d   
            je _print_int_flag_2
    _print_int_flag_1:
            mov ah,2
            mov dl,al
            add dl,48
            int 21h
            mov bl,1d
    _print_int_flag_2:
            mov ax,cx   
            mov cx,10d
            cwd
            div cx
            mov cx,ax    ;cx变为原来的十分之一
            pop ax
            pop dx
            cmp cx,1d
            jne _print_int_next_1
            ;输出最后一个个位数
            mov dl,al
            add dl,48   
            mov ah,2
            int 21h
            popf
            pop dx
            pop cx
            pop bx
            pop ax
            ret
   
    _print_tab:    ;输出一个制表符
            push ax
            push dx
            mov dl,9
            mov ah,2
            int 21h
            pop dx
            pop ax
            ret
   
    _print_nextline:        ;进行换行
            push ax
            push dx
            mov dl,0dH
            mov ah,2
            int 21h
            mov dl,0AH
            mov ah,2
            int 21h
            pop dx
            pop ax
            ret
code ends
end _main
            
修改了一点点,增加了注释,希望能有所帮助。
1