2015-10-19 3 views
1

В чем смысл следующего кода?сборка x86 test si

mov si, [L10003248] 
test si, si 
jnz L10004356 

Я думаю, что это означает переход к L10004356 если L10003248 адрес не является пустым. Я думаю, что это не относится к значению, хранящемуся в L10003248, иначе оно использовало word ptr.

Является ли мое предположение правильным?

Это звучит не логично. Поскольку этот переход выглядит тривиальным.

У меня нет информации о компиляторе.

+3

Это ** делает ** относятся к значению, сохраненному в 'L10003248'. Вы, кажется, неправильно понимаете 'ptr': http://www.c-jump.com/CIS77/ASM/Instructions/I77_0250_ptr_pointer.htm – Downvoter

+0

@cad Пожалуйста, сделайте это ответом. –

ответ

2
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 и т. д.).

2

[L10003248] означает * L10003248, это значение, хранящееся в адресе L10003248.

Так что ваш код на самом деле означает:

si = *L10003248; 
if (si != 0) 
    jmp L10004356 
Смежные вопросы