. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3数值显示,测试通过  [待解决] 回复[ 1次 ]   点击[ 246次 ]  
wrsg
[帖 主]   [ 发表时间:2019-08-25 14:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-21 12:54
assume cs:codesg,ds:datasg,ss:stack

datasg segment
        db 10 dup (0)
datasg ends

stack segment
        db 32 dup (0)
stack ends

codesg segment
  start:            mov ax,12666
                        mov bx,datasg
                        mov ds,bx
                        mov bx,stack
                        mov ss,bx
                        mov sp,20h
                        
                        mov        si,0
                        call dtoc        ;将下一地址入栈,占用栈一个位置,注意栈溢出
                        
                        mov dh,8
                        mov dl,3q
                        mov cl,2
                        call show_str
                                
                        mov ax,4c00h
                        int 21h
                        
        ;名称:dtoc
        ;功能:将word型数据转换成十进制字符串,字符串以0结尾
        ;参数:(ax)=word型数据,ds:si指向字符串首地址
        ;返回:无
        dtoc:            push ax
                        push bx
                        push cx
                        push dx
                        push si
                        push di
                        
                        mov di,0
                s:        mov dx,0        ;被除数高16位为0,低16位ax
                        mov bx,10d
                        div bx                ;商为ax
                        add dx,30H        ;余数+30H 对应ASCII码
                        push dx                ;入栈保存
                        inc di
                        
                        mov cx,ax
                        jcxz ok                ;若商cx为0跳出循坏
                        
                        jmp s
                        
                ok:        mov cx,di
                ok1:pop ax
                        mov ds:[si],ax
                        inc si
                        
                        loop ok1
                        
                        pop        di
                        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
                        
                        mov ax,0b800h
                        mov es,ax
                        mov bl,cl         ; 储存字体颜色
                        
                        mov al,160
                        mul        dh                 ;显示屏位置dh*160+dl*2
                        mov dh,0
                        add dl,dl
                        add ax,dx        
                        mov di,ax        ;显示屏位置dh*160+dl*2
                        
                        mov ah,bl        ;设置字体颜色
                        
        s0:                mov ch,0
                        mov cl,ds:[si]
                        jcxz s1                ;遇到0跳出循环
                        
                        mov al,ds:[si]
                        mov es:[di],ax
                        inc si
                        add di,2
                        jmp short s0
                        
        s1:                pop        di
                        pop si
                        pop dx
                        pop cx
                        pop bx
                        pop ax
                        ret
 
codesg ends
end start
wrsg
[第1楼]   [ 回复时间:2019-08-25 14:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-11-21 12:54
复制粘贴过来格式不是很友好,,,
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved