Удаление значения из неупорядоченного массива в ОЗУ - Assembler

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

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

Макрокоманда удаления значения,находящегося в регистре(месте) Х,из неупорядоченного списка в ОЗУ.Начальный адресс массива S,адресс результата Res.Длина массива(в байтах) находится в первой ячейке массива.
Листинг программы
  1. delete macro s,x,res
  2. local m1,pass,exit
  3. push si di ax cx
  4. lea si,x
  5. mov ah,0;Длина результата
  6. lea di,res
  7. mov cl,[si]
  8. mov ch,0
  9. jcxz exit
  10. puch di;Начальный адресс массива res
  11. m1: inc si
  12. mov al,[si]
  13. cmp al,x
  14. je pass
  15. inc di
  16. mov [di],al
  17. inc ah
  18. pass: loop m1
  19. pop di;восстанавливаем начальнйы адресс res
  20. exit: mov [di],ah
  21. pop cx,as,di,si
  22. endm
  23. sseg segment stack 'stack'
  24. dw 256 dup(?)
  25. sseg ends
  26. ;Определение данных
  27. data segment
  28. ;сообщение пользователю
  29. array_a db 5,2,3,4,5,1
  30. array_b db 6 dup(?)
  31. a db 3
  32. data ends
  33. ;Сегмент кода
  34. code segment
  35. assume cs:code,ds:data,ss:sseg
  36. start: mov ax,data ;Настроить сегментный
  37. mov ds,ax ;регистрр ds на данные
  38. delete array_a,a,array_b
  39. mov ah,4ch;завершить программу
  40. int 21h выйти в DOS
  41. code ends
  42. end start
Запускаю через DOSBOX,но при выводе ответа через командную строку ничего не происходит.МОжет я что то пропустил или где то ошибка?

Решение задачи: «Удаление значения из неупорядоченного массива в ОЗУ»

textual
Листинг программы
  1. printArray  macro  addr,size
  2.      local kLoop
  3.      pusha
  4.      lea   si,addr
  5.      mov   cx,size
  6. kLoop:
  7.      lodsb
  8.      add   al,30h
  9.      int   29h
  10.      mov   al,','
  11.      int   29h
  12.      loop  kLoop
  13.      popa
  14.      endm
  15.  
  16. ; вызывай макрос так
  17.      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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы