;输出九九乘法表
assume cs:code,ds:data1,es:data2,ss:stack
data1 segment
db 512 dup (0)
data1 ends
data2 SEGMENT
db 1,2,3,4,5,6,7,8,9
data2 ends
stack segment
db 256 dup (0)
stack ends
code segment
start: mov ax,data2
mov es,ax
mov ax,data1
mov ds,ax ;用于存放i*j=k
mov ax,stack
mov ss,ax
mov si,0
mov di,0
mov bp,0
mov ax,00
mov dx,1 ;line
mov bx,0 ;
mov cx,0
assignment:
mov di,0 ;0021
mov bx,0
storage:
;002e
push ax
jmp firstaddress ;0030 00a2
cycle:
mov al,byte ptr es:[bp] ;乘数首地址 0025
multiplication:
mul byte ptr es:[di] ;0028
mov byte ptr es:[9],al ;002b
saveds:
push si
push ax
mov si,cx
;0033
mov al,byte ptr es:[di] ;di变化被乘数
add al,30h
mov ds:[si+bx+0],al
mov byte ptr ds:[si+bx+1],2ah
mov al,byte ptr es:[bp]
add al,30h
mov ds:[si+bx+2],al
mov byte ptr ds:[si+bx+3],3dh
mov al,byte ptr es:[9]
cmp al,10
jb savenum
call datoch
mov al,byte ptr es:[14]
mov byte ptr ds:[si+bx+4],al ;ds存放es[di]*es:[si]=es:[bp]
mov al,byte ptr es:[13]
mov byte ptr ds:[si+bx+5],al ;0055
mov byte ptr ds:[si+bx+6],00h
pop ax
pop si
jmp cycle2
savenum:
mov byte ptr ds:[si+bx+4],'0' ;ds存放es[di]*es:[si]=es:[bp]
mov al,byte ptr es:[9]
add al,30h
mov byte ptr ds:[si+bx+5],al ;0055
mov byte ptr ds:[si+bx+6],00h
jmp cycle2
cycle2:
add bx,7 ;0059
inc di
cmp di,dx ;005f
jnb display ;0061
jmp cycle ;
datoch:
push dx
push bx
push ax
mov dx,0
mov ax,0
mov al,byte ptr es:[9]
mov bx,10
div bx
add dl,30h
add al,30h
mov byte ptr es:[13],dl
mov byte ptr es:[14],al
pop ax
pop bx
pop dx
ret
display:
push ax
push bx
push dx
mov ax,0
mov bx,0
mov ah,02h ;0079
add dl,10
mov dh,dl
mov dl,00
mov bh,0
int 10h
pop dx
pop bx
pop ax
push ax
push dx
push bx
mov ax,7
mul dx
mov bx,ax
mov ax,'$'
mov ds:[si+bx-1],ax
mov dx,si
mov ah,09h
int 21h
pop bx
pop dx
pop ax
inc bp
inc dx ;line+1
cmp dx,9
ja return
jmp assignment
firstaddress:
push si
push ax
push dx
push bx
dec dx
mov ax,dx ;008a dx为行数
mov bx,7 ;
mul bx ;dx=0
mov word ptr es:[11],ax ;save ax
add cx,word ptr es:[11]
pop bx
pop dx
pop ax
pop si
jmp cycle ;0095
return: mov ax,4c00h
int 21h
code ends
end start