Удалить каждый третий элемент строки в программе - Assembler
Формулировка задачи:
Привет
Есть программа, она меняет парные и непарные символы строки.
Как сделать, чтобы удалялся каждый третий элемент строки. Помогите мне пожалуйста, потому что не знаю как сделать.
data segment string db 12 dup(?) alph db "abcdefghijklmnopqrstuvwxyz" // введенная строка. n2 dw 12 data ends code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax include c:\lib.mac mov bx,0 vvod 12,string mov si,1 mov dx,0 mov ax,0 shr bx,1 mov cx,6 beg1: mov ax,si mov si,dx mov bh,alph[si] mov si,ax mov string[si],bh add si,2 inc dx loop beg1 fin1: pereskok vivods 12,string// вывод полученной строки mov ax,4c00h int 21h code ends end begin
Решение задачи: «Удалить каждый третий элемент строки в программе»
textual
Листинг программы
org 100h jmp begin alph db "abcdefghijklmnopqrstuvwxyz",0,0 ; 2-ной маркер конца строки string db 32 dup('$') ; забиваем буфер баксами begin: mov si,alph ; источник данных mov di,string ; приёмник данных mov cx,2 ; сохранять будем по-два символа @@: ; lodsb ; сл.символ строки or al,al ; конец строки? jz printf ; stosb ; записываем символ в приёмник loop @b ; сл.символ строки inc si ; пропускаем каждый/3-тий символ.. mov cx,2 ; восстанавливаем счётчик jmp @b ; следующая пара цифр.. printf: ; mov ah,9 ; выводим результат на экран mov dx,string ; int 21h ; xor ax,ax ; выход! int 16h ; int 20h ;
Объяснение кода листинга программы
Список элементов кода:
- org 100h — начало выполнения программы, переход на метку
begin
. - jmp begin — переход на метку
begin
(начало цикла). - alph db
abcdefghijklmnopqrstuvwxyz
,0,0 — 2-байтный маркер конца строки. - string db 32 dup('$') — заполнение буфера байтами.
- begin: — начало цикла.
- mov si,alph — исходные данные (строка) помещаются в регистр
si
. - mov di,string — приёмник данных (буфер) помещается в регистр
di
. - mov cx,2 — счётчик пар символов (два символа сохраняются в регистре
cx
). - lodsb — в регистр
al
загружается следующий символ из строки. - or al,al — проверка на конец строки (регистр
al
содержит 0, если достигнут конец строки). - jz printf — если достигнут конец строки, то происходит переход на метку
printf
. - stosb — в буфер записывается следующий символ из строки.
- loop @b — переход на метку
@b
(начало цикла, следующая пара символов). - inc si — увеличение индекса исходной строки (пропуск каждого/3-го символа).
- mov cx,2 — восстановление счётчика пар символов.
- jmp @b — переход на метку
@b
(следующая пара цифр). - printf: — вывод результата на экран.
- mov ah,9 — регистр
ah
используется для вывода символов на экран. - mov dx,string — указатель на буфер с данными.
- int 21h — вызов функции вывода на экран.
- xor ax,ax — очистка регистров
ax
. - int 16h — выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д