Строка: Вывести на экран каждую третью букву строки - Assembler

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

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

Используя цепочечные команды написать программу, которая считывает строка символов с клавиатуры и выводит на экран каждую третью букву. Помогите с этим заданием . Я что-то делал , но не получилось
.model small
.stack 256
.data
max db 30
len db ?
s1 db 30 dup(?)
zap db 30 dup (',') 
pr db 30 dup(' ')
mes db 'Vvedite stroku:',10,13,'$'
new db 10,13,'$' 
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,09h
lea dx,mes
int 21h
mov ah,0Ah
lea dx,max
int 21h
mov bl,len
mov s1[bx],'$' 
mov cl,len
dec bx
lea di,s1[bx]
lea si,zap[bx]
std 
repne cmpsb
cmp di,0
je K
inc di
push di
cld
cld
lea di,s1 
lea si,pr 
mov cl,len
repe cmpsb
mov si,di 
pop di
movsb 
K:
mov ah,09h
lea dx,new
int 21h
mov ah,9
lea dx,s1
int 21h 
mov ah,4ch
int 21h
end start

Решение задачи: «Строка: Вывести на экран каждую третью букву строки»

textual
Листинг программы
org 100h
   dw    3EBh
   jmp   0
   sub   esp,4
   mov   word[esp],21CDh
   mov   byte[esp+2],0C3h
   add   di,200h
   mov   si,di
   inc   ah
@@:
   call  esp
   cmp   al,13
   je    skuns
   db    0AAh
   inc   cl
   jmp   @b
skuns:
   mov   al,10
   int   29h
   shr   cx,1
@@:
   lodsw
   lodsb
   dw    29CDh
   loop  @b
   add   esp,4
   jmp   $$+2

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

  1. org 100h — начало выполнения программы, установка точки входа
  2. dw 3EBh — определение смещения для первой инструкции
  3. jmp 0 — переход на точку входа (смещение 0), обеспечивает зацикленность программы
  4. sub esp,4 — подготовка стека для вызова функции
  5. mov word[esp],21CDh — запись в стек указателя на буфер строки
  6. mov byte[esp+2],0C3h — запись в стек указателя на буфер строки (второй байт)
  7. add di,200h — подготовительное действие для цикла (инкремент счётчика)
  8. mov si,di — подготовка счётчика для цикла
  9. inc ah — инкремент значения регистра AH (для проверки условия в цикле)
  10. call esp — вызов функции, адрес которой находится в стеке
  11. cmp al,13 — сравнение значения регистра AH с 13 (если они равны, то происходит переход на метку skuns)
  12. je skuns — переход на метку skuns (если условие cmp истинно)
  13. db 0AAh — вывод на экран символа (для проверки)
  14. inc cl — инкремент значения регистра CX (счётчик для цикла)
  15. jmp @b — переход на предыдущую инструкцию (для цикла)
  16. mov al,10 — подготовка значения регистра AH для функции int 29h
  17. int 29h — функция вывода символа на экран (в данном случае выводится символ 10)
  18. shr cx,1 — деление значения регистра CX на 2 (для проверки)
  19. lodsw — загрузка пары байт из стека в регистры AX и CX
  20. lodsb — загрузка байта из стека в регистр SI
  21. dw 29CDh — вывод на экран строки (значение в стеке используется как смещение)
  22. loop @b — переход на предыдущую инструкцию (для цикла)
  23. add esp,4 — восстановление стека после вызова функции
  24. jmp $$+2 — переход на следующую инструкцию (для цикла)

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


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

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

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