2016-03-26 6 views
3
TITLE Unmasking an Exception (Exceptions.asm) 

; This program shows how to mask (set) and unmask (clear) the divide by zero 
; exception flag. 

INCLUDE Irvine32.inc 

.data 
ctrlWord WORD ? 
val1 DWORD 1 
val2 REAL8 0.0 

.code 
main PROC 
finit  ; initialize FPU (divide by zero is masked) 

; By unmasking, we enable the divide by zero exception. 

fstcw ctrlWord    ; get the control word 
and ctrlWord,1111111111111011b ; unmask Divide by 0 
fldcw ctrlWord    ; load it back into FPU 

fild val1 
fdiv val2      ; divide by zero 
fst val2 

exit 
main ENDP 
END main 

Привет всем, я новичок в MASM и беру себя через некоторые интернет-проектов, я могу найти и у меня возникают проблемы с этим, как вы можете увидеть его разоблачает разделить на 0, но как я могу изменить это, чтобы замаскировать это же исключение? Если вы можете объяснять и быть как можно более подробным, что поможет тонну!Маскировка деление на 0 исключение сборки MASM

+1

Установите один и тот же бит в 1, а не очищая ее до 0? Используйте побитовое 'OR'. – Jester

+0

Смотрите, им очень очень понравилось, поэтому я не понимаю, что вы имеете в виду.) = – JimBob101

+1

Узнайте, как работают [побитовые операторы] (https://en.wikipedia.org/wiki/Bitwise_operation), что является элементарным для любого программирования. Затем используйте 'или ctrlWord, 100b'. – Jester

ответ

3
fstcw ctrlWord    ; get the control word 
and ctrlWord,1111111111111011b ; unmask Divide by 0 
fldcw ctrlWord    ; load it back into FPU 

Маска бит (ЗМ) за исключением нулевого деления является бит 2 управляющего слова FPU. Это улучшит читаемость, если вы не указали длинное значение маскировки, например «1111111111111011b».
Поскольку бит 2 представлено значением 4, более читаемым способ очистить этот бит:

and ctrlWord, not(4) 

Некоторые люди даже предпочитают писать and ctrlWord, not(1<<2), так как это одна до сих пор сохраняет ссылку на номер бита (2 в Это дело).

Теперь при принятии этого улучшения, маскируя исключения нулевого деления становится вопросом изменения and в or и сбросив оператор в не.

and ctrlWord, not(4) ----> or ctrlWord, 4 

В качестве альтернативы вы можете также очистить или установить бит, используя btr и bts инструкции:

and ctrlWord, not(4) ----> btr ctrlWord, 2   ;Clears bit 2 
or ctrlWord, 4   ----> bts ctrlWord, 2   ;Sets bit 2