- 实验名称:实验五 分支与循环程序设计
二、实验内容:从键盘输入一个四位的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我找出了许多错误,解决了我逻辑算法上的缺陷,希望在以后的不断编程中,我的能力能得到进一步提升。



















