Инструкция 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
копирует байт, слово, двойное слово или четверное слово, указанное 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