Допустим ли в MASM mov-немедленный с буквенным номером с суффиксом «r», например, 42ae0000r? - PullRequest
1 голос
/ 22 января 2020

Вот инструкция:

    mov eax,42ae0000r

MASM не выдает ошибку, но созданный код выглядит так:

    00000000  B8 19B6A492       mov eax,42ae0000r

Из документации говорится, что суффикс "r" предназначен для шестнадцатеричное значение с плавающей точкой. Этот результат отличается от того, что я получаю, если я использую значение в качестве инициализатора, например:

    mytest4 real4 7d998000r

Код, созданный так:

    0000001B 7D998000       mytest4 real4 7d998000r

Как вы можете видеть результаты разные.

1 Ответ

2 голосов
/ 24 января 2020

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


Это не то же самое, что сказать, что поведение не определено Результаты кажутся вполне предсказуемыми.

Давайте рассмотрим несколько базовых c примеров:

mov ebx,0r
mov eax,1r
mov eax,2r
mov eax,10r

Это объединяется в:

00000405  BB52000000        mov ebx,0x52
0000040A  B85C000000        mov eax,0x5c
0000040F  B866000000        mov eax,0x66
00000414  B8B6000000        mov eax,0xb6

Итак, мы можем видите, что 0r равно 0x52. Это буквально буква R (код ASCII).

Если мы посмотрим на другие строки, то увидим шаблон: сгенерированное значение всегда 'R' плюс значение, предшествующее R раз 10.
Так 1r == 'R' + 1*10, 2r == 'R' + 2*10 и др. c. Если значение становится больше, чем место назначения (в данном случае 32 бита), оно просто усекается до этого размера.

База этих чисел немного любопытна, потому что вы можете использовать шестнадцатеричные цифры (0 ..F), но каждый ди git стоит всего в 10 раз больше, чем тот, что справа. Таким образом, 11r и 0Br приводят к одинаковому значению (0xC0).

...