2016-01-29 9 views
0

При просматриваемой через x86 Assembly Language Reference Manual, я наткнулся на это определение в немедленного операнда:определение значения инлайн

Операнды могут быть немедленным (то есть, постоянные выражения, которые оценивают в значение строкового), [...]

Если я правильно понял, выражение возвращает значение. Вызывает ли выражение, а затем возвращает постоянное значение? Значение inline означает, что оно будет заменено каким-либо другим значением после прохождения процесса сборки?

ответ

1

Это просто означает, что выражение должно быть значением, которое можно вычислить во время сборки. Примеры константных выражений включают в себя:

5 
5+5 
5*5 
MyConstant (where this constant is defined somewhere else) 
MyConstant*4 

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

Напротив, не константные выражения имеют значения, которые невозможно определить во время сборки. Примеры включают:

ah  (a register) 
ah*al (expression containing registers) 
[0x800] (a memory location) 
+0

Не могли бы вы рассказать мне, что такое фактическое значение «inline» в контексте языков ассемблера? –

+1

@MaxHerrmann Я не видел слова inline, используемые в руководствах по сборке, но здесь это просто означает «постоянное значение». Обратите внимание, что 'mov eax, 1 + 2' и' mov eax, 1 + 1 + 1' и другие варианты постоянных выражений, возвращающих 3, собираются в просто «mov eax, 3'. То естьэто выражения, которые оцениваются ассемблером. –

5

Получает ли постоянное выражение постоянное значение?

Да. Непосредственный операнд создает постоянное значение в коде операции. Например, mov eax, 3 создает код операции, состоящий из нескольких байтов - согласно x32/x64 Intel Manual.

B0+ rb ib MOV r8, imm8 OI Valid Valid Move imm8 to r8. 
B8+ rw iw MOV r16, imm16 OI Valid Valid Move imm16 to r16. 
B8+ rd id MOV r32, imm32 OI Valid Valid Move imm32 to r32. 
C6 /0 ib MOV r/m8, imm8 MI Valid Valid Move imm8 to r/m8. 
C7 /0 iw MOV r/m16, imm16 MI Valid Valid Move imm16 to r/m16. 
C7 /0 id MOV r/m32, imm32 MI Valid Valid Move imm32 to r/m32. 

Например: для 32-битного режима следующие байтовые комбинации представляют действительные коды операций. Это означает, что для mov destination, 3 существует несколько возможностей:

b0 03     mov al, 3 
66 b8 03 00    mov ax, 3 
    b8 03 00 00 00   mov eax, 3 
    c6 45 00 03    mov byte ptr [xxx], 3 
66 c7 45 00 03 00   mov word ptr [xxx], 3 
    c7 45 00 03 00 00 00 mov dword ptr [xxx], 3 

B0h и B представляют собой один байты коды операции, C6H и C представляют собой двухбайтовый код операции, состоящую из кода операции байт и Mod/RM-байты кодирования адресации режим - в этом случае indirect addressing. 66h обозначает Operand-Size Prefix, указывающий, что следующая инструкция использует 16-разрядный (внеполосный) операнд - исключение по сравнению с обычным операндом 32-разрядного режима. 8-разрядный операнд кодируется другим кодом операции. Остальные байты представляют собой кодировку 8/16/32-битного значения 3.

Имеет ли встроенное значение, что оно будет заменено каким-либо другим значением после прохождения процесса сборки?

No Assembl (y | ing) - это процесс включения постоянных значений в результирующие коды операций (seqeunces of bytes). В некотором смысле, все является встроенным в сборку.

+0

Хорошая работа! Прибыль заработала. :) –