|
主题 : : 实验10.3数值显示 [已解决] |
回复[ 2次 ]
点击[ 546次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-10-19 21:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-10-03 18:57 |
assume cs:code
;显示的数据
data segment
db 16 dup(0)
dw 123,54,13658,8966,2,65535,1024,10000
data ends
;栈
stack segment
dw 16 dup(0)
stack ends
;说明:将data段中的数据以十进制形式显示出来。
;参数:ds:si指向字符串的首地址。
;结果:显示字符串于行号8列号3颜色为绿色
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov di,0
mov bp,0
mov ax,stack
mov ss,ax
mov sp,20h
mov cx,8
s: mov ax,[si+10H]
;调用转变子程序
call dtoc
;设置行号、列号、颜色
push cx
sub cx,8
jcxz s0
jmp short s1
s0: mov dh,8
mov dl,3
;调用显示字符串子程序
s1: mov cl,2
call showstr
add si,2
pop cx
loop s
;程序返回
mov ax,4c00h
int 21h
;---- dtoc子程序 ----
;说明:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
dtoc: ;备份寄存器
push bx
push cx
push ax
push dx
push di
push si
;利用取余数得到十进制各位数值,再加上30H得到其对的字符ASCII码。
;再利用栈倒转其顺序。
mov bx,0ah
mov si,0
trans: mov cx,ax
jcxz take
sub dx,dx ;置0
div bx
add dx,30h
push dx
inc di ;获得入栈数目
jmp short trans
take: mov cx,di ;判断入栈数目
jcxz outpop
pop ax
mov byte ptr [si],al
dec di
inc si
jmp short take
outpop: ;还原寄存器
pop si
pop di
pop dx
pop ax
pop cx
pop bx
;
ret
;---- showstr子程序 ----
;说明:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围[0,24]),(dl)=行号(取值范围[0,79]),
; (cl)=颜色,ds:si指向字符串的首地址
;返回:无
showstr:;备份寄存器
push ax
push es
push dx
push cx
push si
push bx
;
mov si,0
mov bl,cl
mov cx,bp
jcxz init
jmp on
init: mov ax,0b800h
mov es,ax ;设置段地址
mov ax,160 ;一行有160个内存单元
mul dh
mov bp,ax ;获得指定行偏移地址
add dl,dl ;获得指定列偏移地址
sub dh,dh ;置dh为0
add bp,dx ;综合行列偏移地址
;
on: mov ah,bl ;获得指定颜色
mov cx,[si]
jcxz clear
mov al,cl ;获得字符
mov es:[bp],ax
inc si
add bp,2
jmp short on
;清空内存单元
clear: dec si
mov cl,[si]
jcxz outshow
sub [si],cl
jmp short clear
outshow:;还原寄存器
pop bx
pop si
pop cx
pop dx
pop es
pop ax
;
ret
;---------------------------
code ends
end start
;为什么只能显示第一个数!请大家帮我看看…… | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-10-20 06:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-10-03 18:57 |
一觉醒来,倍感清醒,问题也解决了!
assume cs:code
;显示的数据
data segment
db 16 dup(0)
dw 123,54,13658,8966,2,65535,1024,10000
data ends
;栈
stack segment
dw 16 dup(0)
stack ends
;说明:将data段中的数据以十进制形式显示出来。
;参数:ds:si指向字符串的首地址。
;结果:显示字符串于行号8列号3颜色为绿色
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov di,0
mov ax,0b800h
mov es,ax
mov bp,0
mov ax,stack
mov ss,ax
mov sp,20h
mov cx,8
s: mov ax,[si+10H]
;调用转变子程序
call dtoc
;设置行号、列号、颜色
push cx
sub cx,8
jcxz s0
jmp short s1
s0: mov dh,8
mov dl,3
;调用显示字符串子程序
s1: mov cl,2
call showstr
add si,2
pop cx
loop s
;程序返回
mov ax,4c00h
int 21h
;---- dtoc子程序 ----
;说明:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
dtoc: ;备份寄存器
push bx
push cx
push ax
push dx
push di
push si
;利用取余数得到十进制各位数值,再加上30H得到其对的字符ASCII码。
;再利用栈倒转其顺序。
mov bx,0ah
mov si,0
trans: mov cx,ax
jcxz take
sub dx,dx ;置0
div bx
add dx,30h
push dx
inc di ;获得入栈数目
jmp short trans
take: mov cx,di ;判断入栈数目
jcxz outpop
pop ax
mov byte ptr [si],al
dec di
inc si
jmp short take
outpop: ;还原寄存器
pop si
pop di
pop dx
pop ax
pop cx
pop bx
;
ret
;---- showstr子程序 ----
;说明:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围[0,24]),(dl)=行号(取值范围[0,79]),
; (cl)=颜色,ds:si指向字符串的首地址
;返回:无
showstr:;备份寄存器
push ax
push es
push dx
push cx
push si
push bx
;
mov si,0
mov bl,cl
mov cx,bp
jcxz init
jmp on
init: mov ax,160 ;一行有160个内存单元
mul dh
mov bp,ax ;获得指定行偏移地址
add dl,dl ;获得指定列偏移地址
sub dh,dh ;置dh为0
add bp,dx ;综合行列偏移地址
;
on: mov ah,bl ;获得指定颜色
mov cx,[si]
jcxz clear
mov al,cl ;获得字符
mov es:[bp],ax
inc si
add bp,2
jmp short on
;清空内存单元
clear: dec si
mov cl,[si]
jcxz outshow
sub [si],cl
jmp short clear
outshow:;还原寄存器
pop bx
pop si
pop cx
pop dx
pop es
pop ax
;
ret
;---------------------------
code ends
end start | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-10-20 06:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-10-03 18:57 |
此贴由 贴主 于 [ 2010-10-20 06:31 ] 结贴。 结贴原因:问题已解决 | | |
|