TA的每日心情 | 开心 2018-10-31 14:26 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
高级会员
- 积分
- 1019
|
assume cs:code, ds:data
data segment
db 10 dup(0)
dw 123, 12666, 1, 8, 3, 38
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0 ; 字符串的首地址
mov bx, 0aH; 待转换数据的首地址
mov di, 0 ; 待转换数据的相对bx偏移地址
mov cx, 6 ; 6个待显示数据
mov dh, 4 ; 从第4行开始逐行显示数据
mov dl, 0 ; 从第0列开始显示每行数据
trans:
push cx
push dx
mov dx, 0 ; 高16位设为0存到dx
mov ax, [bx][di]; 数据存到ax,当作低16位
call dtoc ; 数据转化为ASCII的10进制
mov cl, 2 ; 字体显示为绿色
pop dx
call show_str ; 显示数据的ASCII
add di, 2 ; 下一个数据
inc dh ; 行数+1
pop cx
loop trans
mov ax, 4c00H
int 21H
; 子程序dtoc
dtoc:
push bx
push cx
push dx
push si
mov bx, 0 ; 记录数字位数
s0:
mov cx, ax ; 判断ax是否为0
jcxz ok ; 为0则结束转换
mov cx, 10 ; 除数为10
call divdw ; 防溢出的除法
add cx, 30H ; 余数转换为ASCII
push cx ; 余数入栈
inc bx ; 数字位数+1
jmp short s0
ok:
mov cx, bx
c2m:
pop bx
mov [si], bl ; 转换好的数据存到字符串中
inc si
loop c2m
mov byte ptr [si], 0 ; 字符串结束标志为0
pop si
pop dx
pop cx
pop bx
ret
; 子程序divdw
divdw:
push bx
mov bx, ax ; 低16位L暂时存在bx
mov ax, dx ; 高16位H送到ax
mov dx, 0
div cx ; H/N
push ax ; int(H/N)入栈
mov ax, bx
div cx ; [rem(H/N)*65536+L]/N
mov cx, dx ; 余数送到cx
pop dx ; int(H/N)出栈
pop bx
ret
; 子程序show_str
show_str:
push ax
push bx
push bp
push cx
push si
push di
push es
mov bl, cl ; 字体颜色存在bl中
mov ax, 0b800H
mov es, ax ; 显示缓冲区的段地址存在es
mov ax, 0a0H
mul dh ; 计算第n行的首地址
mov bp, ax ; 将第n行的首地址存在bp
mov ax, 2
mul dl ; 计算第m列的偏移地址
mov di, ax ; 将第n列存在di
ctom:
mov ch, 0 ; 判断字符串是否到了结尾
mov cl, [si]
jcxz exit ; 结尾则退出
mov es:[bp][di], cl ; 存储字符的ASCII
inc di
mov es:[bp][di], bl ; 存储字符的属性
inc si
inc di
jmp short ctom
exit:
pop es
pop di
pop si
pop cx
pop bp
pop bx
pop ax
ret
code ends
end start
|
|