原文地址:http://blog.sina.com.cn/s/blog_664ffc6b0100z539.htmlhtml
設計內容函數
1.從鍵盤輸入一個很多於8位的十進制數(如12345678),把其分別轉換成二進制、八進制、十六進制數顯示在屏幕上。oop
2.從鍵盤輸入一個很多於5位的十六進制數(如1FED5H),把其分別轉換成二進制、八進制、十進制數顯示在屏幕上。ui
思路spa
1.本程序應用分支程序功能實現菜單選擇操做,在主程序中經過帶參數的調用子函數,來完成部分功能的實現。設計
2.子程序decin:實現十進制的輸入功能,設一個計數器,保存輸入字符的個數,由於輸入的是十進制數,對其輸入進行了嚴格的審覈,防止出現亂碼的狀況,採用了帶參數調用能夠使得更改存放內存時的方便code
3.子程序hexin:實現了十六進制的輸入功能,相似decin,對其存入進行了相應的調整,使得存入的就是輸入的字符orm
4.子程序turn:實現了將存儲單元中的元素進行了倒置存入,本子程序是爲了能直接調用子程序dextobin而設計的xml
5.子程序dectohex:實現了十進制到十六進制的轉換,本子程序應用了書本上用除法將十進制轉換爲十六進制的計算htm
6.子程序hextodec:實現了十六進制到十進制的轉換,本子程序移位的方法實現乘法運算,應用堆棧對寄存器沒法保存的多位數字進行存取,實現大於四位數的運算
7.子程序hextobin:實現了十六進制到二進制的轉換,經過將十六進制移位,直接判斷該位是0或是1,直接存儲,利用的是數在計算機內都是以二進制代碼存儲的機制
8.子程序bintooct:實現了二進制到八進制的轉換,利用二進制與八進制的關係,三位二進制爲一位八進制,則由低位開始取三位進行計算,便可獲得八進制
本程序不只應用到了循環與分支程序、子程序結構,還用到了高級彙編語言技術宏彙編,是對整個課程的所學的實踐,也是對整個課程的一次總結。
程序
1 crlf macro 2 lea dx,crl 3 mov ah,09h 4 int 21h 5 endm 6 Emess macro 7 lea dx,error 8 mov ah,09h 9 int 21h 10 endm 11 data segment 12 menu db 'Choose to perform an operation!',10,13 13 db '0.Quite',10,13 14 db '1.Base Number:Decimal number',10,13 15 db '2.Base Number:Hexadecimal number',10,13,'$' 16 mess10 db 'Please input a decimal Number:','$' 17 mess2 db 'Its corresponding binary number:','$' 18 mess8 db 'Its corresponding octal number:','$' 19 mess0 db 'Its corresponding decimal number:','$' 20 mess6 db 'Its corresponding hexadecimal number:','$' 21 mess16 db 'Please input a hexadecimal Number:','$' 22 error db 'Error Input,please enter a new number!!!',10,13,'$' 23 crl db 10,13,'$' 24 bina db 33 dup(?) 25 octa db 11 dup(?) 26 decim db 20 dup(?) 27 hexad db 8 dup(?) 28 hexad0 db 8 dup(?) 29 hexad1 db 8 dup(?) 30 count0 db ? 31 count1 db ? 32 count2 db ? 33 count3 db ? 34 ten dw 10 35 data ends 36 code segment 37 main proc far 38 assume cs:code,ds:data 39 start: push ds 40 push ax 41 mov ax,data 42 mov ds,ax 43 lea dx,menu 44 mov ah,09h 45 int 21h 46 mov ah,01h 47 int 21h 48 cmp al,'0' 49 jz ex0 50 cmp al,'1' 51 jz de 52 cmp al,'2' 53 jz he0 54 Emess 55 jmp start 56 ex0: jmp exit 57 de: Crlf 58 lea dx,mess10 59 mov ah,09h 60 int 21h 61 lea di,decim 62 call decin ;輸入一個十進制數 63 Crlf 64 cmp ch,0 65 jnz de1;輸入個數爲0 66 Emess 67 jmp exit 68 he0: jmp he1 69 de1: lea dx,mess6 70 mov ah,09h 71 int 21h 72 lea si,decim 73 lea di,decim 74 lea bp,hexad1 75 call dectohex 76 crlf 77 lea dx,mess2 78 mov ah,09h 79 int 21h 80 lea si,hexad1 81 lea di,bina 82 call hextobin 83 crlf 84 lea dx,mess8 85 mov ah,09h 86 int 21h 87 lea si,bina 88 lea di,octa 89 call bintooct 90 crlf 91 jmp exit 92 he1: crlf 93 lea dx,mess16 94 mov ah,09h 95 int 21h 96 lea di,hexad 97 call hexin 98 crlf 99 mov al,count3 100 mov count0,al 101 cmp ch,0 102 jnz he2 ;輸入個數爲0 103 Emess 104 jmp exit 105 he2: lea dx,mess2 106 mov ah,09h 107 int 21h 108 lea di,hexad0 109 lea si,hexad 110 call turn 111 lea si,hexad0 112 lea di,bina 113 call hextobin 114 crlf 115 lea dx,mess8 116 mov ah,09h 117 int 21h 118 lea si,bina 119 lea di,octa 120 call bintooct 121 crlf 122 lea dx,mess0 123 mov ah,09h 124 int 21h 125 lea di,hexad 126 call hextodec 127 crlf 128 exit: 129 mov ah,4ch 130 int 21h 131 main endp 132 hexin proc ;輸入一個字節的十六進制數 133 inputh: mov ah,01h ;輸入第一個字符 134 int 21h 135 inc count3 ;字節計數器 136 cmp al,13 137 jz endh 138 sub al,30h 139 jl exih ;輸入出錯 140 cmp al,10h 141 jl inh1 ;輸入數字 142 cmp al,16h 143 jl inh2 144 cmp al,36h 145 jg exih 146 sub al,20h 147 inh2: sub al,07h 148 inh1: mov [di],al ;存入內存 149 inc di 150 jmp inputh 151 endh: dec count3 152 jz exih 153 mov ch,1 154 jmp endh0 155 exih: mov ch,0 156 endh0: ret 157 hexin endp 158 turn proc ;逆置存放 159 mov cl,count0 160 mov bx,word ptr count0 161 xch: dec bx 162 mov al,[si] 163 inc si 164 mov [di+bx],al 165 dec cl 166 jnz xch 167 ret 168 turn endp 169 decin proc ;輸入一個字節的十進制數 170 input: mov ah,01h ;輸入第一個字符 171 int 21h 172 inc count0 ;字節計數器 173 cmp al,13 174 jz end1 175 sub al,30h 176 jl exid ;輸入出錯 177 cmp al,9d 178 jg exid ;輸入出錯 179 mov [di],al ;存入內存 180 inc di 181 jmp input 182 end1: dec count0 183 jz exid 184 mov ch,1 185 jmp end0 186 exid: mov ch,0 187 end0: ret 188 decin endp 189 190 dectohex proc ;十進制轉十六進制 191 change: xor ax,ax 192 xor bx,bx 193 mov count1,al 194 mov ch,count0 195 cmp ch,0 ;判斷decimal是否爲空 196 jz outh1 197 rot: mov al,[di] 198 inc di 199 cbw 200 add ax,bx 201 mov cl,16 202 div cl 203 cmp al,0 204 jnz d2 205 cmp ah,0 206 jz d3 207 d2: mov [si],al 208 inc si 209 inc count1 210 sub ch,1 211 jz d5 212 jmp d4 213 d3: sub ch,1 214 jz d5 215 jmp rot 216 d4: mov al,ah 217 mov cl,10 218 mul cl 219 mov bx,ax 220 jmp rot 221 d5: mov bx,word ptr count2 222 xchg di,bp 223 mov [di+bx],ah 224 xchg di,bp 225 inc count2 ;十六進制的字節數 226 mov al,count1 227 mov count0,al 228 mov al,count1 229 cbw 230 sub si,ax 231 mov bx,si 232 mov di,bx 233 jmp change 234 outh1: mov al,count2 ;保存位數,留待後用 235 mov count0,al 236 outh: dec count2 237 mov bx,word ptr count2 238 xchg di,bp 239 mov al,[di+bx] 240 xchg di,bp 241 mov bh,al 242 add bh,30h 243 cmp bh,3ah 244 jl print 245 add bh,7h 246 print: mov dl,bh 247 mov ah,02h 248 int 21h 249 mov al,count2 250 cmp al,0 251 jnz outh 252 ret 253 dectohex endp 254 ;************************************* 255 hextodec proc ;十六進制轉十進制 256 xor ax,ax 257 xor dx,dx 258 xor bx,bx 259 mov ch,count3 260 ro0: mov al,[di] ;由第一個數開始取 261 inc di 262 mov cl,4 ;將其左移*16 263 cmp ch,4 264 jg getd 265 rol bx,cl 266 add bl,al 267 dec ch 268 jnz ro0 269 jmp tr1 270 getd: rol dx,cl 271 add dl,al 272 dec ch 273 jmp ro0 274 tr1: mov cx,0 275 mov ax,bx 276 tran: push ax 277 mov ax,dx 278 mov dx,0 279 div ten 280 mov si,ax 281 pop ax 282 div ten 283 mov bx,dx 284 push bx 285 inc cx 286 mov dx,si 287 cmp dx,0 288 jne tran 289 cmp ax,0 290 jne tran 291 printd: 292 pop bx 293 mov dx,bx 294 add dx, 30h 295 mov ah, 02h 296 int 21h 297 loop printd 298 ret 299 hextodec endp 300 ;************************************* 301 hextobin proc ;將十六進制數轉爲二進制 302 mov bx,0 303 xor ax,ax 304 mov ch,count0 305 lar: mov al,[si] 306 inc si 307 mov cl,4 ;高位爲0,只有低位有效 308 sma: mov ah,al 309 and ah,01 310 mov [di+bx],ah 311 mov ah,0 312 ror ax,1 ;反向取出一位轉化爲ASCII輸出 313 inc bx 314 dec cl 315 jnz sma 316 dec ch 317 jnz lar 318 mov count0,bl ;保存二進制個數,待用 319 dec bx 320 outb: mov al,[di+bx] 321 add al,30h 322 mov dl,al 323 mov ah,2 324 int 21h 325 dec bx 326 cmp bx,0 327 jnl outb 328 ret 329 hextobin endp 330 ;************************************* 331 bintooct proc ;二進制轉八進制 332 xor ax,ax 333 xor bx,bx 334 mov ch,0 335 mov cl,count0 336 O: mov al,[si] 337 inc si 338 dec cx 339 test al,01h 340 jz o1 341 add bl,1 342 o1: mov al,[si] 343 inc si 344 dec cx 345 test al,01h 346 jz o2 347 add bl,2 348 o2: mov al,[si] 349 inc si 350 dec cx 351 test al,01h 352 jz o3 353 add bl,4 354 o3: mov [di],bl 355 mov bl,0 356 inc di 357 inc ah 358 cmp cx,0 359 jg O 360 mov count0,ah 361 mov cl,count0 362 outo: dec di 363 mov al,[di] 364 add al,30h 365 mov dl,al 366 mov ah,2 367 int 21h 368 dec cl 369 jnz outo 370 ret 371 bintooct endp 372 ;************************************* 373 code ends 374 end start 375 376