汇编语言-分支结构程序设计

目录

题目1、猜数程序,程序中预设一数字字符M,(如:‘5’)从键盘输入一个数字字符N,判断:若N >M,在屏幕上显示输出字符串“TOO BIG”;若N

题目2、 编写一个程序,判别键盘上输入的字符;若是0-9字符,则显示“IT IS A DIGITAL”;若为A-Z或a-z字符,均显示“IT IS A LOWCASE LETTER”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

题目3、预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH”,否则显示“NOMATCH!,PROGRAM TERMINATED!”

题目4、上述程序1、2、3分别完成后请编写一个程序来实现简单的程序菜单显示。(采用地址跳跃表法实现)


题目1: 猜数程序,程序中预设一数字字符M,(如:‘5’)从键盘输入一个数字字符N,判断:若N >M,在屏幕上显示输出字符串“TOO BIG”;若N <M 则显示“TOO SMALL”;否则显示“YOUR ARE RIGHT”

实验程序如下所示:

assume cs: code, ds: data
data segment
      string db 'Please input a number:$'
      big    db 0dh,0ah,'too big$'
      small  db 0dh,0ah,'too small$'
      equal  db 0dh,0ah,'you are right$'
data ends
code segment

      start:
            mov ax, data
            mov ds, ax
            lea dx, string
            mov ah, 9
            int 21h

            mov ah, 1           ;读入字符
            int 21h

            cmp al, '5'         ;对字符进行比较
            ja  res1
            jb  res2
            jz  res3
      res1: 
            lea dx,big
            jmp exit
      res2: 
            lea dx,small
            jmp exit
      res3: 
            lea dx,equal
            jmp exit
      exit: 
            mov ah,9
            int 21h

            mov ax,4c00h
            int 21h
code ends
end start 

多次运行程序,得到如下结果,与预期结果一致


题目二:

 编写一个程序,判别键盘上输入的字符;若是0-9字符,则显示“IT IS A DIGITAL”;若为A-Z或a-z字符,均显示“IT IS A LOWCASE LETTER”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

实验程序如下所示:

;'0'-'9'的ASCII码在30-39之间
;'a'-'z'的ASCII码在61-7AH之间
;'A'-'Z'的ASCII码在41-5AH之间
assume cs: code, ds: data
data segment
      string db 'Please input a character:$'
      digit  db 0dh,0ah,'it is a digit$'
      letter db 0dh,0ah,'it is a lowcase letter$'
data ends
code segment

      start:
            mov ax, data
            mov ds, ax
            lea dx, string
            mov ah, 9
            int 21h
          
      lop:  
            mov ah, 1           ;读入字符
            int 21h
            cmp al, 0dh         ;对字符进行比较
            jbe exit            ;若小于等于0dh直接退出
   
            cmp al,30H          ;否则大于0dh
            jb  lop             ;0DH-30H继续循环
            cmp al,39h          ;否则>=30H
            jbe res1            ;>=30H,<=39H
                            
            cmp al,41H          ;否则>39H
            jb  lop             ;>39H,<41H继续循环
            cmp al,5AH          ;>=41H,<=5AH,结束输出lowcase letter
            jbe res2
        
            cmp al,61H          ;否则>5AH
            jb  lop             ;>5AH,<61H,继续循环
            cmp al,7AH          ;>=5AH
            jbe res2            ;>=5AH,<=7AH,结束输出lowcase

      res1: 
            lea dx,digit
            mov ah,9
            int 21h
            jmp exit
      res2: 
            lea dx,letter
            mov ah,9
            int 21h
            jmp exit
      exit: 
          

            mov ax,4c00h
            int 21h
code ends
end start 

运行结果如下所示:

1、当直接输入回车字符时,程序直接结束

2、当输入数字0-9时,显示it is a digit

3、当输入字母大写或者小写时,都显示it is a lowcase letter

4、当输入其它字符时,继续输入字符,直到遇到上述字符才会结束程序

题目三:

预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH”,否则显示“NOMATCH!,PROGRAM TERMINATED!”

实现程序如下所示:

assume cs: code, ds: data
data segment
    string   db 'Please input your password:$'
    password db "assembly"
    buffer   db 30 dup('0')
    true     db 0dh,0ah,'Match$'
    false    db 0dh,0ah,'NOMATCH!,Program Terminated!$'

data ends
code segment
    start:
          mov  ax, data
          mov  ds, ax
          lea  dx, string
          mov  ah, 9
          int  21h

          lea  dx,buffer
          mov  ah,0ah
          int  21h                 ;读取字符串

          mov  cl,8h               ;设置密码长度
          inc  dx
          mov  di,dx
          mov  byte ptr al,[di]    ;获取输入字符的个数
          cmp  al,cl
          jne  res1                ;若两者长度不相等则直接退出

          lea  si,password         ;密码位置
          lea  di,buffer           ;输入串位置
          add  di,2
    lop:  
   
          mov  byte ptr al,[si]
          mov  byte ptr ah,[di]
          cmp  al,ah               ;比较si和di中的字符是否相等
          jne  res1                ;不相等,结果为false
          inc  si                  ;否则相等
          inc  di
          loop lop
          jmp  res2                ;说明相等,结果为true

    res1: 
          lea  dx,false
          mov  ah,9
          int  21h
          jmp  exit
    res2: 
          lea  dx,true
          mov  ah,9
          int  21h
          jmp  exit
    exit: 
          mov  ax,4c00h
          int  21h
code ends
end start 

分析:

         设置初始密码为:’assembly’,用户输入密码至buffer缓冲区,比较缓冲区与字符串,1、首先比较两者的长度,若长度不一致,直接返回结果false

         2、若两者长度一致,则通过循环来比较两者的实际内容是否一致,一致返回true,否则,返回false

         运行结果如下所示:

输入正确密码,返回Match

输入错误密码,返回false

输入正确密码,但是长度不一致,返回false


题目四:

4. 上述程序1、2、3分别完成后请编写一个程序来实现简单的程序菜单显示。(采用地址跳跃表法实现)

显示一个菜单要求用户从下表中选择:

  1. GUESS NUMBER GAME        (对应-->程序1)
  2. CHAR SELECTION PROGRAM    (对应-->程序2)
  3. PASSWORD PROGRAM       (对应-->程序3)
  4. PRESS  “ESC”  TO  QUIT

用户作出选择1~3时,显示输出要执行操作的名字,如“Your selection is 1,the program will execute GUESS NUMBER GAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“will you continue program really?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。若用户选择4,要求程序显示提示信息“Please press ESC key to exit!”,并能按要求正确退出。

实现程序如下所示:

;地址跳跃表法实现分支程序设计
assume cs: code, ds: data,es:data
data segment

    branch_table dw routine_1
                 dw routine_2
                 dw routine_3
                 dw routine_4

    continue     db 0dh,0ah,'will you continue program really?(Y:N):$'
    option1      db 0dh,0ah,'Your selection is 1,the program will execute GUESS NUMBER GAME!',0dh,0ah,'$'
    option2      db 0dh,0ah,'Your selection is 2,the program will execute Char Selection Program!',0dh,0ah,'$'
    option3      db 0dh,0ah,'Your selection is 3,the program will execute Password Program!',0dh,0ah,'$'
    option4      db 0dh,0ah,'Please press ESC key to exit:$'

    menu         db 0dh,0ah,'1: Guess Number Game',0dh,0ah
                 db '2: Char Selection Program',0dh,0ah
                 db '3: Password Program',0dh,0ah
                 db '4: Press "ESC" to Quit',0dh,0ah
                 db 'Please input your option:',0dh,0ah,'$'

    bye          db 0dh,0ah,'GoodBye!',0dh,0ah,'$'
    ;--------------------game1------------------------
    input1       db 'Please input a number:$'
    big          db 0dh,0ah,'too big$'
    small        db 0dh,0ah,'too small$'
    equal        db 0dh,0ah,'you are right$'
    ;-------------------game2-------------------------
    input2       db 'Please input a character:$'
    digit        db 0dh,0ah,'it is a digit$'
    letter       db 0dh,0ah,'it is a lowcase letter$'
    ;-------------------game3-------------------------
    input3       db 'Please input your password:$'
    password     db "assembly"
    buffer       db 30 dup('0')
    true         db 0dh,0ah,'Match$'
    false        db 0dh,0ah,'NOMATCH!,Program Terminated!$'

data ends
code segment
    start:        
                  mov  ax, data
                  mov  ds, ax
    ;--------------------show the game menu--------------

showmenu proc far
                  lea  dx,menu
                  call output_string
                  mov  ah,1h
                  int  21h
                  cmp  al,'1'
                  jb   exit
                  je   routine_1
                  cmp  al,'2'
                  je   routine_2
                  cmp  al,'3'
                  je   routine_3
                  cmp  al,'4'
                  je   routine_4
                  ja   exit
                  ret
showmenu endp
    ;------------------game_options-----------------
    routine_1:    
                  lea  dx,option1
                  call output_string
                  jmp  game1

                  jmp  showmenu
    routine_2:    
                  lea  dx,option2
                  call output_string
                  jmp  game2
    routine_3:    
                  lea  dx,option3
                  mov  ah,9h
                  int  21h
                  jmp  game3
    routine_4:    
                  lea  dx,option4
                  call output_string
                  mov  ah,1h
                  int  21h
                  cmp  al,1bh           ;1bh即ESC键的ASCII码
                  je   exit
                  jmp  routine_4
exit proc far
                  lea  dx,bye
                  call output_string
                  mov  ax,4c00h
                  int  21h
