[NASM] Копирование файла в перевёрнутом виде - Assembler

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

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

[NASM] Имеется работающая программа, копирующая символы из текстового файла in.txt в файл dest.txt Необходимо модифицировать программу так, чтобы содержимое из первого файла копировалось во второй в обратном порядке: in.txt : abcdefg -> dest.txt : gfedcba Лучше это сделать - с помощью рекурсивной функции ? - читая исходный файл от конца к началу?

Решение задачи: «[NASM] Копирование файла в перевёрнутом виде»

textual
Листинг программы
;
.8086
.MODEL TINY
;
CR    EQU   0Dh
LF    EQU   0Ah
;
.CODE
      ORG   100h
START:
      LEA   DX, sdInfo
      CALL  DISP_SD
STR_LOOP:
; Input string
      LEA   DX, kbBuf
      MOV   SI, DX
      INC   SI
      MOV   AH, 0Ah
      INT   21h
      LEA   DX, sdCrLf
      CALL  DISP_SD
      XOR   CH, CH
      MOV   CL, [SI]    ; String length
      JCXZ  EXIT
      INC   SI
; Init. registers
      MOV   DI, SI      ; String address
      ADD   DI, CX
      MOV   [DI+1], Word Ptr ("$"*256 + LF)     ; String length without CR
      DEC   DI
      SHR   CX, 1
      JCXZ  DISP_RESULT
REV_LOOP:
      MOV   AL, [SI]
      XCHG  AL, [DI]
      MOV   [SI], AL
      INC   SI
      DEC   DI
      LOOP  REV_LOOP
DISP_RESULT:
      LEA   DX, chBuf
      CALL  DISP_SD
      JMP   STR_LOOP
DISP_SD:
      MOV   AH, 9
      INT   21h
EXIT:
      RET
;
.DATA
sdInfo      DB    "Reverses string; enter empty string to exit"
sdCrLf      DB    CR, LF, "$"
kbBuf       DB    80
chBuf       EQU   kbBuf + 2
;
      END   START

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

  1. Создание модели: Код начинается с определения модели памяти, которую мы будем использовать. В данном случае это модель TINY.
  2. Определение констант: Затем определяются константы, которые будут использоваться в коде. В данном случае это коды возврата кассового аппарата (CR) и символа новой строки (LF).
  3. Организация кода: Код организован в виде основной программы и подпрограмм. Основная программа находится в блоке кода между директивами .CODE и .END, а подпрограммы определяются с помощью директивы CALL.
  4. Ввод строки: При вводе строки используется регистр SI в качестве индекса для базового адреса строки. Строка вводится посимвольно с помощью функции BIOS INT 21h, функция 0Ah.
  5. Инициализация регистров: После ввода строки регистры DI и SI используются в качестве индексов для базового адреса строки. С помощью функции BIOS INT 21h, функция 0Ah, записывается строка в буфер, а затем строка без CR записывается в буфер, начиная с адреса [DI+1].
  6. Переворот строки: Для переворота строки используется цикл LOOP, который выполняется до тех пор, пока SI не станет больше DI. В каждой итерации цикла регистр AL считывается из базового адреса SI, а затем записывается обратно в базовый адрес DI.
  7. Вывод результата: После завершения цикла LOOP результат выводится на экран с помощью функции BIOS INT 21h, функция 9.
  8. Выход из программы: Если пользователь вводит пустую строку, программа завершается и возвращается в DOS.
  9. Определение данных: В блоке данных определяются строки, которые будут использоваться в программе.
  10. Завершение программы: Программа завершается с помощью директивы RET, указывающей на то, что выполнение программы завершено.

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


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

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

5   голосов , оценка 3.2 из 5
Похожие ответы