- 实验名称:实验五 分支与循环程序设计
二、实验内容:从键盘输入一个四位的16进制数(其中字母为大写),将其转化为二进制数提示输出。
- 实验过程:
源代码:
data segment
buff1 db 'Please input a number(H):$'
buff2 db 10,?,10 dup(?),13,10
buff3 db 'The consequent is:$'
data ends
code segment
assume cs:code,ds:data
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
call tips1 ;调用第一个字符串,提示用户输入
call input1 ;调用程序,将数字输入进缓冲区保存
call get4h ;将缓冲区的ASCII码转换成实际的二进制
call tips2 ;调用第三个字符串,显示结果
call output ;将缓冲区的二进制转换成ASCII码输出
mov ah,4ch
int 21h
ret
main endp
tips1 proc near
mov dx,offset buff1
mov ah,9
int 21h
ret
tips1 endp
tips2 proc near
mov dx,offset buff3
mov ah,9
int 21h
ret
tips2 endp
input1 proc near
lea dx,buff2
mov ah,0ah
int 21h
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
ret
input1 endp
get4h proc near
lea si,buff2+2 ;将第二个字符串的首地址给si寄存器保存
mov bx,0 ;用bx当作计数器和相对偏移量
input:
mov al,byte ptr[si+bx]
cmp al,30h
jl exit
cmp al,39h
jle dig ;>='0'&&<='9'
cmp al,41h ;<'A',exit 判断输入的合法性
jl exit
cmp al,46h ;>='A'&&<='F' 如果是0~9,就进入dig,如果是A~F就进入hex
jle hex
jmp exit
dig:
sub al,30h
mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值
jmp exit
hex:
sub al,37h
mov byte ptr[si+bx],al ;原来的缓冲区位置存放输入的真实数值
jmp exit
exit:
inc bl
cmp bl,4 ;计数功能
jz return
jmp input
return:ret
get4h endp
output proc near
lea si,buff2+2 ;用si寄存器保存第二个字符串的首地址
mov bx,0 ;bx充当计数器和相对偏移量,外层循环
start0:
xor cx,cx
mov cx,4
mov al,[si+bx] ;内层循环,用cx计数
start1:
shr al,1 ;将al右移,判断CF
jc put1 ;是1,就用dx保存1,压栈
mov dx,0 ;是0,就用dx保存0,压栈
push dx
dec cl
cmp cl,0 ;判断四位有没有全部入栈
jz start2 ;全部入栈了,就开始输出
jmp start1
put1:
mov dx,1
push dx
dec cl
cmp cl,0
jz start2
jmp start1
start2:
mov cx,4 ;再用cx当作内层循环计数器
start3:
pop dx
add dl,30h
mov ah,2
int 21h
dec cl
cmp cl,0
jz exit1
jmp start3 ;出栈输出
exit1:
inc bx ;进行外层循环计数
mov dl,0
mov ah,2
int 21h
cmp bx,4
jz return1
jmp start0
return1:ret
output endp
code ends
end main
运行结果:
- 实验小结:
经过本次实验,我对使用汇编语言进行编程有了更高能力的提升,和第四次实验相比,这次实验更为简单,只需要把输入的16进制转换成二进制,保存后,再写一个子程序将2进制的值以ASCII码的方式输出出来,在这次实验中,我还提升了运用debug的能力,通过运用debug我找出了许多错误,解决了我逻辑算法上的缺陷,希望在以后的不断编程中,我的能力能得到进一步提升。