Задать свой вопрос   *более 50 000 пользователей получили ответ на «Решим всё»

Задача 74202 Используя программу GNU эмулятор работы...

Условие

Используя программу GNU эмулятор работы ЭВМ, написать программу с циклическим выполнением команд для обработки строк. Дана строка из произвольного числа символов. Известно, что строка заканчивается служебным кодом }. Написать программу для вывода на консоль первого и последнего байта строки. Обменять местами первый и последний байты строки. Вывести исходную строку и преобразованную.
Проверить работу программы для разного числа байтов.

информатика ВУЗ 64

Решение

# Используемый код символа в строке
# для служебного кода используется '}' (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.

Написать комментарий

Меню

Присоединяйся в ВК