mov si, [L10003248]
делает относятся к ячейке памяти вL10003248
, а не только адрес. Это однозначно обозначено квадратными скобками.
[...] в противном случае он использовал слово PTR [...]
Нет, word ptr
не указывает на ячейку памяти, но размер ячейки памяти.
Возьмите инструкцию
mov [eax], 12h
Теперь ассемблер может угадать, что размер 12h
есть. Это 16 бит (0012h
)? Или 8 бит (12h
)? Это необходимо передать в качестве информации для ассемблера. Здесь ptr
директива вступает в игру:
mov word ptr [eax], 12h
Теперь ассемблер недвусмысленно знает, что 16 бит данных должны копироваться. Аналогично, можно было добавить byte ptr
и dword ptr
. Для получения дополнительной информации о директиве ptr
, см. this.
Другой случай может быть
mov [16_bit_mem], 12h
Некоторые монтажники (например, MASM) запоминают размер переменной, поэтому эта команда отлично компилируется. OTOH, некоторые (например, NASM и GNU as) этого не делают. В NASM вам необходимо написать
mov word ptr [16_bit_mem], 12h
, чтобы предоставить размер данных ассемблеру. GNU использует синтаксис AT & T по умолчанию (в отличие от синтаксиса Intel, используемого MASM и NASM).Здесь вы добавить суффикс (b
для byte
, w
, для word
, l
для long
и q
для quadword
) к мнемоническому вместо ptr
директивы:
movw 0x12, (16_bit_mem)
Это в AT & T синтаксиса, конечно (операнды источника и адресата, заменены, 0x
вместо h
и т. д.).
Это ** делает ** относятся к значению, сохраненному в 'L10003248'. Вы, кажется, неправильно понимаете 'ptr': http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm – Downvoter
@cad Пожалуйста, сделайте это ответом. –