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