Строка: Вывести на экран каждую третью букву строки - 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
Объяснение кода листинга программы
- org 100h — начало выполнения программы, установка точки входа
- dw 3EBh — определение смещения для первой инструкции
- jmp 0 — переход на точку входа (смещение 0), обеспечивает зацикленность программы
- sub esp,4 — подготовка стека для вызова функции
- mov word[esp],21CDh — запись в стек указателя на буфер строки
- mov byte[esp+2],0C3h — запись в стек указателя на буфер строки (второй байт)
- add di,200h — подготовительное действие для цикла (инкремент счётчика)
- mov si,di — подготовка счётчика для цикла
- inc ah — инкремент значения регистра AH (для проверки условия в цикле)
- call esp — вызов функции, адрес которой находится в стеке
- cmp al,13 — сравнение значения регистра AH с 13 (если они равны, то происходит переход на метку skuns)
- je skuns — переход на метку skuns (если условие cmp истинно)
- db 0AAh — вывод на экран символа (для проверки)
- inc cl — инкремент значения регистра CX (счётчик для цикла)
- jmp @b — переход на предыдущую инструкцию (для цикла)
- mov al,10 — подготовка значения регистра AH для функции int 29h
- int 29h — функция вывода символа на экран (в данном случае выводится символ 10)
- shr cx,1 — деление значения регистра CX на 2 (для проверки)
- lodsw — загрузка пары байт из стека в регистры AX и CX
- lodsb — загрузка байта из стека в регистр SI
- dw 29CDh — вывод на экран строки (значение в стеке используется как смещение)
- loop @b — переход на предыдущую инструкцию (для цикла)
- add esp,4 — восстановление стека после вызова функции
- jmp $$+2 — переход на следующую инструкцию (для цикла)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д