1 ;程序設計的要求:通過鍵盤給一個四位的16進制數,程序把它轉換成10進制數,並顯示出來。 2 ;把輸入的4位16進制數以10十進制的值存放到變量num中,注意num可能會有5位數。所以下面 3 ;就通過÷,%(10000,1000,100,10)來得到每一位數,即十進制數. 4 ;相同的道理,把num轉換為16進制 5 DSEG SEGMENT 6 ;數據段:在此處添加程序所需的數據 7 num dw ? 8 arr dw 10 dup(?) 9 STRING1 DB '[choce 0 (dec->hex) or 1 (hex->dec)]:$' 10 STRING2 DB '[input a hex number which must be four digits]:$' 11 STRING3 DB '[input a dec number which must be four digits]:$' 12 DSEG ENDS 13 14 CSEG SEGMENT 15 ;*************************************************************************** 16 MAIN PROC FAR ;主程序入口 17 assume cs:CSEG, ds:DSEG 18 ;--------------------------------------------------------------------------- 19 chose: 20 mov ax, DSEG 21 mov ds, ax 22 mov es, ax 23 24 lea dx, STRING1 25 mov ah, 9 26 int 21h ; output string at ds:dx 27 28 mov ah, 01h ;鍵盤輸入並回顯,AL=input char 29 int 21h 30 cmp al,30h ;和'0'比較 31 je start2 ;轉到10-16進制入口 32 cmp al,31h ;和'1'比較 33 je start1 ;轉到16-10進制入口 34 call change ;換行,重新選擇 35 jmp chose ;輸入錯誤,讓其重新輸入 36 ;--------------------------------------------------------------------------- 37 start1: ;4位16進制轉10進制,入口 38 call change ;自動換行 39 40 lea dx, STRING2 41 mov ah, 9 42 int 21h ; output string at ds:dx 43 44 mov num, 0 45 mov cx, 4 ;輸入4位16進制數(這里沒有處理少於或多於4位的情況) 46 L1: mov ah, 01h ;鍵盤輸入並回顯,AL=input char 47 int 21h 48 push cx ;保護cx 49 mov cl, 4 50 shl num, cl ;輸入的數以10進制的形式存到num中[邏輯左移4位,SHL OPR,CNT 前一個不能是操作數,后一個為CL寄存器] 51 pop cx 52 53 cmp al, 3ah ;<9直接al-'0'擴展->num->bx 54 jb s1 55 cmp al,47h ;9< <G [小寫的大於大寫的] 56 jb x1 57 sub al,20h ;小寫的比大寫的多減去20h 58 x1: sub al, 7h 59 s1: sub al, 30h 60 mov ah, 0 61 add num, ax 62 mov bx, num 63 loop L1 64 solve1: 65 call change ;自動換行 66 call fun1 ;調用主函數 67 call change 68 jmp chose 69 call exit ;退出 70 ;-------------------------------------------------------------------------- 71 start2: 72 call change ;自動換行 73 74 lea dx, STRING3 75 mov ah, 9 76 int 21h ; output string at ds:dx 77 78 mov num, 0 79 mov cx, 4 ;輸入4位16進制數(這里沒有處理少於或多於4位的情況) 80 L2: mov ah, 01h ;鍵盤輸入並回顯,AL=input char 81 int 21h 82 push cx ;保護cx 83 push ax 84 mov cx,10d 85 mov ax,num ;字乘法:(dx,ax)=ax*src 86 mul cx 87 mov num,ax ;把ax給num 88 pop ax 89 pop cx 90 s2: sub al, 30h ;輸入轉換為數字-'0' 91 mov ah, 0 92 add num, ax 93 mov bx, num 94 loop L2 95 jmp solve2 96 solve2: 97 call change ;自動換行 98 call fun2 ;調用主函數 99 call change 100 jmp chose 101 call exit ;退出 102 ;******************************************************************************; 103 MAIN ENDP 104 105 fun1 proc ;被除數放在dx中 106 mov cx, 10000d ;把除數存放到cx中 107 call dec_div 108 109 mov cx, 1000d 110 call dec_div 111 112 mov cx, 100d 113 call dec_div 114 115 mov cx, 10d 116 call dec_div 117 118 mov cx, 1d 119 call dec_div 120 ret 121 fun1 endp 122 123 dec_div proc ;除法實現,除數為cx的值 124 mov ax, bx 125 mov dx, 0 126 div cx ;div 無符號:div src 16位操作:商ax=(dx,ax)/src,余數dx 127 mov bx, dx 128 mov dl, al 129 130 add dl, 30h ;轉換為char並顯示 131 mov ah, 02h 132 int 21h 133 ret 134 dec_div endp 135 ;------------------------------------------------------------------------ 136 fun2 proc ;被除數放在dx中 137 mov cx,1000h ;把除數存放到cx中 138 call hex_div 139 140 mov cx,0100h 141 call hex_div 142 143 mov cx,0010h 144 call hex_div 145 146 mov cx,0001h 147 call hex_div 148 149 ret 150 fun2 endp 151 152 hex_div proc ;除法實現,除數為cx的值 153 mov ax, bx 154 mov dx, 0 155 div cx ;div 無符號:div src 16位操作:商ax=(dx,ax)/src,余數dx 156 mov bx, dx 157 mov dl, al 158 159 cmp dl, 10d ;和10比 >=10 160 jb show 161 add dl,7h ;>=10的情況 162 show: 163 add dl, 30h ;轉換為char並顯示 164 mov ah, 02h 165 int 21h 166 ret 167 hex_div endp 168 ;************************************************************************************************* 169 ;回車換行 170 change proc 171 push ax 172 mov ah, 02h 173 mov dl, 0ah 174 int 21h 175 mov ah, 02h 176 mov dl, 0dh 177 int 21h 178 pop ax 179 ret 180 change endp 181 ;************************************************************************************************* 182 ;退出 183 exit proc 184 ;按任意鍵退出 185 mov ah,1 186 int 21h 187 mov ax, 4c00h ;程序結束,返回到操作系統 188 int 21h 189 exit endp 190 ;************************************************************************************************* 191 END MAIN 192 CSEG ENDS