Удалить заданный элемент в строке - Assembler

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

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

Всем привет! Помогите с задачкой плиз: "Удалить заданный элемент в строке" вот заготовка, только удаляется первый найденный элемент, а нужно все элементы в строке, и если можно все это в процедуре
model small
.stack 100h
.data
string    db    'This is a story about a lucky man 03010', 0h, '$'
simbol db 'a' 
.code
main:
    mov ax, @data
    mov ds, ax
    mov es, ax
    
    cld
    mov cx,30h
    lea di, string
    mov al, simbol
start:
    repne scasb
    jne exit
    
    mov si, di
    dec di
        rep movsb
    cmp di, 0
    je start
    
exit:
    mov ah, 4ch
    int 21h
end main
Так есть у кого идеи?

Решение задачи: «Удалить заданный элемент в строке»

textual
Листинг программы
 model small
.stack 100h
.data
string    db    'about abba', 0ah, '$'
simbol db 'a' 
.code
main:
    mov ax, @data
    mov ds, ax
    mov es, ax
    cld
    mov cx,15h
    lea dx, string
    mov di, dx
    xor ax, ax
    mov al, simbol
    mov BP, SP
    push ax             
    call procedura
    procedura proc near
    pop [BP+2]          
start:
    repne scasb
    jne exit
    mov si, di
    push di
    push cx
    dec di
        rep movsb
    pop cx
    pop di
    jmp start
    ret
    endp procedura
exit:
    mov ah, 4ch
    int 21h
end main

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

В этом коде на языке Assembler выполняется следующая последовательность действий:

  1. Задаётся модель памяти для программы (small).
  2. Определяется стек размером 100 байт.
  3. Определяется строка в формате db (строка символов, включая символ 0ah, обозначающий конец строки), а также переменная simbol, которая содержит символ, который нужно удалить.
  4. Код главной функции main:
    • Переменная ax используется как индекс для доступа к памяти, поэтому она инициализируется значением @data (40h).
    • Переменные ds и es также используются для доступа к памяти, поэтому они инициализируются значением ax.
    • Переменная cx инициализируется значением 15h, что означает, что цикл будет выполняться 15 раз.
    • Переменная dx указывает на строку string, а переменная di — на первый символ этой строки.
    • Переменная BP и SP инициализируются значением ax, так как в данном случае они используются как индексы для доступа к памяти.
    • Функция procedura вызывается с аргументом ax (символом, который нужно удалить).
    • Функция procedura:
    • Код внутри функции начинается с установки регистра ax в ноль.
    • Затем в него записывается значение переменной simbol.
    • Далее, BP устанавливается равным SP.
    • Затем переменная ax (символ) сохраняется на стеке.
    • Вызывается функция call, которая вызывает процедуру, указанную в качестве аргумента.
    • По завершении работы функции call, значение BP+2 (то есть SP) восстанавливается.
    • Код функции main продолжается:
    • Переменная di инициализируется значением dx (первого символа строки).
    • Переменная si устанавливается равной di.
    • Затем переменные di и cx сохраняются на стеке.
    • Переменная di уменьшается на единицу.
    • Затем происходит попытка сравнить символ в памяти по адресу di с символом, который нужно удалить (переменная al). Если они не совпадают, то происходит переход к следующему символу.
    • Если символы совпадают, то происходит замена символа на символ перезаписи (в данном случае на пустой символ).
    • Затем происходит выход из цикла и возврат в основную программу.
    • В основной программе происходит вывод сообщения об успешном завершении программы. Таким образом, этот код удаляет заданный символ из строки.

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


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

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

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