|
主题 : : 实验十(三)加强版 [待解决] |
回复[ 1次 ]
点击[ 383次 ] | |
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22 |
assume cs:codesg
data segment
db 17 dup (0)
data ends
codesg segment
start:
nop
mov ax, 34f6h
mov cx, 16
mov bx, data
mov ds, bx
mov si, 0
call dtoc
mov si, 0
mov dh, 0
mov dl, 0
mov cl, 2
call show_str
mov ah, 1
int 21h
mov ah,4ch
int 21h
;功能: 将word型数据变为表示其他指数的字符串,字符串以0结尾
;参数: (ax) = word型数据 (cx) = 数制 (ds:si) = 字符串首地址
dtoc:
jmp dtoc0
db '0123456789ABCDEF'
dtoc0:
push di
push dx
push es
push bx
push si
push ax
mov di, offset dtoc
sub dx, dx
mov es, cx
dtoc1:
mov cx, es
call divdw
mov bx, cx
mov bl, cs:[bx + di + 3]
mov ds:[si], bl
inc si
mov cx, ax
jcxz dtoc2
jmp dtoc1
dtoc2:
mov ds:[si], byte ptr 0
sub di, di
dtoc3:
dec si
mov cx, si
sub cx, di
jcxz dtoc4
mov bl, ds:[di]
mov bh, ds:[si]
mov ds:[si], bl
mov ds:[di], bh
inc di
mov cx, si
sub cx, di
jcxz dtoc4
jmp dtoc3
dtoc4:
pop ax
pop si
pop bx
pop es
pop dx
pop di
ret
;功能: 进行不会产生溢出的除法运算
;参数: (ax) = dword型数据的低16位
; (dx) = dword型数据的高16位
; (cx) = 除数
;返回: (ax) = 结果的低16位
; (dx) = 结果的高16位
; (cx) = 余数
divdw:
push bx
push bp
mov bx, ax ;暂存ax
mov ax, dx
sub dx, dx
div cx ;ax=int(H/N) dx=rem(H/N)
mov bp, ax
mov ax, bx
div cx
mov cx, dx
mov dx, bp
pop bp
pop bx
ret
;功能: 在指定位置用指定颜色显示一个0结束的字符串
;参数: (dh) = 行号 (dl) = 列号 (cl) = 颜色 (ds:si) = 字符串首地址
show_str:
push ax
push es
push bx
push si
mov ax, 0B800h
mov es, ax
mov al, 160
mul dh
sub dh, dh
add ax, dx
add ax, dx
mov bx, ax
mov al, cl
sub cx, cx
show_str0:
mov cl, ds:[si]
jcxz show_str1
mov es:[bx], cl
mov es:[bx + 1], al
inc si
add bx, 2
jmp show_str0
show_str1:
pop si
pop bx
pop es
pop ax
ret
codesg ends
end start | | |