Вывод строки наоброот - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, есть код, который выводит строку, нужно сделать программу, которая сформирует новую строку, состоящую из символов исходной строки записанных наоборот. Слабо разбираюсь в этом, долго пытался сделать, но ничего не получилось. Буду рад помощи. Код ниже
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. Original_string db 'Assembler language programming is the fastest in the world.', 13, 10, '&'
  5. Formed_line db 255 DUP(?)
  6. .code
  7. .386
  8. main:
  9. mov ax, @data
  10. mov ds, ax
  11. mov es, ax
  12. mov dx, offset Original_string
  13. mov ah, 9
  14. int 21h
  15. cld
  16. mov ecx, LENGTHOF Original_string
  17. sub ecx, 0
  18. mov esi, [OFFSET Original_string]
  19. mov edi, OFFSET Formed_line
  20. rep movsb
  21. mov dx, offset Formed_line
  22. mov ah, 9
  23. int 21h
  24.  
  25. mov ax, 4C00h
  26. int 21h
  27. end

Решение задачи: «Вывод строки наоброот»

textual
Листинг программы
  1. .data
  2. MsgBoxText      db "Win64 Assembly is Great! nmrt",10
  3. a db lengthof MsgBoxText+1 dup(0)
  4. .code
  5.     mov esi,offset a-9
  6.     mov edi,offset a
  7.     mov ecx,lengthof MsgBoxText
  8.     shr ecx,3
  9.     std
  10.     jz a1
  11. @@: lodsq
  12.     bswap rax
  13.     mov [rdi],rax
  14.     add edi,8
  15.     loop @b
  16. a1: add rsi,8
  17.         mov ecx,lengthof MsgBoxText
  18.     and ecx,7
  19. @@: movsb
  20.     add edi,2
  21.     loop @b
  22.     cld
  23.      ......

Объяснение кода листинга программы

В данном коде на языке Assembler выполняется вывод строки Win64 Assembly is Great! nmrt в консоль. Список операций выглядит следующим образом:

  1. .data - определение сегмента данных, в котором будет храниться строка
  2. MsgBoxText db Win64 Assembly is Great! nmrt,10 - определение переменной, которая будет содержать строку
  3. a db lengthof MsgBoxText+1 dup(0) - определение переменной, которая будет использоваться для хранения длины строки и в качестве индекса при выводе строки
  4. .code - определение сегмента кода
  5. mov esi,offset a-9 - перемещение указателя на переменную a в регистр esi
  6. mov edi,offset a - перемещение указателя на переменную a в регистр edi
  7. mov ecx,lengthof MsgBoxText - перемещение длины строки в регистр ecx
  8. shr ecx,3 - деление длины строки на 4 и сохранение результата в регистре ecx
  9. std - переход к оператору jz a1 (то есть к 10-му оператору) при условии, что результат деления равен 0
  10. lodsq - загрузка целого числа из памяти и сохранение его в регистре rax
  11. bswap rax - инвертирование байтов в регистре rax
  12. mov [rdi],rax - сохранение инвертированного числа в памяти по адресу, указанному в регистре edi
  13. add edi,8 - увеличение указателя на 8 байт (так как переменная a определена как строка символов, то есть один байт)
  14. loop @b - повторение предыдущих операций (от 10 до 13) до тех пор, пока значение регистра ecx не станет равным 0
  15. a1: add rsi,8 - увеличение указателя на 8 байт (так как переменная a определена как строка символов, то есть один байт)
  16. mov ecx,lengthof MsgBoxText - перемещение длины строки в регистр ecx
  17. and ecx,7 - установление значения регистра ecx равным 7 (так как длина строки должна быть кратной 8, а операция and с 7 гарантирует это)
  18. movsb - вывод строки из регистра edi (в котором хранится переменная a) в память по адресу, указанному в регистре esi
  19. add edi,2 - увеличение указателя на 2 байта (так как переменная a определена как строка символов, то есть один байт)
  20. loop @b - повторение предыдущих операций (от 15 до 19) до тех пор, пока значение регистра ecx не станет равным 0
  21. cld - установка режима работы с памятью, при котором происходит чтение данных из памяти, а не запись в память (при этом операция movsb будет выводить данные из памяти)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут