Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Вывод последовательности символов в обратном порядке

Вопрос:
Как разработать программу, позволяющую ввести с клавиатуры последовательность символов и вывести ее в обратном порядке. Последовательность заканчивается при вводе символа «*».

Ответ:
.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

   Вперёд
   Содержание