Никак не могу найти ошибку в коде - Assembler

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

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

Доброго всем времени суток! За ассемблером сижу второй день (ученая необходимость), необходимо реализовать следующую задачу: Найти наименьшее по абсолютной величине число в массиве чисел и занести его в регистр DX.
TITLE Lab3  ; название программы
 
.MODEL small    ; отводим под стек и под данные по 64 Кб
 
.STACK 100h ; отмечаем начало сегмента стека
 
.DATA       ; отмечаем начало сегмента данных
ARR DW -6,-7,-3,-5,-4
MIN DW 0
FL DW 0
 
.CODE       ; отмечаем начало сегмента кодов
main PROC
mov AX, @data   ; копируем адрес
mov DS, AX  ; сегмента данных
mov SI, OFFSET ARR  ; помещаем в SI начало массива ARR
mov CX, 4   ; задаем количество итераций
cld     ; прямой порядок обработки
mov AX, [SI]    ; помещаем в AX первый элемент
mov MIN, AX ; задаем его как минимальный
L1:
inc SI      ; сдвиг к следующему
inc SI      ; элементу
mov AX, [SI]    ; помещаем текущий элемент в AX
test AX, AX ; сравниваем
jns L2      ; если знака нет, переходим на метку L2
mov FL, 1   ; если есть, то устанавливаем флажок в 1
neg AX      ; переводим в прямой код (модуль)
L2:
cmp AX, MIN ; сравниваем содержимое с текущим минимальным значением
jnb L3      ; переход "если не ниже" на метку L3
cmp FL, 1   ; проверяем состояние флага
jne L4      ; если не равен 1 (перевода в прямой код не осуществляли)
        ; переходим на метку L4
neg AX      ; иначе переводим в дополнительный код (возвращаем знак)
L4:
mov MIN, AX ; помещаем содержимое AX в MIN
L3:
loop L1     ; циклически повторяем действия
mov DX, MIN ; выводим результат в регистр DX
mov AX, 4C00h   ; выход
int 21h     ; из программы
main ENDP
END main
Смотрю дебаггером, но на выходе получаю в DX FFFCh (-4). Опуская знаки у всех членов массива - получаю 3. Возможно я неправильно интерпретировал для себя смысл команды

neg

. Ищу помощи и желательно как можно более понятным языком, пока слабо ориентируюсь в ассемблере. p.s. возможно код избыточен, буду признателен за указание на это и помощь в оптимизации.

Решение задачи: «Никак не могу найти ошибку в коде»

textual
Листинг программы
; masm dos exe #
.286
.model small
.DATA       ; сегмент данных
ARR DW -6,-7,-3,-5,-4
.code
start:  mov ax,@data   ; копируем адрес
    mov ds,ax  ; сегмента данных
    mov si,offset ARR  ; помещаем в SI начало массива ARR   
    lodsw
    test ax,ax
    jns a1
    neg ax
a1: mov bx,ax
     mov dx,[si-2]
        mov cx,4   ; задаем количество итераций
a2: lodsw
    test ax,ax
    jns a3
    neg ax
a3: cmp ax,bx
    jae a4
    mov bx,ax
    mov dx,[si-2]
a4: loop a2
        mov ah,4Ch   ; выход
    int 21h     ; из программы
end start

Объяснение кода листинга программы

В этом коде выполняется следующая последовательность действий:

  1. Задается модель сегмента данных - small.
  2. Определяется сегмент данных.
  3. Инициализируется массив ARR четырьмя элементами.
  4. Код переходит к процедуре start.
  5. AX копирует значение @data, SI копирует начальный адрес массива ARR.
  6. AX загружает первый элемент массива ARR.
  7. AX проверяет, не равен ли он нулю. Если это так, то выполняется переход к следующей итерации цикла.
  8. AX инвертируется, чтобы получить значение -ARR.
  9. BX копирует значение AX.
  10. DX получает адрес элемента массива ARR.
  11. CX устанавливает количество итераций равным 4.
  12. AX загружает второй элемент массива ARR.
  13. AX проверяет, не равен ли он нулю. Если это так, то выполняется переход к следующей итерации цикла.
  14. AX инвертируется, чтобы получить значение -ARR.
  15. BX сравнивает текущий элемент массива со значением AX. Если они не равны, то выполняется переход к следующей итерации цикла.
  16. Если сравнение было, то BX обновляется значением AX.
  17. DX получает адрес элемента массива ARR.
  18. Цикл повторяется 4 раза (в зависимости от значения CX), пока не будет выполнено условие выхода из цикла.
  19. Код переходит к процедуре a4.
  20. AH устанавливается равным 4Ch, что соответствует команде выхода из программы.
  21. Выполняется команда выхода из программы с помощью INT 21h.

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


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

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

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