exit endp
    ;------------------game1-----------------------
    _continue:    
                  lea  dx,continue
                  call output_string
                  mov  ah,1
                  int  21h
                  cmp  al,'Y'           ;如果输入的是Y,则继续执行
                  je   return2          ;返回原位置
                  cmp  al,"N"           ;如果输入的是N则返回菜单
                  je   showmenu
                  jne  _continue
    game1:        
                  mov  ax,0
                  lea  dx, input1
                  call output_string

                  mov  ah, 1            ;读入字符
                  int  21h

                  cmp  al, '5'          ;对字符进行比较
                  ja   _1res1
                  jb   _1res2
                  jz   _1res3
    _1res1:       
                  lea  dx,big
                  call output_string
                  call _continue
                  jmp  game1
    _1res2:       
                  lea  dx,small
                  call output_string
                  call _continue
                  jmp  game1
    _1res3:       
                  lea  dx,equal
                  call output_string
                  call _continue
                  jmp  game1


    return2:      
                  mov  ah,2
                  mov  dl,0ah           ;输出回车
                  int  21h
                  ret
    ;------------------game2------------------
    game2:        
                  lea  dx, input2
                  call output_string
          
    _2lop:        
                  mov  ah, 1            ;读入字符
                  int  21h
                  cmp  al, 0dh          ;对字符进行比较
                  jbe  exit2            ;若小于等于0dh直接退出
   
                  cmp  al,30H           ;否则大于0dh
                  jb   _2lop            ;0DH-30H继续循环
                  cmp  al,39h           ;否则>=30H
                  jbe  _2res1           ;>=30H,<=39H
                            
                  cmp  al,41H           ;否则>39H
                  jb   _2lop            ;>39H,<41H继续循环
                  cmp  al,5AH           ;>=41H,<=5AH,结束输出lowcase letter
                  jbe  _2res2
        
                  cmp  al,61H           ;否则>5AH
                  jb   _2lop            ;>5AH,<61H,继续循环
                  cmp  al,7AH           ;>=5AH
                  jbe  _2res2           ;>=5AH,<=7AH,结束输出lowcase

    _2res1:       
                  lea  dx,digit
                  call output_string
                  call _continue
                  jmp  game2            ;如果调用返回,说明输入的是Y,继续执行
    _2res2:       
                  lea  dx,letter
                  call output_string
                  call _continue
                  jmp  game2            ;如果调用返回,说明输入的是Y,继续执行
exit2 proc far
                  lea  dx,bye
                  call output_string
                  mov  ax,4c00h
                  int  21h
exit2 endp
    ;------------------game3----------------------
    game3:        
                  lea  dx, input3
                  call output_string

                  lea  dx,buffer
                  mov  ah,0ah
                  int  21h              ;读取字符串

                  mov  cl,8h            ;设置密码长度
                  inc  dx
                  mov  di,dx
                  mov  al,[di]          ;获取输入字符的个数
                  cmp  al,cl
                  jne  _3res1           ;若两者长度不相等则直接退出

                  lea  si,password      ;密码位置
                  lea  di,buffer        ;输入串位置
                  add  di,2
    _3lop:        
                  mov  al,[si]
                  mov  ah,[di]
                  cmp  al,ah            ;比较si和di中的字符是否相等
                  jne  _3res1           ;不相等,结果为false
                  inc  si               ;否则相等
                  inc  di
                  loop _3lop
                  jmp  _3res2           ;说明相等,结果为true

    _3res1:       
                  lea  dx,false
                  call output_string
                  call _continue
                  jmp  game3
    _3res2:       
                  lea  dx,true
                  call output_string
                  call _continue
                  jmp  game3            ;如果调用返回,说明输入的是Y,继续执行
    return:       
                  mov  ah,2
                  mov  dl,0ah           ;输出回车
                  int  21h
                  ret
    output_string:
                  mov  ah,9h
                  int  21h
                  ret
exit3 proc far
                  lea  dx,bye
                  call output_string
                  mov  ax,4c00h
                  int  21h
exit3 endp
code ends
end start 

运行结果如下所示:

  1. 菜单提示输入功能选项:

  1. 功能1猜字游戏测试:

可以观察到输入字符1后,进入猜字游戏进行猜字猜字游戏结束后,系统进行提问是否继续执行,输入Y,继续执行该游戏,输入N则返回菜单。

  1. 功能2游戏Char Selection Program测试:

可以观察到,输入2后进入字符选择程序,输入字符,输出结果,结束字符选择程序后,系统提示是否继续执行,输入Y后,继续执行该游戏,输入N则返回菜单。

  1. 功能3游戏Password Program测试

如下所示,当输入3后,进入Password Program,输入密码后,程序输出退出,当系统提示是否继续时,只有输入Y/N时才可跳转出提示程序,否则系统将一致询问直到输入正确为止。

  1. 功能4退出程序功能测试:

如下所示,输入4,系统显示提示信息Please press ESC key to exit,当输入esc键之后才会退出程序,否则不断输入直到输入正确为止。

  • 48
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值