Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8086汇编中的32位计算器_Assembly_Calculator_X86 16_Masm32 - Fatal编程技术网

Assembly 8086汇编中的32位计算器

Assembly 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

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_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