汇编作业 16和10进制的相互转换

   1:  data segment
   2:      firstline db "cin 1(hex to dec) or 2(dec to hec) (cin # means exit):$"    
   3:  ends
   4:      
   5:  display equ 2h
   6:  key_in  equ 1h
   7:  doscall equ 21h    
   8:  hexidec segment
   9:  ;---------------------------------
  10:  main proc far
  11:      start:
  12:           mov  ax, data
  13:           mov  ds, ax
  14:           mov  es, ax   
  15:           lea  dx, firstline 
  16:           mov  ah, 9
  17:           int  doscall
  18:           
  19:           ;-------------------
  20:           mov  ah, key_in
  21:           int  doscall
  22:           push ax
  23:           call crlf
  24:           pop  ax   
  25:           cmp  al,31h
  26:           je   hextodec
  27:           cmp  al,32h
  28:           je   dectohex
  29:            
  30:  dectohex:                   ;10进制换成16进制                 
  31:           call decibin       
  32:           call crlf
  33:           call binihex
  34:           call crlf
  35:           jmp  start                 
  36:  hextodec:                   ;十六进制换成10进制
  37:           call hexibin
  38:           call crlf
  39:           call binidec
  40:           call crlf
  41:           jmp  start  
  42:           main endp  
  43:  ;----------------------------------------
  44:  hexibin  proc near         ;16-->2
  45:           mov  bx,0
  46:  newchar:    
  47:           mov  ah,key_in    ;输入1位字符
  48:           int  doscall                        
  49:           cmp  al,'#'
  50:           je   exit
  51:           sub  al,30h       ;小于0,退出
  52:           jl   exit
  53:           cmp  al,10d       ;不大于10
  54:           jl   add_to
  55:            
  56:           sub  al,7h        ;al-=7
  57:           cmp  al,0ah
  58:           jl   exit         ;比'A'小,退出
  59:           cmp  al,10h       ;比较al和'G'
  60:           jge  exit         ;大于等于'G',退出
  61:  add_to:
  62:           mov  cl,4
  63:           shl  bx,cl      ;bx左移4位,bx+=ax
  64:           mov  ah,0
  65:           add  bx,ax
  66:           jmp  newchar  
  67:  exit:         
  68:           ret
  69:  hexibin  endp
  70:  ;------------------------------------ 
  71:  binidec  proc near
  72:           mov  cx,10000d  ;bx/10000
  73:           call dec_div
  74:           mov  cx,1000d   ;bx/1000
  75:           call dec_div 
  76:           mov  cx,100d
  77:           call dec_div 
  78:           mov  cx,10d
  79:           call dec_div 
  80:           mov  cx,1d
  81:           call dec_div  
  82:           ret   
  83:  binidec  endp
  84:  ;--------------------------------------
  85:  dec_div  proc near
  86:           mov  ax,bx
  87:           mov  dx,0
  88:           div  cx        ;dx,ax/cx
  89:           mov  bx,dx     ;商
  90:           mov  dl,al     ;余数
  91:           
  92:           add  dl,30h
  93:           mov  ah,display
  94:           int  doscall
  95:           ret
  96:  dec_div  endp
  97:  ;-----------------------------
  98:  crlf     proc near            ;输出回车
  99:           mov  dl,0ah
 100:           mov  ah,display
 101:           int  doscall
 102:           
 103:           mov  dl,0dh
 104:           mov  ah,display
 105:           int  doscall
 106:           ret
 107:  crlf     endp    
 108:  ;---------------------------
 109:  hexidec  ends    
 110:  ;===============================
 111:  decibin  proc near           ;10-->2
 112:           mov  bx,0
 113:  newchar1:
 114:           mov  ah,key_in         
 115:           int  doscall   
 116:           cmp  al,'#'
 117:           je   exit1
 118:           sub  al,30h          ;al-'0'
 119:           jl   exit1           ;小于0
 120:           cmp  al,9d
 121:           jg   exit1           ;大于9
 122:           cbw                  ;8位-->16位
 123:           xchg ax,bx           ;bx<--ax
 124:           mov  cx,10d
 125:           mul  cx              ;ax*=10
 126:           xchg ax,bx
 127:           
 128:           add  bx,ax
 129:           jmp  newchar1
 130:  exit1:      
 131:           ret
 132:  decibin  endp 
 133:  ;---------------------------------
 134:  binihex  proc near
 135:           mov  ch,4          ;bx为16位,要做四次
 136:  rotate:  mov  cl,4         
 137:           rol  bx,cl         ;循环右移4位,即bx/16
 138:           mov  al,bl         ;bl-->al
 139:           and  al,0fh        ;al & 00001111
 140:           add  al,30h
 141:           cmp  al,3ah        ;比较al和"10"
 142:           jl   print
 143:           add  al,7h         ;'10'-->'A'
 144:  print:
 145:           mov  dl,al         
 146:           mov  ah,display
 147:           int  doscall
 148:           dec  ch
 149:           jnz  rotate
 150:           ret
 151:  binihex  endp
 152:  ;--------------------------------
 153:           end  start

学汇编,伤不起,没本事,更伤不起。

posted @ 2013-04-26 23:14  姜楠  阅读(549)  评论(0)    收藏  举报