. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10_3DW,求找茬  [待解决] 回复[ 1次 ]   点击[ 358次 ]  
lonelyhover
[帖 主]   [ 发表时间:2013-05-23 13:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29
assume cs:code
data segment
        db 10 dup (0)
data ends
code segment
start:        mov ax,12666
        mov dx,0
        mov bx,data
        mov ds,bx
        mov si,0
        call dtocdw        ;调用双字数据转换字符串
        
        mov dh,8
        mov dl,3
        mov cl,2        ;设置输出格式
        call show_str        ;调用字符输出

        mov ax,4c00h
        int 21h
;=========================================双字数据转换字符串        
dtocdw:        push ax
        push cx
        push dx
        push di
        push si        ;保护现场

        mov di,0        ;字符串长度计数器
chance:        ;转换
        mov cx,0ah        ;设置为以十进制转换
        call divdw        ;调用双字除法
        add cx,30h        ;转换为字符
        push cx        ;保存字符
        inc di        ;计数器加一
        mov cx,ax
        add cx,dx
        jcxz dtocdw_ok        ;判断完成
        jmp chance
dtocdw_ok:        mov cx,di        ;设置计数器
writ:        ;写入指定位置并整理格式
        pop [si]        
        inc si
        loop writ
        
        pop si
        pop di
        pop dx
        pop cx
        pop ax        ;恢复现场
        ret        ;返回
;==============================================双字除法
divdw:        push bx        ;保护现场

        mov bx,ax
        mov ax,dx
        mov dx,0h
        div cx        ;被除数高位除法
        push ax        ;保存高位除法商
        mov ax,bx        ;恢复被除数低位,高位为高位除法余数
        div cx        ;被除数低位除法
        mov cx,dx        ;以CX保存余数
        pop dx        ;恢复商的高位

        pop bx        ;恢复现场
        ret        ;返回
;==============================================字符输出
show_str:        push ax
        push bx
        push cx
        push si
        push es        ;保护现场

        mov ax,0b800h
        mov es,ax        ;定位显存
        mov al,0a0h
        mul dh
        mov bx,ax        ;设置行号
        mov al,2h
        mul dl                ;设置列号
        add bx,ax        ;设置显示位置基址
        mov al,cl        ;设置字体属性

show:        ;输出字符
        mov cl,[si]
        mov ch,0h
        jcxz show_str_ok        ;判定字符串结尾
        mov es:[bx],cl
        inc bx        ;显示字符
        inc si        ;指向下一字符
        mov es:[bx],al
        inc bx        ;设置字体属性
        jmp show        

show_str_ok: 
        pop es
        pop si
        pop cx
        pop bx
        pop ax        ;恢复现场
        ret        ;返回
code ends
end start
stop1204
[第1楼]   [ 回复时间:2013-05-24 10:52 ]   [引用]   [回复]   [ top ] 
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06
自己看吧, 你那个好像很长
assume cs:code
data segment
        db 10 dup (0)
data ends
code segment
start:        mov ax,12666
        mov dx,123        ;方便以后显示大于65525的数据,做16位除法运算,di为被除数高16位
        mov bx,data
        mov ds,bx
        sub si,si
        call dtoc
        mov dh,8
        mov dl,3
        mov cl,2
        call show_str
        mov ax,4c00h
        int 21h
;输出指定字符与颜色到指定位置
show_str:        
        push cx
        push dx        
        add dh,3
        mov al,0AH
        mul dh
        mov ah,0b8H
        mov es,ax        
        mov al,2
        mul dl
        mov si,ax
        sub bx,bx
show:
        push cx        
        mov al,[bx]
        sub ch,ch
        mov cl,al
        jcxz ok
        pop cx
        mov es:[si],al
        mov es:[si].1,cl;00000010b绿色
        inc si
        inc si
        inc bx
        jmp short show        
ok:
        pop dx
        pop cx                
        ret
;防止除法溢出,并保护子程序中将用到的寄存器
dtoc:
        push ax        
        push dx                
        push si
        push ax
        push bx
        push bp        
s:        
        push ax                
        mov bx,10        ;转化十进制,被除数-除数=余为要显示的字符串
        mov ax,dx        ;要计算被除数高16位
        sub dx,dx
        div bx                ;高16位结果的余数
        mov bp,ax        ;暂存高16位的商
        pop ax                ;还原被除数低16位
        div bx                ;(高16位余数+低16位原被除数)/n        得出商
        add dx,30H        ;ascii码
;判断跳转
        mov [si],dl        ;改变原字符串的字符,转化为要显示的十进制字符
        push dx
        mov dx,bp        ;还原高16位的商
        mov cx,ax
        jcxz o
        inc si
        jmp short s        ;循环至jcxz o指令跳转
;进行数值倒序,还原子程序中用到的寄存器,子程序运行结束
o:
        inc si
        mov cx,si
        sub si,si        ;归0
x:
        pop [si]
        inc si
        loop x
        pop bp
        pop bx
        pop ax
        pop si
        pop dx
        pop ax
        ret
code ends
end start
;debug调试时候如果要执行g命令请g 到第一个ret的位置(就是跳转到mov ax,4c00h指令的那一个ret)
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved