Удалить каждый третий элемент строки в программе - 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             ;

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

Список элементов кода:

  1. org 100h — начало выполнения программы, переход на метку begin.
  2. jmp begin — переход на метку begin (начало цикла).
  3. alph db abcdefghijklmnopqrstuvwxyz,0,0 — 2-байтный маркер конца строки.
  4. string db 32 dup('$') — заполнение буфера байтами.
  5. begin: — начало цикла.
  6. mov si,alph — исходные данные (строка) помещаются в регистр si.
  7. mov di,string — приёмник данных (буфер) помещается в регистр di.
  8. mov cx,2 — счётчик пар символов (два символа сохраняются в регистре cx).
  9. lodsb — в регистр al загружается следующий символ из строки.
  10. or al,al — проверка на конец строки (регистр al содержит 0, если достигнут конец строки).
  11. jz printf — если достигнут конец строки, то происходит переход на метку printf.
  12. stosb — в буфер записывается следующий символ из строки.
  13. loop @b — переход на метку @b (начало цикла, следующая пара символов).
  14. inc si — увеличение индекса исходной строки (пропуск каждого/3-го символа).
  15. mov cx,2 — восстановление счётчика пар символов.
  16. jmp @b — переход на метку @b (следующая пара цифр).
  17. printf: — вывод результата на экран.
  18. mov ah,9 — регистр ah используется для вывода символов на экран.
  19. mov dx,string — указатель на буфер с данными.
  20. int 21h — вызов функции вывода на экран.
  21. xor ax,ax — очистка регистров ax.
  22. int 16h — выход из программы.

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

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