2012-03-21 10 views
0

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)!です。数値が大きくなると、階乗でオーバーフローが発生します。私はちょうど私がオーバーフロー条件を設定する方法を理解していません。

+2

オーバーフロー条件は、算術演算命令によって自動的に設定されます。あなたはそれらを読む方法を知る必要があります。 – Mysticial

+0

返信いただきありがとうございます。私は自分の状態フラグを入れているはずです。私は自分の状態フラグをどのように入れるのかという問題を抱えているだけです。 – user1282285

+0

質問とあなたの意見に基づいて、これは宿題であると思われるので、宿題タグを追加しました。宿題でない場合は、自由にタグを削除してください。 –

答えて

2

1)あなたの算術演算命令は、潜在的にオーバーフロービット )オーバーフローの「JO」(ジャンプを設定)と「JNO」ではないオーバーフロー上(ジャンプ)あなたが分岐する可能性があります操作は、あるによってオーバーフローが発生したかどうかを確認する

3) "JO"の後に "%eax"を0に設定するだけです。

4)優秀な、優れたリソースあなたはすでにそれに慣れていない場合:x86アーキテクチャ上で

Programming from the Ground Up, Jonathan Bartlett

+0

ありがとうございました! JOは非常に役に立ちます。また、リソースのために。 – user1282285

1

、演算命令は、addl 8(%ebp), %eaxとして実行したときに条件コードがCPUに設定されていますステータスワード。条件コードによって動作が異なる命令があります。

特定の条件で、コードに代替パス(分岐を実行)を設定できます。 x86は、Jxxニーモニック:JA, JAE, JB, JBE, JC, JCXZ, ..., JZの下で条件付き分岐命令ファミリを持っています。たとえば、JZは、ゼロの場合にジャンプすることを意味します。命令がゼロの結果を生成した場合はブランチを取り、ゼロフラグを設定します。 JOがオーバーフローに飛びついています。

条件をバイトデータに変換して、レジスタまたはメモリに格納することもできます。 SETA, SETAE, SETB, ..., SETZ:これは、条件分岐のようにも数多くある命令のSETxグループによって行われ

x = (y != 3); /* if (y != 3) x = 1; else x = 0 */ 

:これは次のようにC式をコンパイルするのに便利です。例えば、ゼロ条件が真であれば、SETZは与えられたバイトを1に設定する。例えば。

seto %bl /* set bottom byte of B register to 1 if overflow flag set */