Сохранение и получение элементов строк

Последнее обновление: 03.07.2023

stos

Инструкция stosX сохраняет значение аккумулятора в месте, на которое указывает регистр RDI. После сохранения значения процессор увеличивает или уменьшает значение в RDI в зависимости от состояния флага направления. Данная инструкция имеет следующие формы:

  • stosb: сохраняет байт из регистра AL в место по адресу из регистра RDI

  • stosw: сохраняет слово из регистра AX в место по адресу из регистра RDI

  • stosd: сохраняет двойное слово из регистра EAX в место по адресу из регистра RDI

  • stosq: сохраняет четверное слово из регистра RAX в место по адресу из регистра RDI

Например, изменим изменим определенный элемент массива чисел word, сохранив в него число:

.data
numbers word 20, 21, 22, 23, 24, 25
len = $ - numbers       ; длина строки 
elemSize = 2            ; размер одного элемента
num word 33             ; число для сохранения 
.code
main proc
    lea rdi, numbers[2*elemsize]     ; загружаем адрес третьего элемента массива numbers
    xor rax, rax    
    mov ax, num     ; загружаем слово для замены
    stosw           ; сохраняем по адресу в RDI слово num
    mov ax, word ptr numbers[2 * elemSize]  ; проверяем третий элемент массива numberss
    ret
main endp
end

В данном случае сохраняем число word по адресу в RDI, который указывает на третий элемент в массиве numbers/

С префиксом rep этот процесс повторяется столько раз, сколько указано в регистре RCX.

Частое применение данной инструкции - инициализация массивов и строк некоторым значением. Например, если имеется массив, который надо заполнить числом 2, то можно использовать следующий код

.data
numbers word 20, 21, 22, 23, 24, 25
len = $ - numbers       ; длина строки 
elemSize = 2            ; размер одного элемента
count = len / elemSize  ; количество элементов
num word 2              ; число для инициализации массива
.code
main proc
    lea rdi, numbers
    mov rcx, count  ; количество обрабатываемых слов
    xor rax, rax    
    mov ax, num
    rep stosw
    mov ax, word ptr numbers[2 * elemSize]  ; проверяем третий элемент массива numberss
    ret
main endp
end

lods

Инструкция lods копирует байт, слово, двойное слово или четверное слово, указанное RSI, в регистр AL, AX, EAX или RAX, после чего увеличивает или уменьшает значение регистра RSI на 1, 2, 4 или 8. Данная инструкция имеет следующие формы:

  • lodsb: сохраняет в регистр AL байт по адресу из регистра RSI

  • lodsw: сохраняет в регистр AX слово по адресу из регистра RSI

  • lodsd: сохраняет в регистр EAX двойное слово по адресу из регистра RSI

  • lodsq: сохраняет в регистр RAX четверное слово по адресу из регистра RSI

Например, загрузим в регистр AX третьее число из массива слов:

.data
numbers word 20, 21, 22, 23, 24, 25
elemSize = 2
.code
main proc
    lea rsi, numbers[2*elemSize]    ; адрес третьего числа
    xor rax, rax   
    lodsw       ; AX = 22
    ret
main endp
end
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850