花了三个多小时写出来的东西,真费劲。。。接下来就是本书的两个课程设计之一。
assume cs:code
data segment
db 'Welcome to masm!',0
data ends
numberdata segment
dw 123,12666,1,8,3,38
numberdata ends
code segment
start:
;测试显示函数
mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
;测试除法
mov ax,0FFFFH
mov dx,0FFFFH
mov cx,0FH
call divdw
;测试数据转字符
mov ax,data
mov ds,ax
mov si,0
mov ax,numberdata
mov es,ax
mov ax,es:[0]
call dtoc
mov ax,4c00h
int 21h
dtoc: ;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=word型数据
; ds:si指向字符串首地址 (‘0’:30H,‘9’:39H)
push bx
push cx
push si
mov dx,0
k:
mov cx,ax
jcxz r
mov cx,10
call divdw
mov bx,30H
add bx,cx
mov ds:[si],bx
inc si
loop k
r:
pop si
pop cx
pop bx
ret
divdw: ;功能:进行不会产生溢出的除法运算,被除数为dword型
; 除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push bx
push dx
push di
push si
;先算00ax/cx商si余数di,再算00dx/cx商bx余数为dx,然后算dxdi/cx余数dx
mov bx,dx
mov dx,0
div cx
mov di,dx;余数最大为cx-1
mov si,ax;商最大为 0000 FFFF
mov ax,bx
mov dx,0
div cx ; bx00/cx
mov bx,ax;商最大为 0000 FFFF
;余数dx最大为 cx-1
mov ax,di
div cx ; dxdi/cx
add si,ax;商最大为 0000 FFFF, si不可能溢出
mov cx,dx
mov dx,bx
mov ax,si
pop si
pop di
pop dx
pop bx
ret
show_str: ;功能: 在指定的位置,用指定的颜色,
; 显示一个用0结束的字符串
;参数: (dh)=行号(0~24),(dl)=列号(0~79),
; (cl)=颜色,ds:si字符串首地址
;返回:无
push ax
push bx
push cx
push dx
push es
push si
;确定输出第一个偏移位置bx
mov ax,0B800H
mov es,ax
mov al,dh
mov ah,160
mul ah
mov dh,0
add ax,dx
add ax,dx
mov bx,ax
mov ah,cl ;颜色保存在高位
mov ch,0
s:
mov cl,ds:[si]
jcxz ok
mov al,cl
mov es:[bx],ax
add bx,2
inc si
jmp short s
ok:
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start