. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3数值显示  [已解决] 回复[ 2次 ]   点击[ 546次 ]  
tolearn
[帖 主]   [ 发表时间: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
;为什么只能显示第一个数!请大家帮我看看……
tolearn
[第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
tolearn
[第2楼]   [ 回复时间:2010-10-20 06:31 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-10-03 18:57
此贴由 贴主 于 [ 2010-10-20 06:31 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved