0

汇编语言 8086:

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

如果我想在 input1 和 input2 中提供超过 32 位的值,我该怎么做?

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

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

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

我们将如何使用 2 个 32 位 reg 给出 64 位值?或者我们如何使 2 32bit reg 取 64bit 值?

这是 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
4

1 回答 1

2

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

您可以将SHLD与 结合使用SHL,将存储在 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 进行 64 位除以 10 DIVs。先让其余的工作。

于 2013-04-21T02:29:23.867 回答