Строка: Вывести на экран каждую третью букву строки - 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 — переход на следующую инструкцию (для цикла)