Для меня это похоже на ошибку в парсере. То есть ассемблер должен был генерировать ошибку, но по какой-то причине этого не происходит, и вместо этого заканчивает странным образом анализом этих чисел.
Это не то же самое, что сказать, что поведение не определено Результаты кажутся вполне предсказуемыми.
Давайте рассмотрим несколько базовых 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
).