Удаление значения из неупорядоченного массива в ОЗУ - 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 - его длина.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д