如何使用大号?像3441881739,30000000等
mov eax,3441881739
在这种情况下,eax值为负数。怎么解决?分开了吗?怎么样?
我还需要添加/ sub / mul / div等cmp
操作。
有人可以解释并举例说明如何做到这一点吗?
我标记了fasm
和nasm
标签,但也欢迎其他人组装。
我在32位机器上。
答案 0 :(得分:3)
你在装配时就像在纸上一样(长时间添加,长时间乘法,长时间划分)。您将数字分成几部分,随身携带,借用等等。
如果你只能保持0到9之间的数字,你会认为32为(10 * 3 + 2)或“32”。要添加,您可以添加下半部分,根据需要随身携带,然后添加高部分。要减去,您可以更改符号并添加。要相乘,您可以使用:
(A * X + B)(C * X + D)= AC * X ^ 2 +(AD + BC)* X + BD
与“32 * 12”相同的方式为(3 * 10 + 2)(1 * 10 + 2)=(3 * 1)* 100 +(2 * 1 + 3 * 2)* 10 + 2 * 2 = 384
要划分,你可以像在纸上学习一样进行长时间划分。
(请记住所有那些说你必须知道数学编程的人。这是众多原因之一。你必须把事情分解成非常小的部分,以便在装配中对计算机进行编程。)
答案 1 :(得分:1)
如果要处理大于2 32 -1的数字,则需要进行多精度算术运算。例如,要添加一对64位数字,您可以执行以下操作:
mov eax, A_1 ; essentially C = A + B
mov edx, B_1
add eax, edx ; note that for the low word, we just add
mov C_1, eax
mov eax, A_2
mov edx, B_2
adc eax, edx ; but for the high word, we add with carry
mov C_2, eax
访问进位位意味着这比使用大多数高级语言要简单得多。借用减法也可以轻松实现多字减法。乘法和除法有点依赖。正常的32x32位乘法产生64位结果(eax中为低字,edx中为高字)。如果你想要64x64位乘法(给出128位结果),你需要自己实现它。
例如,乘法(不使用内置的mul / imul指令)可以这样做:
mult proc
; multiplies eax by ebx and places result in edx:ecx
xor ecx, ecx
xor edx, edx
mul1:
test ebx, 1
jz mul2
add ecx, eax
adc edx, 0
mul2:
shr ebx, 1
shl eax, 1
test ebx, ebx
jnz mul1
done:
ret
mult endp