2015-05-21 42 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

修复了错误的打印。 –