 |
Ассемблер в примерах - Вывод последовательности символов в обратном порядке
- Вопрос:
- Как разработать программу, позволяющую ввести с клавиатуры последовательность символов и вывести ее в обратном порядке. Последовательность заканчивается при вводе символа «*».
- Ответ:
-
.model tiny
.code
org 100h
start:
mov ax, 3
int 10h
lea dx, msg_in
mov ah, 9
int 21h
cld ; буду использовать удобные строковые инструкции -
; установим флаг направления - увеличивать
lea di, ar ; команда srosb поместит байт в AL по адресу ES:DI и увеличит DI на 1
xor cx, cx ; счетчик помещенных
mov ah, 1
@@1:
int 21h
cmp al, '*'
jne @@2
jmp @@_end_of_input
@@2:
stosb
inc cx ; полагаю, что число символов будет не больше 65535
jmp @@1
@@_end_of_input:
lea dx, msg_out
mov ah, 9
int 21h
dec di ; последний раз DI был увеличен зря
mov si, di ; для чтения использую LODSB - из DS:SI в AL
std ; Флаг направления - уменьшать
; Для вывода буду использовать прерывание 21h, которое ничего не умеет,
; кроме как выводить содержимое AL на экран
@@3:
lodsb
int 29h
LOOP @@3 ; CX уже настроен
lea dx, PressKey
mov ah,9
int 21h
xor ax, ax
int 16h
int 20h
msg_in db 'Вводите символы (окончание ввода - символ *)',13,10,'$'
msg_out db 13,10,'Вывод массива наоборот:',13,10,'$'
PressKey db 13,10,'Press any key ...$'
ar_end dw ar ; это будет указатель на конец массива
ar_count dw 0 ; количество элементов в массиве для вывода в цикле
ar db ? ; здесь в конце программы и будет располагаться массив
end start
|  |