请写一个程序实现如下功能:把指定开始地址的内存区域作为存放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
;----------------------------------------------------;
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00