LINUX.ORG.RU

Занести в eax единицу, уложившись в 3 байта кода

 ,


0

4

Как занести в eax единицу, уложившись в 3 байта кода, на x86_64?

С x86 всё просто:

xor eax,eax
inc eax

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

31 C0 40

Но c x86_64 засада. Согласно докам от AMD, однобайтовые INC и DEC были выпилены из 64-битного режима.

mov 1, eax

не подходит, потому что в 32-битном режиме оно уже занимает 5 байт, а в 64-битном ещё больше.

Ответ на: комментарий от Chaser_Andrey

пнятно. портаж пилить не хочца

ZuBB ★★★★★
()
Ответ на: комментарий от buddhist

registers are prefixed with a '%' and immed's are prefixed with a '$'

Вот никогда не понимал и не принимал этой фигни. Зачем что-то выделять особым символом?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Вот никогда не понимал статической типизации. Зачем что-то выделять особым идентификатором?

И это я серьезно.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Вот никогда не понимал статической типизации. Зачем что-то выделять особым идентификатором?

Вообще-то, оно ортогонально. Статическая типизация может быть и утиной.

И это я серьезно.

В случае ЯВУ это концептуальный вопрос. В случае синтаксиса ассемблера — вопрос левой пятки разработчика транслятора.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Статическая типизация может быть и утиной

Хорошо, строгая статическая :)

buddhist ★★★★★
()
Ответ на: комментарий от KRoN73

IMHO

1. % — для того чтобы отличать имя объекта (метку) от имени регистра, т.е. movl eax, %eax поместит в регистр eax значение, помеченное одентификатором eax.

2. $ — для отличия непосредственной и прямой адресации, для этого в интеловском синтаксисе служит ключевое слово offset, правда имеет в точности обратный смысл.

anonymous
()
Ответ на: комментарий от KRoN73

Хм... т.е., надо зарезервировать и запрещать в качестве переменных юзать eax,ah,rex?

Если нет, то как транслятор поймет, какой opcode заюзать для команды mov? И как он поймет, что там регистр, а не переменная?

Chaser_Andrey ★★★★★
() автор топика
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от KRoN73

А если резервировать, то надо предусмотреть регистры и расширения на будущее, иначе добавление нового регистра вполне может поломать код, если в коде использовалось (тогда ещё свободное) имя.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

надо зарезервировать и запрещать в качестве переменных юзать eax,ah,rex

Это если не использовать специальный способ разделения пространств имен, т.е. в интеловском синтаксисе нельзя есползовать переменную с именем eax, а в AT&T, где перед именем регистра надо ставить % — можно.

anonymous
()
Ответ на: комментарий от Chaser_Andrey

т.е., надо зарезервировать и запрещать в качестве переменных юзать eax,ah,rex?

Да. И отродясь так было. Во всех языках есть зарезервированные слова.

KRoN73 ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

А если резервировать, то надо предусмотреть регистры и расширения на будущее, иначе добавление нового регистра вполне может поломать код

Новые регистры всё равно потребуют переписывания транслятора. Так что никто не мешает указать префикс используемого процессора в коде. Одна директива в начале сорца — это куда лучше, чем постоянное лепление лишних символов практически в каждую строчку. Глаза же ломаются на неалфавитных символах там, где без них легко обойтись.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.