汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-12 11:58] 习题4.29

请写一个程序实现如下功能:把指定开始地址的内存区域作为存放16位字数组的缓冲区,一次顺序显示其值。具体 要求:开始地址由键盘输入,每次在一行以多种进制形式显示一个字单元的内容, 行首标上用十六进制表示的存储单元的段值和偏移地址。


答:
;----------------------------------------------------;
assume        cs:code,ds:data,ss:stack
data        segment
msg        db        'Enter Segvale:offset:$'
_addr        db        9 dup (0)
_err        db        'Input Error!$'
data        ends
stack        segment stack
        dw 128 dup (0)
stack        ends
code        segment
start:
        mov ax,data
        mov ds,ax
;显示提示信息
        mov dx,offset msg
        mov ah,9
        int 21h
;开始输入并剔除非法输入
        mov bx,offset _addr
        mov cx,8
input:        
        mov ah,1
        int 21h
        cmp al,0dh
        jz ok
        cmp al,'0'
        jb err
        cmp al,'9'
        jbe ol        
        cmp al,'A'
        jge da 
        cmp al,'a'
        jge xx
        jmp err
da:        
        cmp al,'F'
        jle ol
xx:        
        cmp al,'f'
        jle ol
        jmp err
mh:        
        mov dl,3ah
        mov ah,2
        int 21h
        jmp jx
ol:        
        mov [bx],al
        cmp cx,5
        jz mh
        jmp jx
;出错信息
err:        
        call crlf
        mov dx,offset _err
        mov ah,9
        int 21h
        jmp over
jx:        
        inc bx
        loop input
ok:
        call crlf
;将输入的ASCII码装入寄存器
;段值在DX,偏移在AX
        mov si,offset _addr
        mov cx,12
        xor dx,dx
load:        mov al,[si]
        cmp al,0
        jz ok1
        inc si
        cmp al,40h
        jb sz
        cmp al,47h
        jb zd
        cmp al,67h
        jb zx
sz:        sub al,30h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
        jmp jx1
zd:        sub al,37h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
        jmp jx1
zx:        sub al,57h
        mov ah,0
        shl ax,cl
        add dx,ax
        sub cx,4
jx1:        cmp cx,0fffch
        jnz load
        push dx
        xor dx,dx
        mov cx,12
        jmp load
ok1:
;重设DS和BX
;地址指向DS:BX存储单元。
        pop bx
        pop ds
;将DS:BX内容放入DX寄存器
        mov dx,[bx]
;开始显示
;十六进制
        call disphex
;十进制
        call dispdec
;八进制        
        call dispoct
;二进制
        call dispbin
;结束程序,返回dos
over:        mov ah,4ch
        int 21h
;子程序crlf
;功能:回车并换行
crlf        proc
        mov dl,0dh
        mov ah,2
        int 21h
        mov dl,0ah
        int 21h
        ret
crlf        endp
;子程序disphex
;功能:用十六进制显示DX内容
;入口参数:DX
;返回:无
disphex        proc uses dx
        mov cx,4
d1:        push cx
        mov cl,4
        rol dx,cl
        push dx
        and dx,0fh
        cmp dl,10
        jb d10
        add dl,37h
        mov ah,2
        int 21h
        jmp jx2
d10:        add dl,30h
        mov ah,2
        int 21h
jx2:        pop dx
        pop cx
        loop d1
        mov dl,'H'
        mov ah,2
        int 21h
        call crlf
        ret
disphex        endp
;子程序dispdec
;功能:用十进制显示寄存器DX的内容
;入口:DX
;出口:无
dispdec        proc uses dx
        mov ax,dx
        xor dx,dx
        mov bx,10
        mov cx,0
d2:        cmp ax,10
        jb ok2
        div bx
        add dl,30h
        push dx
        xor dx,dx
        inc cx
        jmp d2
ok2:        add al,30h
        push ax
        inc cx
d3:        pop dx
        mov ah,2
        int 21h
        loop d3
        mov dl,'D'
        mov ah,2
        int 21h
        call crlf
        ret
dispdec        endp
;子程序dispoct
;功能:用八进制显示DX的内容
;入口:DX
;出口:无
dispoct        proc uses dx
        mov bx,8
        mov cx,0
        mov ax,dx
        xor dx,dx
d3:        cmp ax,8
        jb ok3
        div bx
        add dl,30h
        push dx
        xor dx,dx
        inc cx
        jmp d3
ok3:        add al,30h
        push ax
        inc cx
d4:        pop dx
        mov ah,2
        int 21h
        loop d4
        mov dl,'Q'
        mov ah,2
        int 21h
        call crlf
        ret
dispoct        endp
;子程序dispbin
;功能:用二进制显示dx内容
;入口:ax
;出口:无
dispbin        proc 
        mov cx,16
        mov ax,dx
        xor dx,dx
d5:        rol ax,1
        adc dl,0
        push ax
        add dl,30h
        mov ah,2
        int 21h
        xor dx,dx
        pop ax
        loop d5
        mov dl,'B'
        mov ah,2
        int 21h
        ret
dispbin        endp
code        ends
end        start
;----------------------------------------------------;
评论次数(0)  |  浏览次数(344)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码