Проверить работу программы для разного числа байтов.
# для служебного кода используется '}' (ASCII 125)
.equ END_OF_STRING, 125
.section .data
# Исходная строка
string:
.asciz "Hello, World!}"
# Размер исходной строки
string_size:
.equ size, 14
.section .text
.globl _start
_start:
# Определение адресов начала и конца строки
mov $string, %rdi
mov $string_size, %rcx
# Отображение первого байта
movsb (%rdi), %al
mov $1, %rdx
mov $1, %rax
int $0x80
# Отображение последнего байта
lea –1(%rcx), %rdi
movsb (%rdi), %al
mov $1, %rdx
mov $1, %rax
int $0x80
# Обмен первого и последнего байтов
add $1, %rdi
movsb (%rdi), %al
lea –2(%rcx), %rdi
movsb (%rdi), %bl
mov $1, %rdx
mov $1, %rax
int $0x80
mov %al, (%rdi)
mov %bl, (%rdi, %rcx)
# Отображение исходной строки
lea –1(%rcx), %rdi
mov %rdx, %rsi
add $1, %rdi
mov $string, %rax
mov $1, %rdx
int $0x80
# Отображение преобразованной строки
mov $string, %rdi
mov $string_size, %rcx
mov $1, %rdx
mov $1, %rax
int $0x80
exit:
# Выход из программы
mov $0x60, %rax
xor %rdi, %rdi
syscall
Программа работает следующим образом:
1. Загружает адрес начала строки в регистр RDI и размер строки в регистр RCX.
2. Отображает первый байт строки, используя системный вызов write.
3. Вычисляет адрес последнего байта строки, уменьшая значение регистра RCX на 1, и отображает последний байт.
4. Затем программа обменивает местами первый и последний байты строки. Сначала берется значение первого байта (содержащееся в регистре RDI), затем значение последнего байта (содержащееся в регистре RCX–2) сохраняется в регистре BL. Затем значение последнего байта сохраняется в первый байт, и значение первого байта сохраняется в последний байт (путем индексирования адреса с использованием RCX).
5. Далее программа отображает исходную строку и преобразованную строку с использованием системного вызова write.
6.Наконец, программа завершается с использованием системного вызова exit.