. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验十(三)加强版  [待解决] 回复[ 1次 ]   点击[ 383次 ]  
inrg
[帖 主]   [ 发表时间:2010-01-23 02:32 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22
assume cs:codesg

data segment
        db 17 dup (0)
data ends

codesg segment
start:
        nop
        mov ax, 34f6h
        mov cx, 16
        mov bx, data
        mov ds, bx
        mov si, 0
        call dtoc
        
        mov si, 0
        mov dh, 0
        mov dl, 0
        mov cl, 2
        call show_str
        
        mov ah, 1
        int 21h
        
        mov ah,4ch
        int 21h

;功能: 将word型数据变为表示其他指数的字符串,字符串以0结尾
;参数: (ax) = word型数据 (cx) = 数制 (ds:si) = 字符串首地址
dtoc:
        jmp dtoc0
        db '0123456789ABCDEF'
dtoc0:
        push di
        push dx
        push es
        push bx
        push si
        push ax
        mov di, offset dtoc
        sub dx, dx
        mov es, cx
dtoc1:
        mov cx, es
        call divdw
        mov bx, cx
        mov bl, cs:[bx + di + 3]
        mov ds:[si], bl
        inc si
        mov cx, ax
        jcxz dtoc2
        jmp dtoc1
dtoc2:
        mov ds:[si], byte ptr 0
        sub di, di
dtoc3:
        dec si
        mov cx, si
        sub cx, di
        jcxz dtoc4
        mov bl, ds:[di]
        mov bh, ds:[si]
        mov ds:[si], bl
        mov ds:[di], bh
        inc di
        mov cx, si
        sub cx, di
        jcxz dtoc4
        jmp dtoc3
dtoc4:
        pop ax
        pop si
        pop bx
        pop es
        pop dx
        pop di
        ret

;功能: 进行不会产生溢出的除法运算
;参数: (ax) = dword型数据的低16位
;           (dx) = dword型数据的高16位
;      (cx) = 除数
;返回: (ax) = 结果的低16位
;      (dx) = 结果的高16位
;      (cx) = 余数
divdw:
        push bx
        push bp
        mov bx, ax                ;暂存ax
        mov ax, dx
        sub dx, dx
        div cx                        ;ax=int(H/N) dx=rem(H/N)
        mov bp, ax
        mov ax, bx
        div cx
        
        mov cx, dx
        mov dx, bp
        pop bp
        pop bx
        ret

;功能: 在指定位置用指定颜色显示一个0结束的字符串
;参数: (dh) = 行号 (dl) = 列号 (cl) = 颜色 (ds:si) = 字符串首地址
show_str:
        push ax
        push es
        push bx
        push si
        mov ax, 0B800h
        mov es, ax
        mov al, 160
        mul dh
        sub dh, dh
        add ax, dx
        add ax, dx
        mov bx, ax
        mov al, cl
        sub cx, cx
show_str0:
        mov cl, ds:[si]
        jcxz show_str1
        mov es:[bx], cl
        mov es:[bx + 1], al
        inc si
        add bx, 2
        jmp show_str0
show_str1:
        pop si
        pop bx
        pop es
        pop ax
        ret
codesg ends
end start
abob
[第1楼]   [ 回复时间:2010-01-26 11:27 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
模块化编程~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved