2015-05-21 44 views
-1

計算器32位在8086組裝32位計算器

有人可以幫助我與我的32位計算器在MASM32。我認爲加法和減法是好的,但我不能打印十進制數字;

0002FFFF - 10005 = 1fffa

在MEMORY:0001 0FFFA

PRINTING:165530十進制

DATA_HERE  SEGMENT  

    mult1 dw 0002H 
      dw 0FFFFH 
    mult2 dw 0001H 
      dw 0005H 
    ans dw 0,0 

DATA_HERE ENDS 

STACK_HERE  SEGMENT STACK 
    DW 40 DUP(0) 
STACK_HERE ENDS 

CODE_HERE SEGMENT 
    ASSUME CS:CODE_HERE, DS:DATA_HERE, SS: STACK_HERE 

INICIO: 
MOV AX,DATA_HERE 
MOV DS,AX 

ADD: 

MOV AX,mult1+2 ; take lower 16-bit of NUM1; take 
ADD AX,mult2+2 ; AX = AX + lower 16-bit of NUM2 
MOV ans+2,AX ; Store lower 16-bit result at ans 

MOV AX,mult1 ; take higher 16-bit of NUM1 in AX; 
ADC AX,mult2 ; AX = AX + NUM2 + CF (add with carry) 
MOV ans,AX ; Store higher 16-bit result at ans 


SUBTRACT: 


MOV AX,mult1+2 ; take lower 16-bit of NUM1 in AX ; 
SUB AX,mult2+2 ; AX = AX - lower 16-bit of NUM2 
MOV ans+2,AX ; Store lower 16-bit result at ans 

MOV AX,mult1 ; take higher 16-bit of NUM1 in AX; 
SUB AX,mult2 ; AX = AX - NUM2 
MOV ans,AX ; Store higher 16-bit result at ans 

xor si,si 
mov si,0 

ciclo:   
    mov AX, ans[si];   
    call display ; print AX 
    add si, 2 

cmp si, 2 
JLE ciclo 

mov ax,4C00h 
int 21h   

display proc 
    ;push CX  
    ;Beginning of procedure 
    MOV BX, 10  ;Initializes divisor 
    ;MOV DX, 0000H ;Clears DX 
    MOV CX, 0000H ;Clears CX 
     ;Splitting process starts here 
.Dloop1: 
    MOV DX, 0000H ;Clears DX during jump 
    DIV BX  ;Divides AX by BX 
    PUSH DX  ;Pushes DX(remainder) to stack 
    INC CX  ;Increments counter to track the number of digits 
    CMP AX, 0  ;Checks if there is still something in AX to divide 
    JNE .Dloop1  ;Jumps if AX is not zero 

.Dloop2: POP DX  ;Pops from stack to DX 
    ADD DX, 30H  ;Converts to it's ASCII equivalent 
    MOV AH, 02H  
    INT 21H  ;calls DOS to display character 
LOOP .Dloop2 ;Loops till CX equals zero 

    ;pop CX 
    RET  ;returns control 
display ENDP 



CODE_HERE ENDS 
END INICIO 
+2

顯然,你不能單獨打印這兩個部分的小數。你可以創建一個32位的分隔符或者使用不同的方法,比如重複減去10的冪。 – Jester

+0

如果你能找到一箇舊的自發裝配書/庫的副本,那裏有你可以使用的預先構建的宏。 –

+0

對於之前的嘗試(您理解^ _),我表示歉意,這是最終版本,適用於任何32位數字,從0到FFFFFFFFh。 –

回答

1

您首先打印的低16位作爲小數FFFA - > 65530和1從第二個字。

1 65530.

如果你有一個32位處理器可以用EAX/EDX寄存器執行你除法。

如果不是更復雜。然後你必須模擬一個32位的divission。這沒有什麼樂趣;-)。

這裏有一個提示:http://en.wikipedia.org/wiki/Division_algorithm(是的,你必須處理位)

如果你寫一個C PROGRAMM,其將由10L長值,編譯爲您的處理器(16位)和dissasemble的輸出,那麼,你可以看到他們是如何做到的。這只是一個想法。我沒有自己嘗試過。你必須確保你的長期價值足夠大,以致編譯器沒有機會進行優化。 ;-)

1

接下來的代碼,用EMU8086獲得一個32位數的兩個分隔的單詞,然後兩個都轉換成字符串。該代碼使用最大32位數字0FFFF FFFFh時,你可以改變它的任何其他數字從0到FFFF FFFFh時,它會工作(評論將幫助您瞭解什麼是代碼回事):

.model small 

.stack 100h 

.data 

num_low dw ?     ;32 BIT 
num_hig dw ?     ;NUMBER. 
buf  db 12 dup('$')  ;NUMBER CONVERTED TO STRING. 

.code 
start: 

;INITIALIZE DATA SEGMENT. 
    mov ax, @data 
    mov ds, ax 

;STORE BIG 32 BIT NUMBER = 4294967295 = 0FFFF FFFFh. 
    mov num_low, 0FFFFh 
    mov num_hig, 0FFFFh 

;CONVERT 32 BIT NUMBER TO STRING. 
    mov si, offset buf 
    call number2string32bit 

;DISPLAY STRING (32 BIT NUMBER CONVERTED). 
    mov ah, 9 
    mov dx, offset buf 
    int 21h 

;WAIT FOR ANY KEY.  
    mov ah, 7 
    int 21h 

;FINISH PROGRAM. 
    mov ax, 4c00h 
    int 21h 

;------------------------------------------ 
;CONVERT 32 BIT NUMBER IN STRING. 
;ALGORITHM : EXTRACT DIGITS ONE BY ONE DIVIDING 
;NUMBER BY 10, STORING REMAINDERS IN STACK, THEN 
;EXTRACT THEM IN REVERSE ORDER TO BUILD STRING. 
;PARAMETERS : num_low = LOW WORD OF 32 BIT NUMBER. 
;    num_hig = HIGH WORD OF 32 BIT NUMBER. 
;    SI = POINTING WHERE TO STORE STRING. 

number2string32bit proc 

    mov bx, 10    ;DIVIDE NUMBER BY 10 TO EXTRACT DIGITS. 
    mov cx, 0     ;DIGITS COUNTER. NECESSARY TO POP REMAINDERS. 

extracting: 

;DIVIDE HIGHER WORD OF 32 BIT NUMBER. 
    mov dx, 0     ;DX NOT NECESSARY FOR THE HIGH WORD. 
    mov ax, num_hig 
    div bx 
    mov num_hig, ax   ;HIGHER WORD OF RESULT. 

;DIVIDE LOWER WORD OF 32 BIT NUMBER. 
;VERY IMPORTANT : PREVIOUS DX IS NECESSARY FOR THE LOW WORD. 
    mov ax, num_low 
    div bx 
    mov num_low, ax   ;LOWER WORD OF RESULT. 

    push dx     ;STORE REMAINDER (EXTRACTED DIGIT). 
    inc cx     ;INCREASE DIGIT COUNTER. 

;CHECK END OF PROCESS. 
    cmp ax, 0     ;IF LOWER WORD IS 
    jne extracting   ;NOT ZERO, REPEAT. 

;NOW RETRIEVE PUSHED DIGITS. THERE ARE CX DIGITS STORED IN STACK. 
poping: 
    pop dx     ;GET STORED DIGIT. 
    add dl, 48    ;CONVERT DIGIT TO CHARACTER. 
    mov [ si ], dl   ;STORE CHARACTER IN STRING. 
    inc si     ;POSITION FOR NEXT CHARACTER. 
    loop poping    ;CX--. IF (CX > 0) REPEAT. 

    ret 
number2string32bit endp 

;------------------------------------------ 

end start 
+0

感謝您的代碼,我正在測試number2string32bit proc,但我認爲不能正確打印。 1FFFA = 131066並正在打印165530 –

+0

修復了錯誤的打印。 –