如何在x86程序集中添加或分配非常大的数字?Intel 8086汇编:add/sub非常大?
E.g输入:
第一行:最大。 20位数字
第二行:+/-
第三行:最大行数20位数字
当用户退出编程时,重复这些行。
有没有人有任何想法?
谢谢!
如何在x86程序集中添加或分配非常大的数字?Intel 8086汇编:add/sub非常大?
E.g输入:
第一行:最大。 20位数字
第二行:+/-
第三行:最大行数20位数字
当用户退出编程时,重复这些行。
有没有人有任何想法?
谢谢!
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
有2种方法可以做到这一点。第一种方法是直接对ASCII字符进行加/减运算。在这种情况下,您不能只使用ADC
和SBB
指令;并且必须用您自己的“加/减数字”代码来实现您自己的“每个数字”循环。
第二种方法是将用户的ASCII转换为整数,然后进行整数的加/减,然后将结果整数转换回ASCII(以显示它)。 ASCII到整数转换涉及大整数乘以10;并且整数到ASCII转换涉及大整数的除法(和模)除以10。
对于您的情况,第一种方法更快(可能更容易),而第二种方法会让您学到更多,一个更好的程序员。
谢谢你的回答!也许,你能举一个例子吗? – werdf
对于减法,使用'SBB'指令(不是'ADC'指令)。 – Brendan
:-)建议你在80x86汇编器上购买一本书。这是一个很大的话题,教600个字符... –