如何在x86程序集中添加或分配非常大的数字?
E.g输入:
第一行:最大20位数字
第二行:+/-
第三行:最大20位数字
当用户退出程序时,这些行会重复。
有没有人有任何想法?
谢谢!
答案 0 :(得分:2)
ADC(带有进位)指令是你的朋友。对于任何汇编程序,此操作都是相同的:
进位标志将指示加法是否溢出。
对于减法,首先取消第二个操作数。
编辑:你问了一个例子。这里有一些(可能是可怕的)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字符上进行加法/减法。在这种情况下,您不能只使用ADC
和SBB
指令;并且必须使用您自己的“加/减数字”代码实现您自己的“每个数字”循环。
第二种方法是将用户的ASCII转换为整数,然后进行整数的加法/减法,然后将得到的整数转换回ASCII(显示它)。 ASCII到整数转换涉及将大整数乘以10;并且整数到ASCII的转换涉及大整数的除(和模)10。
对于你的情况,第一种方式更快(也可能更容易),而第二种方式是让你学到更多,成为更好的程序员。