最大公約数を求めるためには、いくつかのアルゴリズムが存在しますが、ここでは代表的なユークリッドの互除法を使用します。このアルゴリズムは、2つの数を比較して、小さい方の数で大きい方の数を割り、余りを求める操作を繰り返します。そして、余りが0になった時点で、割る数が最大公約数となります。
以下に、アセンブリ言語で最大公約数を求めるコード例を示します(x86アーキテクチャを前提とします):
section .data
; 入力の2つの数
num1 dd 48
num2 dd 36
section .text
global _start
_start:
; num1をeaxレジスタにロード
mov eax, [num1]
; num2をebxレジスタにロード
mov ebx, [num2]
gcd_loop:
; ebxをedxレジスタにコピー
mov edx, ebx
; edxをeaxで割り、余りをedxに格納
div eax, edx
; 余りが0か判定
cmp edx, 0
je gcd_done
; 余りが0でない場合、ebxをeaxにコピーし、繰り返し処理を行う
mov eax, ebx
mov ebx, edx
jmp gcd_loop
gcd_done:
; 最大公約数がeaxに格納されている
; ここでeaxの値を利用して必要な処理を行う
; プログラム終了
mov eax, 1
xor ebx, ebx
int 0x80
上記のコードでは、num1
とnum2
に最初の2つの数を設定し、eax
とebx
レジスタにロードしています。その後、ユークリッドの互除法を利用して最大公約数を求めるためのループ処理を行っています。最大公約数が求められた後は、適宜必要な処理を行ったり、結果を表示したりすることができます。
このように、アセンブリ言語を使用して最大公約数を求めることができます。アセンブリ言語は低レベルの言語であり、直接ハードウェアにアクセスすることができるため、効率的な最適化が可能です。ただし、アセンブリ言語は他の高水準言語に比べて書き込みが複雑であり、理解するのに時間がかかることがあります。