Assembly 8086汇编中的32位计算器
32位计算器 有人能帮我在MASM32中使用32位计算器吗。我认为加减法可以,但我不能用十进制打印数字 0002FFF-10005=1FFA 内存中:0001 0FFFA 打印:十进制165530Assembly 8086汇编中的32位计算器,assembly,calculator,x86-16,masm32,Assembly,Calculator,X86 16,Masm32,32位计算器 有人能帮我在MASM32中使用32位计算器吗。我认为加减法可以,但我不能用十进制打印数字 0002FFF-10005=1FFA 内存中:0001 0FFFA 打印:十进制165530 DATA_HERE SEGMENT mult1 dw 0002H dw 0FFFFH mult2 dw 0001H dw 0005H ans dw 0,0 DATA_HERE ENDS STACK_H
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
首先,将较低的16位打印为十进制FFFA->65530,并将第二个字中的1打印出来 165530 如果您有32位处理器,则可以使用EAX/EDX寄存器执行除法 如果不是,那就更复杂了。然后必须模拟32位除法。那不好玩;-) 这里有一个提示:(是的,您必须处理位)
如果你写一个C程序,将一个长值除以10L,为你的处理器编译它(16位),然后对输出进行解汇编,你可以看到他们是如何做到的。这只是一个想法。我自己没有试过。您必须确保long值足够大,以便编译器没有机会进行优化。;-) 下一个代码,由EMU8086生成,在两个单独的字中获得一个32位的数字,然后将这两个字都转换成字符串。该代码使用最大的32位数字0ffffffh,您可以将其更改为任何其他数字,从0更改为ffffffffh,它将起作用(注释将帮助您了解代码中的情况):
显然,您不能分别打印这两部分的小数。您可以创建32位除法或使用不同的方法,例如重复10次幂的减法。如果您可以找到旧的自发汇编手册/库的副本,该手册/库中预先构建了宏,您可以使用。我对以前的尝试表示歉意(您了解^º),这是适用于任何32位数字的最终版本,从0到FFFFFFFFh。谢谢你的代码,我正在测试NumberString32bit程序,但我认为它打印不正确。1FFA=131066,正在打印165530
.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