2017-01-22 18 views
0

В моих работах, которые я получил от университета я получил что-то вроде этого:Ассемблер, для чего используется седьмой бит в инструкции SUB?

SUB 
1. Subtracting value from register 
| 100000 s w | 11 101 reg | value(L) | value(...) | value(...) | value(H) | 

Я знаю, что «ж» стоит. Он указывает, является ли регистр в регистре «reg» 8 или 16/32 бит, но каков параметр «s»? Что это значит? Я искал в Интернете, но я не нашел четкого ответа.

+7

_ «Я искал через Интернет, но я не нашел четкого ответа». _ Не нужно искать в Интернете. Просто получите архитектуры _Intel® 64 и IA-32 Руководство разработчика программного обеспечения. Во всяком случае, '' 'в этом нестандартном описании, похоже, выступает за расширение знака непосредственных операндов. – Michael

ответ

2

s означает знак расширения.

SUB 80-83 обозначает sub reg, imm.

SUB В версии 82 и 83 знака расширить непосредственный операнд, как можно видеть здесь

http://ref.x86asm.net/#column_flds

ш означает бит ш (индекс 0 бит, размер операнда) присутствует; могут быть объединены с битами d или s. 04 ADD s означает бит s (бит-индекс 1, знак-протяженность); может сочетаться с битом w. 6B IMUL.

Позволяет немедленному операнду быть меньшим и, следовательно, позволяет использовать более компактный код.

Вы можете просмотреть полную карту опкода по адресу: http://ref.x86asm.net/geek.html

Обратите внимание, что, как 80 и 82 обозначают арифметика с байтовых операндов. 80 - без, а 82 - с расширением знака; однако расширение знака в байтовом операнде не является оператором, поэтому 82 является псевдонимом для 80.
Чтобы упростить декодирование, Intel предпочитает не переупаковывать избыточные 82 кода операций, а просто разрешать их как псевдонимы для официальных 80-ти.

Карта кода операции x86 содержит около дюжины псевдонимов, продержавшихся в те дни, когда Intel не могла просто выбросить больше кремния в проблему декодирования.

+0

Обратите внимание, что код операции 0x82 является недокументированным псевдонимом для кода операции 0x80. На самом деле нет ничего, что можно было бы подписывать, когда вы делаете вычитание байта. – fuz

+0

Так правильно ли кодировать 'sub al, 7' как' 80 E8 07'? – DualCore

+0

@DualCore Да, это правильно. – fuz