Чтобы вычислить указатель во время выполнения из регистра и статического адреса , вы можете использовать
lea rsi, [hello_str + r10]
(Требуется режим адресации reg + disp32
, поэтому работает только в исполняемых файлах, отличных от PIE, в Linux, где статические данные находятся на 2 ГБ виртуального адресного пространства.)
Или для итерации , используйте lea rsi, [rel hello_str]
вне цикла, затем используйте inc rsi
для перехода к следующему байту. (syscall
не уничтожает rsi
). Или, очевидно, намного лучше, передать большую длину одному write
системному вызову.
mov rsi, hello_str + 1
рассчитывается при сборке + время соединения , поэтому невозможно включить значение регистра времени выполнения в расчет. Операндом источника для mov-немедленного должен быть константа времени сборки. Инструкции, которые вычисляют что-то из регистра, имеют другую мнемонику: синтаксис для LEA
использует синтаксис с операндом памяти.
Чтобы загрузить из памяти, вы бы хотели, чтобы movzx esi, byte [hello_str + r10]
расширил нулевой байт из памяти до RSI.