Почему nasm и yasm дают код операции 67 для инструкции mov r16, word [r64 - 3]?

В сборке x86-64 у меня есть следующая инструкция

mov        dx, word [esi-5]

Nasm 2.13.03 генерирует:

66 67 8B 56 FB 

yasm 1.3.0 генерирует:

67 66 8B 56 FB 

Коды операций 66 67 являются модификаторами, поэтому 8B 56 FB сам по себе:

 mov        edx, dword [rsi-5]

Я заметил, что:

66 8B 56 FB 

также оценивается как:

mov        dx, word [rsi-5]

У меня два вопроса:
1) Почему nasm и yasm выдают этот 67 байтовый код операции? (67 самого по себе недостаточно, чтобы уменьшить edx до dx, необходимо включить 66 )
2) Есть ли способ выдать более короткую 4-байтовую инструкцию без 67 в nasm/yasm?


person Kamil.S    schedule 25.03.2018    source источник
comment
Ничего из этого не имеет смысла. Прежде всего, инструкция заканчивается на fb, 85 является частью следующей инструкции. Во-вторых, даже тогда 66 67 8b 46 fb дизассемблируется в mov ax, word [esi-5], что не совсем так, как вы написали. Вы где-то ошиблись, записывая это?   -  person fuz    schedule 25.03.2018
comment
67 должно сделать адрес в [esi-3] а без него будет [rsi-3] значит где-то проблема   -  person Sami Kuhmonen    schedule 25.03.2018
comment
@fuz последний байт был лишним, я его удалил. В любом случае 66 8B 56 FB в Hopper оценивается как mov dx, word [rsi-3]   -  person Kamil.S    schedule 25.03.2018
comment
@ Камил.С Нет, это неправильно. 66 8b 56 fb это mov dx, word [rsi-5]. Вы где-то ошиблись, записывая это?   -  person fuz    schedule 25.03.2018
comment
@fuz Ненавижу признавать, но я это сделал, разница в word [rsi-5] и word [esi-5]   -  person Kamil.S    schedule 25.03.2018
comment
@ Kamil.S Именно так, как уже сказал Сами Кухмонен. Если вы не должны игнорировать старшие биты rsi или полагаться на то, что esi является расширенным знаком, вы обычно можете изменить [esi-5] на [rsi-5] без вреда для себя.   -  person fuz    schedule 25.03.2018


Ответы (1)


В вопросе сделано ложное предположение 66 8B 56 FB

mov        dx, word [rsi-5] 

эквивалентно

`66 67 8B 56 FB` or `67 66 8B 56 FB` 

mov        dx, word [esi-5] 

66 уменьшает edx до dx
67 уменьшает [rsi-5] до [esi-5]

person Kamil.S    schedule 25.03.2018
comment
Кстати, вам может понадобиться movzx edx, word [rsi-5], чтобы избежать потенциального замедления частичной регистрации либо из позднее чтение edx или на некоторых процессорах, чтобы избежать ложной зависимости. Кроме того, 0xFB = 256-5. Ваш машинный код определенно имеет смещение -5, а не -3. - person Peter Cordes; 26.03.2018
comment
@PeterCordes movzx - очень изящное предложение, очень ценное - person Kamil.S; 26.03.2018