Сейчас на форуме: jinoweb (+6 невидимых) |
eXeL@B —› Программирование —› Верно ли, что в этом asm коде - Undefined Behaviour? |
Посл.ответ | Сообщение |
|
Создано: 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 ? |
|
Создано: 03 февраля 2019 17:15 · Личное сообщение · #2 Нет неправильно. C0, C2 и C3 это биты 8, 10 и 14 регистра SW - они здесь не проверяются. Проверяются SF и IE. |
|
Создано: 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. В чем я ошибаюсь? |
|
Создано: 03 февраля 2019 19:26 · Личное сообщение · #4 Ни в чём, не заметил что в test проверяется ah. Тогда по идее правильно - чисто теоретически поведение не определено. Это скорее всего проверка на запуск под ВМ или типа того. Ты же понимаешь что реальный процессор туда всё равно что-то запишет, скорее всего значения фиксированные, просто не документированы. |
|
Создано: 03 февраля 2019 20:03 · Поправил: Boostyq · Личное сообщение · #5 cppasm пишет: реальный процессор туда всё равно что-то запишет Понятно что там будет значение Другое дело что неизвестно запишутся ли нули или значение останется с прошлых инструкций и будет ли эффект одинаковым на всех процессорах (нет) И делать какие-то условия с undefined значениями ну такое... ----- В облачке многоточия |
|
Создано: 04 февраля 2019 13:18 · Личное сообщение · #6 Такое, не такое - а по факту работать будет. Хотя если следовать мануалам - код кривой. Я вот специально проверил: в мануалах как Intel, так и AMD, состояние флагов C0, C2 и C3 после выполнения FSTP - Undefined. А по факту на том железе где смог проверить - флаги не меняются, остаётся предыдущее значение. Т.е. работать скорее всего будет, но код потенциально кривой. Лучше поменять местами FSTP ST и FNSTSW AX и получить гарантированно рабочий код. |
|
Создано: 04 февраля 2019 20:17 · Поправил: difexacaw · Личное сообщение · #7 x0x0x Вся подробная инфа есть в манах на архитектуру. Там есть подробнейшее описание, псевдокод обработки инструкции, избыток инфы. Для каждой инструкции чётко определено состояние изменяемого контекста, для каждой инструкции это указано. Вам нужен кто то что бы за вас почитал архитектурный док, тоесть сами это вы сделать не можете. А причины какие, забанил гугл, слабоумие, есчо что то ? ----- vx |
eXeL@B —› Программирование —› Верно ли, что в этом asm коде - Undefined Behaviour? |