2つの関数を記述する必要があります。また、プロセッサの条件コードを使用してオーバーフロー条件を検出し、エラーが発生したことを示すために0
を戻す必要があります。私はその機能を書くことができました。Assembly Langauge X86のオーバーフロー状態を検出する方法
.file "formula.c"
.text
.globl _nCr
.def _nCr; .scl 2; .type 32; .endef
_nCr:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
testl %eax, %eax
call _factorial
movl %eax, -12(%ebp)
movl 12(%ebp), %eax
addl $1, %eax
movl %eax, (%esp)
call _factorial
movl %eax, -16(%ebp)
movl 12(%ebp), %eax
notl %eax
addl 8(%ebp), %eax
movl %eax, (%esp)
call _factorial
movl %eax, -20(%ebp)
movl -16(%ebp), %eax
movl %eax, %edx
imull -20(%ebp), %edx
movl %edx, -28(%ebp)
movl -12(%ebp), %eax
movl %eax, %edx
sarl $31, %edx
idivl -28(%ebp)
leave
ret
.globl _factorial
.def _factorial; .scl 2; .type 32; .endef
_factorial:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -8(%ebp)
movl $1, -4(%ebp)
jmp L3
L4:
movl -8(%ebp), %eax
imull -4(%ebp), %eax
movl %eax, -8(%ebp)
addl $1, -4(%ebp)
L3:
movl -4(%ebp), %eax
cmpl 8(%ebp), %eax
jle L4
movl -8(%ebp), %eax
leave
ret
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.align 4
この機能は基本的にn!/r!(n-r)!
です。数値が大きくなると、階乗でオーバーフローが発生します。私はちょうど私がオーバーフロー条件を設定する方法を理解していません。
オーバーフロー条件は、算術演算命令によって自動的に設定されます。あなたはそれらを読む方法を知る必要があります。 – Mysticial
返信いただきありがとうございます。私は自分の状態フラグを入れているはずです。私は自分の状態フラグをどのように入れるのかという問題を抱えているだけです。 – user1282285
質問とあなたの意見に基づいて、これは宿題であると思われるので、宿題タグを追加しました。宿題でない場合は、自由にタグを削除してください。 –