英特尔8086组装:加/分非常大?

时间:2014-04-25 07:56:16

标签: assembly

如何在x86程序集中添加或分配非常大的数字?

E.g输入:

第一行:最大20位数字
第二行:+/-
第三行:最大20位数字

当用户退出程序时,这些行会重复。

有没有人有任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

ADC(带有进位)指令是你的朋友。对于任何汇编程序,此操作都是相同的:

  1. 清除进位
  2. 指向大操作数1的第一个单词
  3. 指向大操作数2的第一个单词
  4. 指向结果词
  5. 循环操作数中的单词数:
  6. 在每个操作数的当前字上使用ADC,将结果存储在结果中
  7. 将所有指针递增一个单词。
  8. 进位标志将指示加法是否溢出。

    对于减法,首先取消第二个操作数。

    编辑:你问了一个例子。这里有一些(可能是可怕的)80386代码,可以将2个双字组合在一起。警告:我已经写了20年的汇编语言了。

    section .text
        global _start         ;must be declared for using gcc
    
    _start:                  ;tell linker entry point
    
        clc                  ; clear carry flag
        mov ecx, len        ;calculation length in ecx
        mov esi, 0           ; esi is index register into array of longwords
    myLoop:
        mov eax, [operand1+esi*4] ; move operand1 into register A
        adc eax, [operand2+esi*4] ; add with carry operand 2 into register A
        mov [result+esi*4], eax ; store register a into result
        inc esi                 ; increment index
        loop myLoop             ; decrement count of words to do and jump if not zero
    
        ; at this point the answer will be in result...result+7, low order words first
    
        mov eax, 1          ;system call number (sys_exit)
        int 0x80            ;call kernel
    
    section .data
    
    operand1 dd 0,10 ;low order words first. value = 10 * 4.2bn 
    operand2 dd 0,20 ; low order words first. value = 20 * 4.2bn
    result dd 0,0
    len equ ($ - result)/4          ;number of words in each operand
    

答案 1 :(得分:0)

有两种方法可以做到这一点。第一种方法是直接在ASCII字符上进行加法/减法。在这种情况下,您不能只使用ADCSBB指令;并且必须使用您自己的“加/减数字”代码实现您自己的“每个数字”循环。

第二种方法是将用户的ASCII转换为整数,然后进行整数的加法/减法,然后将得到的整数转换回ASCII(显示它)。 ASCII到整数转换涉及将大整数乘以10;并且整数到ASCII的转换涉及大整数的除(和模)10。

对于你的情况,第一种方式更快(也可能更容易),而第二种方式是让你学到更多,成为更好的程序员。