В сборке источника вы можете заставить ассемблер вычислять константы времени сборки как
msg: db "hello world", 10 ; 10 = ASCII newline
msglen equ $-msg
Затем, когда вы пишете mov edx, msglen
, он собирается в mov edx, imm32
с подставленной константой. См. Как работает $ в NASM, в точности? для некоторых примеров.
Но в конечном машинном коде все константы времени сборки стали непосредственными или константами данных. (например, ptr_and_length: dq msg, msglen
в разделе данных или родных данных объединяется в адрес и целое число qword, которое является только там в объектном файле, не рассчитанном во время выполнения из чего-либо.)
(Константы времени сборки могут также использоваться как счетчики повторений в макросах или других директивах. (Например,
times power imul eax, ecx
собирается в блок из множества imul
инструкций.
power
- целочисленная константа, определенная с помощью EQU. Или NASM %rep n
/ ... / %endrep
)
Или используется в выражениях времени сборки, поэтому сам размер в буквальном смысле отсутствует в объектном файле, а является лишь результатом некоторых вычислений на его основе. (например, mov edx, msglen+2
или mov ecx, arrbytes/4
, последний может быть в качестве границы для цикла, который учитывает слова, а не байты).