2015-12-17 2 views
0

У меня проблема со сравнением в tasm. У меня есть кодFCOM не работает в Turbo Assembler

cycle: 
...some code... 
fninit 
fld limit 
fld currentX  
fcom st(1) 
jge exit 
jmp cycle 

Но он переходит к отметке выхода, даже если условия не выполняются. Я проверяю его в turbo debugger, и значения стека fpu являются правильными. Как это исправить?

+2

Вы хотите, чтобы 'fcomi' не' fcom' (при условии, что у вас есть P6 +), иначе вставьте «fstsw ax; lahf', потому что 'fcom' устанавливает только флаги fpu, а не cpu. Также вы должны использовать 'jae' not' jge', так как 'SF' и' OF' обнуляются (это причина безусловного перехода), и только 'ZF' и' CF' имеют смысл. – Jester

+0

Я пытался использовать fcomi, но при запуске tasm.exe myTask.asm получил ошибку «Неверная инструкция». – IvanSorokin

+0

Работает только с P6 +, вам может потребоваться включить этот набор команд ('.686' или слишком много, tasm является древним) – Jester

ответ

4

fcom только устанавливает биты состояния fpu, а не флагов cpu, поэтому вы не можете напрямую использовать условный переход. Существует инструкция fcomi, но это доступно только при использовании процессора P6 + и ассемблера, который понимает такие инструкции. По словам Майкла Пётча, для tasm вам нужна хотя бы версия 5.3. Обходным путем является передача бит состояния fpu в флагов cpu с использованием fstsw ax и sahf.

отметить также, что в любом случае, соответствующие биты состояния FPU C0, C2 и C3 получить переданы CF, PF и ZF соответственно, так что вы должны использовать условный переход, который проверяет эти флаги. В вашем случае это означает jae.

Смотрите также раздел 8.1.4 Ветвление и условные Хода на кодах условий в Руководстве Intel® 64 и IA-32 архитектур программного обеспечения разработчик Тома 1: Базовая архитектуре и конечно же набор инструкций ссылке как обычно.

Смежные вопросы