子程序代码:
stack segment
db 8 dup (0)
stack ends
show_str: push cx
push bx
push si
push di
push es
mov ax,0b800h
mov es,ax
mov al,0a0h # 一行160字节
dec dh # 如果需要在第n行开始显示,则前面的n-1行全部计入偏移量
mul dh # al * dh,计算行偏离
mov bx,ax # 将偏离量传入bx
# 以上四句计算行偏移
mov al,2 # 每一列2字节
mul dl # al * dl,计算列偏移
dec ax,2 # 在第n列开始显示,则前面n-1列全部计入偏移量
add bx,ax # 在第n行第m列显示,需要偏移:(n-1的行偏移) + (m-1的列偏移)
# 以上四句,前三句计算列偏移,第四句计算总偏移
mov di,0
mov al,cl # 颜色传入al
mov ch,0 # ch传0
s: mov cl,ds:[si] # 字符传入cl,因cl已经传入al,不必担心颜色数据被覆盖
jxcz ok # 判断是否已经到了字符的0字节尾部
mov es:[bx + di],cl # 字符传入
mov es:[bx + di + 1],al # 颜色传入
# 以上四句在需要显示的n行m列进行字符串及颜色处理
inc si # 字符串偏移自增
add di,2 # 处理字符串的偏移
jmp short s # 因没有利用loop,故用 jmp short 标号 进行转移
ok: pop es
pop di
pop si
pop bx
pop cx
ret
子程序代码:
stack segment
db 8 dup (0)
stack ends
divdw: push ax # 被除数低位压栈
mov ax,dx # 将被除数高位传入ax
mov dx,0
div cx # ax/cx,公式中的H/N
mov bx,ax # 描述性运算符int()处理
# 以上两句处理了公式int(H/N)部分
pop ax # 被除数低位出栈,此时dx中为rem(H/N),正好满足公式中[rem(H/N)*65536 + L]
div cx # (dx*16 + ax)/cx,公式中的[rem(H/N)*65536 + L]/N
mov cx,dx # 余数传给cx
mov dx,bx # 将之前的int(H/N)部分传给dx
ret
子程序代码:
dtoc: push ax
push si
push di
push cx
push dx
mov di,0
s0: mov cx,10d # 将10传入cx
mov dx,0
div cx
mov cx,ax # 商为0,则证明完成了求值
jxcz s1
add dx,30h # 将余数转换为ACSII
push dx # 转换完成的数据压栈
inc di
jmp short s0
s1: add dx,30h # 记录最后一个余数,并转化ACSII
push dx
inc di
mov cx,di # 将记录的数据位数传入cx,作为s2的循环次数
s2: pop ax # 将转换完的字符 出栈
mov ds:[si],al # ACSII 只占用了低8位,配合show_str中的: mov cl,ds:[si]
inc si
loop s2
pop dx
pop cx
pop di
pop si
pop ax
ret
show_str:在第一小节中已给出