⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chengxu.asm

📁 一个非常好的8086汇编语言菜单程序设计
💻 ASM
字号:
data segment 
mesg1 db 'Please choose a number(1,2,3,4,5,6,7,8) to apply it: ',0ah ,0dh,0ah ,0dh
          db  'if you want to quit,please hit q OR Q! ',0ah ,0dh ,0ah ,0dh  
                                                              ;系统提示信息
   db '1.Small letter to capital letter',0ah ,0dh ,  0ah ,0dh          ;八种不同的选择提示 
   db '2.Capital letter to small letter',0ah ,0dh,0ah ,0dh    
   db '3.BIN to HEX',0ah ,0dh ,0ah ,0dh  ,0ah ,0dh      
   db '4.HEX to BIN',0ah ,0dh,0ah ,0dh    ,0ah ,0dh    
   db '5.DEC to BIN',0ah ,0dh,0ah ,0dh    
   db '6.BIN to DEC',0ah ,0dh,0ah ,0dh    
   db '7.HEX to DEC',0ah ,0dh,0ah ,0dh    
   db '8.DEC to HEX',0ah ,0dh,0ah ,0dh ,'$' 
mesg2 db 'You have input a invalid number!Please select again:',0ah ,0dh  ,0ah ,0dh,'$'  
                                                               ;选择无效提示
mesg3 db 'Please input a small letter:',0ah ,0dh,0ah ,0dh ,'$' ;
mesg4 db 'Its capital letter is',0ah ,0dh,0ah ,0dh ,'$' 
mesg5 db 'Please input a capital letter:',0ah ,0dh,'$' 
mesg6 db 0ah,0dh
         db'Its small letter is:',0ah ,0dh,0ah ,0dh ,'$' 
mesg7 db 'Please input a bin number:',0ah ,0dh,0ah ,0dh ,'$' 
mesg8 db 'Please input a dec number:',0ah ,0dh,0ah ,0dh  ,'$' 
mesg9 db 'Please input a hex number:',0ah ,0dh,0ah ,0dh ,'$' 
mesg10 db 0ah,0dh
          db'Its bin number is',0ah ,0dh,'$' 
mesg11 db 0ah,0dh
         db'Its dec number is',0ah ,0dh,'$' 
mesg12 db 0ah,0dh
            db'Its hex number is',0ah ,0dh,'$' 
mesg13 db 0ah,0dh,0ah ,0dh    
                db 'haha,thank you for your using! ^!^',0ah ,0dh,'$' 
data ends 

prognam segment 
main proc far 
assume cs:prognam,ds:data 
start: 
    push ds 
    xor ax,ax                                                       ;ax寄存器清零
    push ax 
    mov ax,data 
    mov ds,ax 
 again: 
   lea dx,mesg1                                           ;9号调用,显示mesg1内容
   mov ah,09h 
   int 21h 
 repeat: 
   mov ah,1                                          ;1号调用,键盘输入一个字符,存AL入中   
   int 21h 
   cmp al,31h                                        ;AL内容与1-8分别做减运算,以选择不同的菜单项
   je L1                                             ;AL内容减31H(1)为零,则跳转执行L1.以下同理
   cmp al,32h 
   je L2 
   cmp al,33h 
   je L3 
   cmp al,34h 
   je L4 
   cmp al,35h 
   je L5 
   cmp al,36h 
   je L6 
   cmp al,37h 
   je L7 
   cmp al,38h 
   je L8 
   cmp al,'Q'                                       ;若输入Q或者q,则跳出程序
   je  exit
   cmp al,'q' 
   je  exit 
   lea dx,mesg2                                    ;输入字符无效,则显示错误信息,并跳回到repeat
   mov ah,9 
   int 21h 
   jmp repeat 

L1: 
   call small_capital                              ;调用子程序small-capital,实现小写到大写字母的转换
   call crlf                                       ;调用子程序crlf,输出结果并显示
   jmp again                                       ;跳转到again,重新给入measg1的菜单提示
L2: 
   call capital_small                              ;调用子程序capital-small,实现大写到小写字母的转换
   call crlf 
   jmp again 
L3: 
   call binhex                                     ;调用子程序binhex,实现二进制数到十六进制数的转换
   call crlf 
   jmp again 
L4: 
   call hexbin                                     ;调用子程序hexbin,实现十六进制数到二进制数的转换
   call crlf 
   jmp again 
L5: 
   call decibin                                    ;调用子程序decibin,实现由十进制数到二进制数的转换
   call crlf 
   jmp again 
