NASM

2012-03-07 3 views
0

Работой делать манипуляции на стеке с плавающей запятой:NASM

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] 

По какой-то причине, если я закомментировать уравнение, чтобы получить eq2, я получу правильный выход в предыдущем уравнении, чтобы получить res1,

, но если оставить уравнение 2 раскомментируйте я получаю 0 в качестве выходного сигнала

и то же самое для следующего уравнения, по какой-то причине это обнуление его, если есть функция после того, как го e предыдущий.

Кто-нибудь когда-либо сталкивался с этой проблемой раньше?

здесь функция печати

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 

ответ

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 (проверено в отладчике).

Если есть проблема, это код, который вы не указали.

+0

ОК, гул тогда он должен быть так, как я печатаю, – user1050632