8086彙編 計算輸入兩個十進制數之和用16進制輸出//輸入兩個十六進制數之和用10進制輸出




把兩個題目放在了一起,輸入H(D)+數字+空格+數字+空格就會看到和
可以參考輸入示範的截圖
輸入H代表你輸入16進制數,以10進制輸出和
輸入D代表你輸入10進制數,以16進制輸出和
此程序可以接受加數很大隻要最後和在16位寄存器放得下就行

data segment;計算兩個在和在65535內的十進制數或16進制數的和,這兩個數最多可以是五位十進制數

db 10 dup(0);用於暫時存放輸入的數
flag0 db 0;flag0==2標誌着輸入數的結束
flag1 db 0;flag1用來存放'D'或者'H'用來判斷用戶輸的是十進制還是十六進制
table dw 10000,1000,100,10,4096,256,16;轉化需要用到的數
hord  db'plz input 2 numbers,first input H or D','$';輸入H或者D代表用戶輸入的十進制或者16進制數
data ends;測試方法:輸入方式是輸入一個H或者D(接着不要輸入任何其他字符)然後緊跟着輸入一個數空格,再輸入一個數空格,屏幕會顯示某進制輸出的和,如提示語句出現後,輸入D110(空格)120(空格)會在120後面顯示E6
stack segment;用戶輸入16進制大小寫均可,輸出規定用大寫輸出
stack ends
code segment
assume     cs:code,ss:stack,ds:data
begin:     mov ax,data
           mov ds,ax
           lea dx,hord
           mov ah,9
           int 21h
           xor dx,dx
           mov ah,1
           int 21h
           mov flag1,al;flag1存放用戶輸入的進制信息
           xor ax,ax
           cmp flag1,44h;是否輸入十進制
           jnz hex;不是'D'跳轉16進制輸入
           call input
hex:       call inputd
transformh:mov di,6;不同輸入對di的處理,是爲了以後引用下標只要寫一段程序就可以,修改下標方法相同
           jmp transform
transformd:mov di,0
transform: inc flag0;輸入一個數標誌增1
           mov ah,0
           mov bx,0
           mov dx,0
           cmp cx,1;之前寫的不用將cx與1,2,3,4一個個比較這麼麻煩,是用一個數組存放1,10,100,1000,數組下標與cx有某種聯繫,可是這樣容易犯糊塗出現錯誤所以放棄了
           jz  x1
           cmp cx,2
           jz x2
           cmp cx,3
           jz x3
           cmp cx,4
           jz x4
           cmp cx,5
           jz x5
x1:        mov al,[bx]
           push ax
           cmp  flag0,2;如果flag0==2
           jz sum;則跳轉求和
           cmp flag1,44h;判斷哪種進制輸入
           jz input;跳轉不同的輸入方式
           jmp inputd
x2:        mov al,[bx]
           add di,6;對下標的處理,下面類似,代碼很多其實就是重複不需要註釋了
           mov si,table[di]
           mul si
           push ax
           mov  al,[bx+1]
           pop  dx
           add  ax,dx
           push ax
           cmp flag0,2
           jz sum
           cmp flag1,44h
           jz input
           jmp inputd
x3:        mov al,[bx]
           add di,4
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+1]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+2]
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           push ax
           cmp flag0,2
           jz sum
           cmp flag1,44h
           jz input
           jmp inputd
x4:        mov al,[bx]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+1]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+2]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+3]
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           push ax
           cmp flag0,2
           jz sum
           cmp flag1,44h
           jz input
           jmp inputd
x5:        mov al,[bx]
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+1]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+2]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+3]
           add di,2
           mov si,table[di]
           mul si
           push ax
           mov ah,0
           mov al,[bx+4]
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           pop dx
           add ax,dx
           push ax
           cmp flag0,2
           jz sum
            cmp flag1,44h
           jz input              
sum:       pop dx;**************求和***************
           pop ax
           add ax,dx
           cmp flag1,44h;判斷,跳轉哪種進制輸出
           jnz outputd
output:    mov cx,0;用cx計數轉化爲16進制後有幾位
outputt:   mov bx,16;轉化爲16進制輸出
           xor dx,dx
           div bx
           push dx
           inc cx
           cmp ax,0
           jnz outputt
output0:   pop dx
           cmp dx,9h;如果比9大用字母表示
           ja l1
           add dx,30h
           mov ah,2
           int 21h
           loop output0
           jmp endd
l1:        add dl,37h;輸出字母統一用大寫字母輸出
           mov ah,2
           int 21h
           loop output0
endd:      mov ax,4c00h
           int 21h
outputd:    mov cx,0;用cx計數轉化爲10進制後有幾位
outputdd:   mov bx,10;轉化爲10進制輸出
           xor dx,dx
           div bx
           push dx
           inc cx
           cmp ax,0
           jnz outputdd
outputd0:   pop dx
           add dx,30h
           mov ah,2
           int 21h
           loop outputd0
           jmp endd
input:     mov cx,0;用cx計數輸入的數有幾位
           mov bx,0;******輸入10進制數***************
input0:    mov ah,1
           int 21h
           cmp al,20h
           jz transformd
           sub al,30h
           mov [bx],al
           inc cx
           inc bx
           jmp input0
inputd:    mov cx,0;用cx計數輸入的數有幾位
           mov bx,0;********輸入16進制數**************
inputd0:    mov ah,1
           int 21h
           cmp al,20h
           jz transformh
           cmp al,41h;字母還是數字
           jae line1
           sub al,30h
           mov [bx],al
           inc cx
           inc bx
           jmp inputd0
line1:     cmp al,61h;大寫還是小寫
           jae line2
           sub al,37h
           mov [bx],al
           inc cx
           inc bx
           jmp inputd0
line2:     sub al,57h
           mov [bx],al
           inc cx
           inc bx
           jmp inputd0          
           code ends
           end begin             





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章