2014-04-25 50 views
0

如何在x86程序集中添加或分配非常大的数字?Intel 8086汇编:add/sub非常大?

E.g输入:

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

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

有没有人有任何想法?

谢谢!

回答

2

ADC(带进位)指令是你的朋友在这里。此操作为任何汇编相同的:

  1. 清楚进位位在大操作数的第一个字1
  2. 点在大操作数的第一个字
  3. 点2
  4. 点结果也就是说
  5. 循环的话在你的操作数数:
  6. 使用ADC对每个操作数的当前单词,并将结果存储在结果
  7. increme nt所有的指针一个字。

进位标志将指示添加溢出。

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

编辑:你问了一个例子。这里有一些(可能是可怕的)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 
+0

谢谢你的回答!也许,你能举一个例子吗? – werdf

+0

对于减法,使用'SBB'指令(不是'ADC'指令)。 – Brendan

+0

:-)建议你在80x86汇编器上购买一本书。这是一个很大的话题,教600个字符... –

0

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

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

对于您的情况,第一种方法更快(可能更容易),而第二种方法会让您学到更多,一个更好的程序员。