Удаление значения из неупорядоченного массива в ОЗУ - Assembler
Формулировка задачи:
Макрокоманда удаления значения,находящегося в регистре(месте) Х,из неупорядоченного списка в ОЗУ.Начальный адресс массива S,адресс результата Res.Длина массива(в байтах) находится в первой ячейке массива.
Листинг программы
- delete macro s,x,res
- local m1,pass,exit
- push si di ax cx
- lea si,x
- mov ah,0;Длина результата
- lea di,res
- mov cl,[si]
- mov ch,0
- jcxz exit
- puch di;Начальный адресс массива res
- m1: inc si
- mov al,[si]
- cmp al,x
- je pass
- inc di
- mov [di],al
- inc ah
- pass: loop m1
- pop di;восстанавливаем начальнйы адресс res
- exit: mov [di],ah
- pop cx,as,di,si
- endm
- sseg segment stack 'stack'
- dw 256 dup(?)
- sseg ends
- ;Определение данных
- data segment
- ;сообщение пользователю
- array_a db 5,2,3,4,5,1
- array_b db 6 dup(?)
- a db 3
- data ends
- ;Сегмент кода
- code segment
- assume cs:code,ds:data,ss:sseg
- start: mov ax,data ;Настроить сегментный
- mov ds,ax ;регистрр ds на данные
- delete array_a,a,array_b
- mov ah,4ch;завершить программу
- int 21h;и выйти в DOS
- code ends
- end start
Запускаю через DOSBOX,но при выводе ответа через командную строку ничего не происходит.МОжет я что то пропустил или где то ошибка?
Решение задачи: «Удаление значения из неупорядоченного массива в ОЗУ»
textual
Листинг программы
- printArray macro addr,size
- local kLoop
- pusha
- lea si,addr
- mov cx,size
- kLoop:
- lodsb
- add al,30h
- int 29h
- mov al,','
- int 29h
- loop kLoop
- popa
- endm
- ; вызывай макрос так
- printArray array_a,6 ;адрес массива и его длина
Объяснение кода листинга программы
Код, представленный в вопросе, написан на языке Assembler и выполняет следующую задачу: он удаляет определенное значение из неупорядоченного массива, расположенного в оперативной памяти (ОЗУ). Список действий, выполняемых кодом:
- Устанавливает регистр SI на адрес начала массива.
- Устанавливает регистр CX на длину массива.
- Начинает цикл, который будет выполняться до тех пор, пока не будет выполнено условие.
- Выполняет команду LODSB, которая загружает байт из массива в регистр AL.
- Добавляет к значению в регистре AL 30h (это значение представлено в шестнадцатеричной системе счисления).
- Выполняет команду INT 29h, которая передает управление на уровень выше (в BIOS).
- Устанавливает значение в регистре AL на запятую.
- Выполняет команду INT 29h, которая передает управление на уровень выше (в BIOS).
- Выполняет команду LOOP, которая повторяет предыдущий блок команд до тех пор, пока не будет выполнено определенное условие.
- Возвращает управление в основную программу. Вызов макроса printArray будет выглядеть следующим образом: printArray array_a,6; где array_a — это адрес массива, а 6 - его длина.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д