2016-02-19 2 views
0

Допустим, я объявлена ​​структура, как так:Раздвигая содержимое типа структуры на стек x86

struct VEC 
    x dd ? 
    y dd ? 
ends 

Тогда я объявляю некоторые данные структуры:

section '.data' data readable writeable 
vec1   VEC  5,4 
vec2   VEC  3,2 

Теперь я хочу нажимайте содержимое ячеек памяти vec1 и vec2 в стек. Я делаю что-то вроде этого:

push sizeof.VEC [vec1]   
push sizeof.VEC [vec2] 

Это не скомпилировано. Ошибка Возвращается:

error: operand size not specified.

Я хочу знать, есть ли способ, чтобы поместить содержимое этого типа структуры в стек. Или это незаконно в x86 в первую очередь?

Я компиляция это на Windows 10 с использованием плоского ассемблера версии 1.71.49

В общем, на мой вопрос о том, как получить ассемблер кодирование толчка [MEM] с правым операндом размером

+1

'sizeof.VEC' - числовое выражение. Использует ли '8 [vec1]' значение '[vec1 + 8]' в FASM? Если это так, это то, что вы получили бы (если бы вы использовали его в контексте, где размер операнда был подразумевается чем-то другим или с qword или qword ptr). В любом случае, это просто вопрос о том, как получить ваш ассемблер будет кодировать 'push [mem]' с правильным размером операнда. (16-битные и 64-битные нажатия кодируются в режиме 64 бит, но не 32-битные нажатия. 'REX.W = 0 толкать что-то" в качестве незаконной инструкции, наоборот в инструкции Intel insn ref, в которой утверждается, что размер операнда может быть переопределен с помощью '66H' или' REX.W') –

+0

В целом, как вы уже указывали, мой вопрос заключается в том, как заставить ассемблер кодировать push [mem] с правый размер операнда – user1720897

+0

Это было в ответ на * Или это незаконно в x86 в первую очередь? *. Это тривиально: если ваша структура 16 или 64b, они да. В противном случае нет! –

ответ

2

Это всего лишь вопрос о том, как заставить ваш ассемблер кодировать push [mem] с правильным размером операнда. 16 бит и 64 бит push es кодируются в 64-битном режиме, но не 32 бит push эс. REX.W=0 push something ошибки как недопустимая инструкция, вопреки insn реф руководству Intel, утверждая, что размер операнда может быть переопределен с 66H или REX.W:

Операндом размера. Флаг D в текущем дескрипторе сегмента кода определяет размер операнда по умолчанию; он может быть переопределен префиксами команд (66H или REX.W). Размер операнда (16, 32 или 64 бит) определяет величину, на которую декремент стека уменьшается (2, 4 или 8).

Обратите внимание, что это документирование 32 и 64-битного режима. Конечно, 32-битные толки доступны в 32-битном режиме. ( вики для ссылок на инструкции)


Поскольку существует множество STRUCT размеров, которые не pushable с одной командой, то маловероятно, что какая-либо синтаксис для выбора слова, DWORD или QWORD размера операнда на основе размера структуры. Вы можете использовать макросы, чтобы сделать это сами, хотя, если вы действительно этого хотели.

push Входящие большие структуры не соответствуют нормальным вызовам вызова, так что это еще одна причина, по которой для нее не существует синтаксического сахара. Обычно объекты, слишком большие для размещения в регистре, передаются по ссылке. Меньшие объекты могут передаваться по значению. Итак, вы не можете просто параметризовать размер операнда push, чтобы сделать гибкий код; вам нужно будет использовать макрос, чтобы испускать другую команду для передачи по значению vs. pass по ссылке, в зависимости от размера структуры.

Поскольку ваша структура является 64-битной, вы можете только нажать на всю-структуру с одной команды в 64-разрядном режиме:

push qword [vec1] 
push qword [vec2] 

(Или qword ptr, если FASM использует MASM синтаксис вместо NASM).

Смежные вопросы