我们可以一次使用两个32位reg(32 + 32 = 64)来使它能够采用64位值吗?汇编语言8086

时间:2013-04-20 22:46:45

标签: assembly x86 masm cpu-registers irvine32

汇编语言8086:

我已经制作了添加程序,它在控制台中需要两个值并给出结果..如果我们给出更高的值它只能取32位(8位)以下的值然后它会在控制台中给出整数溢出的错误< / p>

如果我想在input1和input2中给出超过32位的值,我将如何做?

我想通过使用32位寄存器将value1添加到value2并给出64bit以下的值(等于16位)..可以使用 2 reg(32 + 32 = 64bit)的空间? ...

我们如何才能使2位32位寄存器使其成为64位我知道这是可能的但我不知道该怎么做...因为我是汇编语言的新手

我在汇编语言中使用KIP.R.IRVINE链接库

如何通过使用2个32位reg来提供64位值?或者我们如何使2 32bit reg获得64位值?

这是32位加法的代码:

INCLUDE Irvine32.inc

.data

 Addition BYTE "A: Add two Integer Numbers", 0

 inputValue1st BYTE "Input the 1st integer = ",0
 inputValue2nd BYTE "Input the 2nd integer = ",0

  outputSumMsg BYTE "The sum of the two integers is = ",0

   num1 DD ?
   num2 DD ?
   sum  DD ?

   .code

   main PROC

   ;----Displays addition Text-----

  mov edx, OFFSET Addition
  call WriteString
  call Crlf
  ;-------------------------------

  ; calling procedures here

   call InputValues
   call addValue
   call outputValue

   call Crlf

   jmp exitLabel


   main ENDP


      ; the PROCEDURES which i have made is here


  InputValues PROC
  ;----------- For 1st Value--------


   call Crlf
   mov edx,OFFSET inputValue1st ; input text1
   call WriteString

   ; here it is taking 1st value
   call ReadInt    ; read integer
   mov num1, eax   ; store the value




     ;-----------For 2nd Value----------



      mov edx,OFFSET inputValue2nd ; input text2
      call WriteString


      ; here it is taking 2nd value
      call ReadInt    ; read integer
      mov num2, eax   ; store the value

      ret
      InputValues ENDP




     ;---------Adding Sum----------------

     addValue PROC
     ; compute the sum

     mov eax, num2  ; moves num2 to eax
     add eax, num1  ; adds num2 to num1
     mov sum, eax   ; the val is stored in eax

     ret
     addValue ENDP

     ;--------For Sum Output Result----------

     outputValue PROC

     ; output result

     mov edx, OFFSET outputSumMsg ; Output text
     call WriteString


     mov eax, sum
     call WriteInt ; prints the value in eax


     ret
     outputValue ENDP


     exitLabel:
     exit


    END main

1 个答案:

答案 0 :(得分:2)

您可以将ADCADD结合使用,为存储在2个32位寄存器中的64位整数添加内容。

您可以将SHLDSHL结合使用,向左移动存储在2个32位寄存器中的64位整数。

如果可以进行64位加法和64位移位,则可以轻松地将64位整数乘以10(hint: 10=8+2, x*10=x*8+x*2)。

您可能需要它才能从控制台读取64位整数。您需要将它们读作ASCII strings,然后使用重复乘以10和加法(hint: 1234 = (((0+1)*10+2)*10+3)*10+4)转换为64位整数。

上面应该有足够的信息来读取64位整数并添加它们。

为了打印总和,您需要将64位除以10,这样您就可以将64位整数转换为ASCII string的十进制表示(hint: 4=1234 mod 10 (then 123 = 1234 / 10), 3 = 123 mod 10 (then 12 = 123 / 10), 2 = 12 mod 10 (then 1 = 12 / 10), 1 = 1 mod 10 (then 0 = 1 / 10, stop))。

我现在不打算解释如何使用2 DIVs进行64位除法。让其他人先工作。