0

浮動小数点スタックの操作に取り組んでいます:

fld     qword [perResult]       ;load st0 with perimeter
fsub    qword [firstSide]       ;take st0 and minus firstSide, st0= perimeter - firstSide
fmul    qword [perResult]       ;take st0 and multiply by perimeter, st0 = difference of first equation * perimeter
fstp    qword [res1]            ;take the result off of st0 and place them into variable equation1

;setting up to take perimeter minus second side
fld     qword [perResult]       ;load up perimeter into st0
fsub    qword [secondSide]      ;take st0 and minus secondSide, st0 = perimeter - secondSide
fstp    qword [eq2]

何らかの理由で、 get の式をコメントアウトするとeq2、前の式 get で正しい出力が得られますres1

しかし、式 2 のコメントを外しておく0と、出力として

次の方程式についても同じことが言えます。前の方程式の後に関数があると、何らかの理由でそれがゼロになります。

誰もこの問題に直面したことがありますか?

印刷機能はこちら

mov rdi, areaMsg    
call    print_string
xor r14,r14
movsd   xmm0,  [eq2]    ;move sumResult into xmm0 for printing
mov qword rax, 1
mov r14, [eq2]  ;move result into r14 register for printing float
call    print_float
call    print_nl
jmp Decision
4

1 に答える 1

0

上記のコードに問題はありません。これを Windows XP でコンパイルして実行しました。

bits 16
org 0x100

fld     qword [perResult]       ;load st0 with perimeter
fsub    qword [firstSide]       ;take st0 and minus firstSide, st0= perimeter - firstSide
fmul    qword [perResult]       ;take st0 and multiply by perimeter, st0 = difference of first equation * perimeter
fstp    qword [res1]            ;take the result off of st0 and place them into variable equation1

;setting up to take perimeter minus second side
fld     qword [perResult]       ;load up perimeter into st0
fsub    qword [secondSide]      ;take st0 and minus secondSide, st0 = perimeter - secondSide
fstp    qword [eq2]

ret

align 8

perResult       dq 11.0
firstSide       dq 1.0
res1            dq 0.0 ; (perResult - firstSide) * perResult = (11-1)*11 = 110
secondSide      dq 2.0
eq2             dq 0.0 ; perResult - secondSide = 11-2 = 9

そして、110と9を正しく計算しました(デバッガーでチェック)。

問題がある場合は、表示されていないコードにあります。

于 2012-03-07T01:42:34.140 に答える