L6: 
   call bindec                                     ;调用子程序bindec,实现二进制数到十进制数的转换
   call crlf 
   jmp again 
L7: 
   call hexdec                                      ;调用hexdec,实现十六进制数到十进制数的转换
   call crlf 
   jmp again 
L8: 
   call dechex                                     ;调用dechex,实现十进制数到十六进制数的转换
   call crlf 
   jmp again 
exit:                                               ;定义exit
   lea dx,mesg13    
   mov ah,9 
   int 21h 
     call delay                                       ;调用延时程序delay
    ret 
main endp 

small_capital proc near                           ;定义子程序small-capital
   xor ax,ax 
   lea dx,mesg3                                    ;显示meag3的内容,提示输入信息(小写字母)
   mov ah,9 
   int 21h 
   mov ah,1                                        ;1号调用,从键盘输入单字符存如AL
   int 21h 
   sub al,20h                                      ;AL中的内容与20h相减(将小写转换成大写),结果存入AL
   push ax                                         ;AX入栈
   lea dx,mesg4                                    ;显示mesg4的内容
   mov ah,9 
   int 21h 
   pop ax                                            ;AX内容出栈
   mov dl,al
   mov ah,2                                          ;输出并显示结果
   int 21h 
   ret 
small_capital endp 

capital_small  proc near                            ;定义capital_small 
   xor ax,ax                                         ;AX清零
   lea dx,mesg5                                      ;显示mesg5的内容,提示输入信息(大写字母)
   mov ah,9 
   int 21h 
   mov ah,1                                          ;从键盘输入单字符
   int 21h 
   add al,20h                                         ;AL中的内容加20h(将大写转换成小写),结果存入AL
   push ax                                            ;AX入栈
   lea dx,mesg6                                       ;显示mesg4的内容
   mov ah,9 
   int 21h 
   pop ax 
   mov dl,al                                           
   mov ah,2                                            ;输出并显示结果
   int 21h 
   ret 
capital_small endp 

binhex proc near 
   xor ax,ax 
   mov bx,ax 
   lea dx,mesg7          ;显示mesg7的内容,提示输入信息(输入二进制数)
   mov ah,9 
   int 21h 
   mov si,4 
newchar: 
  mov ah,1 
  int 21h 
  sub al,30h             ; al的内容与30H(0)比较
  jl rotate               ;小于0,跳转到rotate    
  cmp al,02h              ; al的内容与02H(2)比较
  jl add_to               ;小于02h,跳转到add_to    
  jmp rotate 
add_to:                 
  mov cl,1 
  shl bx,cl               ;bx左移1位
  mov ah,0 
  add bx,ax 
  jmp newchar              ;跳转到newchar
rotate: 
  lea dx,mesg12            ;显示mesg12
  mov ah,9 
  int 21h 
rotate1_1: 
  mov cl,4 
  rol bx,cl                ;bx循环左移4位
  mov al,bl 
  and al,0fh               ;al与0fh作与运算(高四位清零)
  add al,30h               ;al与30h作加法运算
  cmp al,3ah               ;al与3aH作减运算
  jl print                  ;小于则跳转到print
  add al,7h                ;al与7H作加法运算,结果置于AL中
print: 
  mov dl,al                
  mov ah,2                 ;2号调用,输出显示单字符
  int 21h 
  dec si                   ;SI减一
  jnz rotate1_1            ;si不为零,则跳转至rotate1_1            
  ret 
binhex endp 

hexbin proc near           ;定义子程序hexbin(十六进制数到二进制数的转换)
  mov bx,0 
  lea dx,mesg9              ;显示输出mesg9中的字符串
  mov ah,9 
  int 21h 
  mov si,16                 ;定义指针SI
newchar1: 
  mov ah,1                  ;键盘输入单字符
  int 21h           
  sub al,30h              
  jl print1                 ;小于0,则跳转至print1
  cmp al,02H 
  jl add_to                 ;小于二,跳转至add_to                   
  sub al,27h                   
  cmp al,0ah                    
  jl print 
  cmp al,02H 
  jge print1 
add_to1: 
  mov cl,4 
  shl bx,cl 
  mov ah,0 
  add bx,ax 
  jmp newchar1 
  lea dx,mesg10 
  mov ah,9 
  int 21h 
print1: 
  rol bx,1 
  mov al,bl 
  and al,1h 
  add al,30h 
  mov dl,al 
  mov ah,2 
  int 21h 
  dec si  
  jnz print1 
  ret 
hexbin endp 

