1

ラベル.L0で、%eaxレジスタの値を確認すると、正しい値が得られます。しかし、ecxレジスタの値を確認すると、ゼロになります。どうしてか分かりません。おそらくこれが、浮動小数点のセグメンテーション違反が発生する理由です。誰かが私にその理由を理解するのを手伝ってもらえますか?

私が生成しようとしているロジックは

while (sml > 0){
rem = lrg % sml;
lrg = sml;
sml = rem;
}

浮動小数点エラーを与えるアセンブリファイルは次のとおりです。

    .file "gcd.c"
    .section .rodata
.LC0:
    .string "%d"
.LC1:
    .string "%d\n"

    .text
    .globl main
    .type main, @function
main:
    pushl %ebp
    movl  %esp, %ebp
    andl  $-16, %esp
    subl  $32, %esp

    leal  -8(%ebp), %eax    #scan a value
    movl  %eax,  4(%esp)
    movl  $.LC0,  (%esp)
    call scanf

    leal  -12(%ebp), %eax   #scan a value
    movl  %eax,  4(%esp)
    movl  $.LC0,  (%esp)
    call scanf


.L2:
    movl $0, %eax
    cmpl -8(%ebp),%eax
    jle .L0
    jmp .L1

.L0:
    movl  -12(%ebp),%eax
    movl -8(%ebp),%ecx
    movl %eax,%edx
    sarl $31, %edx
    idivl %ecx
    movl %edx,%eax
    movl %eax, -16(%ebp)
    movl -8(%ebp),%edx
    movl %edx, -12(%ebp)
    movl -16(%ebp),%edx
    movl %edx, -8(%ebp)
    jmp .L2

.L1:
    movl -12(%ebp), %eax
    movl  %eax,  4(%esp)
    movl $.LC0, (%esp)
    call printf

    movl $0, %edx

    movl $0, %eax       #end of program
    leave
    ret

.LFE2:
    .size     main, .-main 
    .ident     "GCC: (GNU) 4.2.3 (4.2.3-6mnb1)" 
    .section    .note.GNU-stack,"",@progbits
4

1 に答える 1

2

ブレットに同意します。に置き換えjleますjl

于 2012-11-11T08:37:04.273 に答える