Assembly 我们可以一次使用两个32位的reg(32+;32=64)来获取64位的值吗?汇编语言8086

Assembly 我们可以一次使用两个32位的reg(32+;32=64)来获取64位的值吗?汇编语言8086,assembly,x86,masm,cpu-registers,irvine32,Assembly,X86,Masm,Cpu Registers,Irvine32,汇编语言8086: 我已经做了加法程序,它在控制台中取两个值,并给出结果。。它只能接受32位(8位)以下的值,如果我们给出更高的值,那么它将在控制台中给出整数溢出错误 如果我想在input1和input2中提供超过32位的值,我将如何做 我想使用32位寄存器将value1添加到value2,并给出64位以下的值(等于16位)。。可以使用2 reg(32+32=64位)的空格 我知道这是可能的,但我不知道怎么做…因为我是汇编语言新手 我正在使用汇编语言中的KIP.R.IRVINE链接库 我们将如何

汇编语言8086:

我已经做了加法程序,它在控制台中取两个值,并给出结果。。它只能接受32位(8位)以下的值,如果我们给出更高的值,那么它将在控制台中给出整数溢出错误

如果我想在input1和input2中提供超过32位的值,我将如何做

我想使用32位寄存器将value1添加到value2,并给出64位以下的值(等于16位)。。可以使用2 reg(32+32=64位)的空格

我知道这是可能的,但我不知道怎么做…因为我是汇编语言新手

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

我们将如何通过使用2 32位寄存器给出64位值?或者我们将如何使2 32位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

您可以结合使用
ADC
ADD
向存储在2个32位寄存器中的64位整数添加内容

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

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

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

上述信息应足以读取64位整数并将其相加

为了打印总和,您需要将64位整数除以10,这样您就可以将64位整数转换为它的十进制表示形式(
hint:4=1234 mod 10(然后123=1234/10)、3=123 mod 10(然后12=123/10)、2=12 mod 10(然后1=12/10)、1=1 mod 10(然后0=1/10,停止)


我现在不打算解释如何使用2
DIVs
将64位除法除以10。首先让其余部分工作。

8086没有32位寄存器,例如
eax
edx
。您想创建32位386+代码,还是为8086+创建16位代码?您可以在代码中使用
eax
edx
,但需要8086的解决方案。这是不连贯的。