decibin proc near 
  lea dx,mesg8 
  mov ah,9 
  int 21h 
  mov bx,0 
newchar2: 
   mov ah,1 
   int 21h 
   sub al,30h 
   jl print3 
   cmp al,9d 
   jg print3 
   cbw 
   xchg ax,bx 
   mov cx ,10d 
   mul cx 
   xchg ax,bx 
   add bx,ax 
  jmp newchar2 
print3: 
  lea dx,mesg10 
  mov  cl,7 
  mov  ch,10h   
print4: 
  mov  al,bh 
  and  al,80h 
  shr  al,cl 
  add  al,30h 
  shl  bx,1 
  mov  dl,al 
  mov  ah,2 
  int  21h 
  dec  ch 
  jnz  print4 
  ret 
decibin endp 

bindec proc near 
  lea dx,mesg7 
  mov ah,9 
  int 21h 
newchar3: 
  mov ah,1 
  int 21h 
  sub al,30h 
  jl prints 
  cmp al,10d 
  jl add_to2 
  jmp print 
add_to2: 
  mov cl,1 
  shl bx,cl 
  mov ah,0 
  add bx,ax 
  jmp newchar3 
prints: 
  lea dx,mesg11 
  mov ah,9 
  int 21h                ;display dec 
  mov cx,10000d 
  call dec_div 
  mov cx,1000 
  call dec_div 
  mov cx,100 
  call dec_div 
  mov cx,10 
  call dec_div 
  mov cx,1 
  call dec_div 
  ret 

dec_div proc near 
  mov ax,bx 
  mov dx,0 
  div cx 
  mov bx,dx 
  mov dl,al 
  add dl,30h 
  mov ah,2 
  int 21h 
  ret 
dec_div endp 

bindec endp 

hexdec proc near 
  lea dx,mesg9 
  mov ah,9 
  int 21h 
  mov bx,0 
newchar4: 
  mov ah,1 
  int 21h 
  sub al,30h 
  jl next 
  cmp al,10d 
  jl add_to5 
  sub al,27h 
  cmp al,0ah 
  jl next 
  cmp al,10h 
  jge next 
add_to5: 
   mov cl,4 
   shl bx,cl 
   mov ah,0 
   add bx,ax 
   jmp newchar4 
next: 
   lea dx,mesg11 
   mov ah,9 
   int 21h               
   mov cx,10000d 
   call dec_divs 
   mov cx,1000d 
   call dec_divs 
   mov cx,100d 
   call dec_divs 
   mov cx,10d 
   call dec_divs 
   mov cx,1d 
   call dec_divs 
   ret 
dec_divs proc near 
   mov ax,bx 
   mov dx,0 
   div cx 
   mov bx,dx 
   mov dl,al 
   add dl,30h 
   mov ah,2 
   int 21h 
   ret 
dec_divs endp 
hexdec endp 

dechex proc near   ;定义子程序dechex,实现十进制数到十六进制数的转换
   lea dx,mesg11 
   mov ah,9 
   int 21h 
   mov bx,0 
newchars3: 
   mov ah,1         ;键盘给入字符(十进制数)
   int 21h 
   sub al,30h        ;小于0,跳转执行next1 
   jl next1 
   cmp al,9d         ;大于09H,也执行next1 
   jg next1 
   cbw               ;AL中的数扩展十六位
   xchg ax,bx 
   mov cx,10d 
   mul cx 
   xchg ax,bx 
   add bx,ax 
   jmp newchars3 
next1: 
   mov si,4 
   lea dx,mesg12 
   mov ah,9 
   int 21h 
   call crlf 
rotates: 
   mov cl,4 
   rol bx,cl 
   mov al,bl 
   and al,0fh 
   add al,30h 
   cmp al,3ah 
   jl printg 
   add al,7h 
printg:             
   mov dl,al 
   mov ah,2 
   int 21h 
   dec si 
   jnz rotates 
   ret 
dechex endp 

crlf proc near    ;定义子程序crlf,作为回车操作
   mov dl,13 
   mov ah,2 
   int 21h 
   mov dl,10 
   mov ah,2 
   int 21h 
   ret 
crlf endp 

delay  proc             ;延时程序delay的定义
   push cx
   push bx
   mov cx,0ffffh
dl3:	
   mov bx,0ffffh
dl4:
   dec bx           ;bx减一操作,不为零,则跳转重新执行d14
   jnz dl4
   dec cx           ;cx作减一操作,不为0,跳转执行d13
   jnz dl3        
   pop bx            
   pop cx
   ret
delay endp 

prognam ends 
end start



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -