原文地址:http://blog.sina.com.cn/s/blog_664ffc6b0100z539.html
设计内容
1.从键盘输入一个不少于8位的十进制数(如12345678),把其分别转换成二进制、八进制、十六进制数显示在屏幕上。
2.从键盘输入一个不少于5位的十六进制数(如1FED5H),把其分别转换成二进制、八进制、十进制数显示在屏幕上。
思路
1.本程序应用分支程序功能实现菜单选择操作,在主程序中通过带参数的调用子函数,来完成部分功能的实现。
2.子程序decin:实现十进制的输入功能,设一个计数器,保存输入字符的个数,因为输入的是十进制数,对其输入进行了严格的审核,防止出现乱码的情况,采用了带参数调用可以使得更改存放内存时的方便
3.子程序hexin:实现了十六进制的输入功能,类似decin,对其存入进行了相应的调整,使得存入的就是输入的字符
4.子程序turn:实现了将存储单元中的元素进行了倒置存入,本子程序是为了能直接调用子程序dextobin而设计的
5.子程序dectohex:实现了十进制到十六进制的转换,本子程序应用了书本上用除法将十进制转换为十六进制的计算
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