Перебор строки с регистром - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь написать программу, которая перебирает строку и записывает каждый символ для вывода по одному символу за раз, я пытаюсь использовать регистр в качестве итератора, как в цикле for, чтобы затем индексировать строку но я получаю ошибку «недопустимый тип операнда»

Я устанавливаю r10 на 0

mov r10, 0

и позже в коде после увеличения r10 Я пытаюсь проиндексировать строку, подобную этой, но получаю ошибки

mov rsi, hello_str + r10

это прекрасно работает, когда я делаю это

mov rsi, hello_str + 1

код:

global _start
section .text
_start:  mov rsi, hello_str
         mov r10, 0
loop:    mov rax, 1
         mov rdi, 1
         mov rsi, test + r10 
         ; when i do mov rsi, test + 1 it prints 'e' as expected
         ; when i do mov rsi, test it prints 'H' as expected
         mov rdx, 1
         syscall

         inc r10
         cmp rsi + r10, 0x00
         jne loop


section .data
hello_str: db "Hello, World!", 0xA

Спасибо

1 Ответ

1 голос
/ 05 мая 2019

Чтобы вычислить указатель во время выполнения из регистра и статического адреса , вы можете использовать
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.

...