|
主题 : : 10.3 帮忙看看 一闪而过 谢谢 [待解决] |
回复[ 3次 ]
点击[ 381次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-01-01 20:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12 |
;dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
; 返回:无
;应用举例:将数据12666以1进制的形式在屏幕的8行3列,用绿色显示出来。在现实时我们调用本次实验中的第一个子程序show_str
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c0h
int 21h
dtoc:
push ax
push bx
push cx
push dx
push si
xor di,di
xor bx,bx
s0:
mov dx,0
mov bx,10
div bx;dx存放余数 ax存放商
add dx,30
push dx
inc di;做计数用
;需要处理一个循环判定
mov cx,ax
jcxz quit
jmp short s0
mov cx,di
quit1:
pop bx
mov ds:[si],bl
inc si
loop quit1
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_str:
;保护现场
push ax
push bx
push cx
push dx
push si
push di
;计算显示位置,最终ax存放最终显示位置
mov ax,0
sub dh,1
mov al,dh
mov ah,160
mul ah
mov dh,0
mov bx,ax
sub dl,1
mov al,dl
mov ah,2
mul ah
add ax,bx
;准备显示字符串
mov bx,0b800h
mov es,bx
mov di,ax
xor bx,bx
mov bl,cl
;设置字符以及字符属性
s1:
mov ch,ds:[si];ch存放字符
mov es:[di],ch
mov es:[di+1],bl;bl存放字符数形
mov cl,0
jcxz quit2
inc si
add di,2
jmp short s1
;现场恢复
quit2:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
一闪而过 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-01-02 10:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
mov ax,4c0h ;4c0h ≠ 4c00h
int 21h | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-01-02 11:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-06 11:12 |
谢谢
经过dubug单步跟踪发现有两个点错了,现把修改过后的发上来
谢谢 masmmaster
;dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
; 返回:无
;应用举例:将数据12666以1进制的形式在屏幕的8行3列,用绿色显示出来。在现实时我们调用本次实验中的第一个子程序show_str
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push ax
push bx
push cx
push dx
push si
xor di,di
xor bx,bx
s0:
mov dx,0
mov bx,10
div bx;dx存放余数 ax存放商
add dx,30h
push dx
inc di;做计数用
;需要处理一个循环判定
mov cx,ax
jcxz quit
jmp short s0
quit:
mov cx,di
so:
pop bx
mov ds:[si],bl
inc si
loop so
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_str:
;保护现场
push ax
push bx
push cx
push dx
push si
push di
;计算显示位置,最终ax存放最终显示位置
mov ax,0
sub dh,1
mov al,dh
mov ah,160
mul ah
mov dh,0
mov bx,ax
sub dl,1
mov al,dl
mov ah,2
mul ah
add ax,bx
;准备显示字符串
mov bx,0b800h
mov es,bx
mov di,ax
xor bx,bx
mov bl,cl
;设置字符以及字符属性
s1:
mov ch,ds:[si];ch存放字符
mov es:[di],ch
mov es:[di+1],bl;bl存放字符数形
mov cl,0
jcxz quit2
inc si
add di,2
jmp short s1
;现场恢复
quit2:
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
标注1:quit 陷入死循环,因为jcxz quit
jmp short s0
mov cx,di
跳过了对cx 的赋值
标记2: 30 为30h
还有三拉:4c00h | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-01-02 23:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|