Удаление значения из неупорядоченного массива в ОЗУ - 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 - его длина.