で大きな数を使用する方法は?3441881739,30000000など
mov eax,3441881739
この場合、eax値は負の数です。それを修正する方法は?それを分割しますか?どうやって?cmp
add / sub / mul/divなどの操作も行う必要があります。
誰かがそれを行う方法を説明し、例を挙げてもらえますか?
マークfasm
とnasm
タグを付けましたが、他のアセンブリも大歓迎です。私は32ビットマシンを使用しています。
紙で行うのと同じ方法でアセンブリで行います(長い加算、長い乗算、長い除算)。あなたは数を部分に分割し、あなたは運び、あなたは借りる、等々。
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つです。アセンブリでコンピューターをプログラムするには、物事を非常に小さな部分に分解する必要があります。)
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