Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› Верно ли, что в этом asm коде - Undefined Behaviour?
Посл.ответ Сообщение

Ранг: 5.0 (гость)
Активность: 0.020
Статус: Участник

Создано: 03 февраля 2019 15:53
· Личное сообщение · #1

.text:004C90B2 fnstsw ax
.text:004C90B4 fcomp ds:flt_68A868
.text:004C90BA test ah, 1 ; AND with wrap registers of FPU
.text:004C90BD fstp st << Sets C0, C2, C3 to Undefined
.text:004C90BF fnstsw ax << Copyes Udefined bits of SW to AX
.text:004C90C1 jnz short loc_4C90DE
.text:004C90C3 test ah, 41h << And with Undefined bits == Undefined Behaviour?!
.text:004C90C6 jp short loc_4C90F9
.text:004C90C8 mov eax, [esp+8+var_4]

Верно я понимаю, что в третьей строке с конца UB ?



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 03 февраля 2019 17:15
· Личное сообщение · #2

Нет неправильно.
C0, C2 и C3 это биты 8, 10 и 14 регистра SW - они здесь не проверяются.
--> Link <--
Проверяются SF и IE.



Ранг: 5.0 (гость)
Активность: 0.020
Статус: Участник

Создано: 03 февраля 2019 18:05
· Личное сообщение · #3

Вы уверены, что правы на счет SF и IE ?
В Ккоманде Test мы проверяем значения регистра ah, то есть старший байт АХ, а старший байт начинается с 8 и далее битов SW.

Добавлено спустя 2 минуты
cppasm пишет:
Проверяются SF и IE.

Вот вам даже статья с WASM:
https://vxlab.info/wasm/article.php-article=1010027.htm
И цитата от туда же:

Проверка, больше ли одно значение другого:

FLD [a]
FCOMP [b]
FNSTSW AX
AND AH,41H
JZ AGreaterThanB

А проверить через fcomp, мы можем только по регистрам C0.. C3. В чем я ошибаюсь?



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 03 февраля 2019 19:26
· Личное сообщение · #4

Ни в чём, не заметил что в test проверяется ah.
Тогда по идее правильно - чисто теоретически поведение не определено.
Это скорее всего проверка на запуск под ВМ или типа того.
Ты же понимаешь что реальный процессор туда всё равно что-то запишет, скорее всего значения фиксированные, просто не документированы.




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

Создано: 03 февраля 2019 20:03 · Поправил: Boostyq
· Личное сообщение · #5

cppasm пишет:
реальный процессор туда всё равно что-то запишет

Понятно что там будет значение
Другое дело что неизвестно запишутся ли нули или значение останется с прошлых инструкций и будет ли эффект одинаковым на всех процессорах (нет)
И делать какие-то условия с undefined значениями ну такое...

-----
В облачке многоточия




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 04 февраля 2019 13:18
· Личное сообщение · #6

Такое, не такое - а по факту работать будет.
Хотя если следовать мануалам - код кривой.
Я вот специально проверил: в мануалах как Intel, так и AMD, состояние флагов C0, C2 и C3 после выполнения FSTP - Undefined.
А по факту на том железе где смог проверить - флаги не меняются, остаётся предыдущее значение.
Т.е. работать скорее всего будет, но код потенциально кривой.
Лучше поменять местами FSTP ST и FNSTSW AX и получить гарантированно рабочий код.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 04 февраля 2019 20:17 · Поправил: difexacaw
· Личное сообщение · #7

x0x0x

Вся подробная инфа есть в манах на архитектуру. Там есть подробнейшее описание, псевдокод обработки инструкции, избыток инфы. Для каждой инструкции чётко определено состояние изменяемого контекста, для каждой инструкции это указано. Вам нужен кто то что бы за вас почитал архитектурный док, тоесть сами это вы сделать не можете. А причины какие, забанил гугл, слабоумие, есчо что то ?

-----
vx



 eXeL@B —› Программирование —› Верно ли, что в этом asm коде - Undefined Behaviour?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати