Использование TYPE инструкции сборки MASM x86 - PullRequest
0 голосов
/ 16 апреля 2020

Я все еще изучаю ассемблер, и я запутался, когда добрался до этой части кода:

add SI, TYPE word

Так как я не совсем понимаю, что означает инструкция TYPE, что мы точно добавление в СИ? Если кто-то может проиллюстрировать мне, как это работает, предполагая, что SI установит 0 до достижения add, я буду очень благодарен!

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Из Руководства программиста MASM 6.1:

Операторы SIZEOF и TYPE при применении к типу возвращают размер целого числа этого типа. Атрибут размера, связанный с каждым типом данных:

Data Type      Bytes
--------------------
BYTE, SBYTE    1
WORD, SWORD    2
DWORD, SDWORD  4
FWORD          6
QWORD          8
TBYTE          10

Примечание: для массивов и строк SIZEOF и TYPE не эквивалентны. SIZEOF даст вам общий размер массива / строки в байтах, тогда как TYPE даст вам размер одного элемента массива / строки.

0 голосов
/ 16 апреля 2020

Вы добавляете целое число постоянной времени сборки 2. Он собирается на add si,2.
MASM TYPE foo - та же идея, что и C sizeof(typeof(foo)). 1

Помните, что у вас есть масштабировать от индекса элемента до байтового смещения самостоятельно, например, увеличить указатель на 2 байта до go до следующего word, где в C вы просто используете p++ для увеличения short *p.

MASM также имеет sizeof, который может дать вам размер всего массива вместо одного элемента.


Обычно вы используете add si, type some_array_name, чтобы ваш код приращения мог автоматически изменить, если вы измените массив на dw против db.

Хотя в этом случае несколько бессмысленно, если вы также используете AX вместо AL в других инструкциях, которые фактически загружают или сохраняют от / до [SI].

Вы можете использовать type foo как часть какого-либо другого выражения для вычисления размера или ограничения l oop.


Сноска 1: C / C ++ фактически не имеет ключевого слова typeof; это расширение GNU C. Но название более понятно, чем стандартное ключевое слово C ++ 11 decltype, которое делает то же самое.

...