Удаление значения из неупорядоченного массива в ОЗУ - 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 и выполняет следующую задачу: он удаляет определенное значение из неупорядоченного массива, расположенного в оперативной памяти (ОЗУ). Список действий, выполняемых кодом:

  1. Устанавливает регистр SI на адрес начала массива.
  2. Устанавливает регистр CX на длину массива.
  3. Начинает цикл, который будет выполняться до тех пор, пока не будет выполнено условие.
  4. Выполняет команду LODSB, которая загружает байт из массива в регистр AL.
  5. Добавляет к значению в регистре AL 30h (это значение представлено в шестнадцатеричной системе счисления).
  6. Выполняет команду INT 29h, которая передает управление на уровень выше (в BIOS).
  7. Устанавливает значение в регистре AL на запятую.
  8. Выполняет команду INT 29h, которая передает управление на уровень выше (в BIOS).
  9. Выполняет команду LOOP, которая повторяет предыдущий блок команд до тех пор, пока не будет выполнено определенное условие.
  10. Возвращает управление в основную программу. Вызов макроса printArray будет выглядеть следующим образом: printArray array_a,6; где array_a — это адрес массива, а 6 - его длина.

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


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

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

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