Никак не могу найти ошибку в коде - Assembler
Формулировка задачи:
Доброго всем времени суток!
За ассемблером сижу второй день (ученая необходимость), необходимо реализовать следующую задачу:
Найти наименьшее по абсолютной величине число в массиве чисел и занести его в регистр DX.
Смотрю дебаггером, но на выходе получаю в DX FFFCh (-4). Опуская знаки у всех членов массива - получаю 3. Возможно я неправильно интерпретировал для себя смысл команды
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
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
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Задается модель сегмента данных - small.
- Определяется сегмент данных.
- Инициализируется массив ARR четырьмя элементами.
- Код переходит к процедуре start.
- AX копирует значение @data, SI копирует начальный адрес массива ARR.
- AX загружает первый элемент массива ARR.
- AX проверяет, не равен ли он нулю. Если это так, то выполняется переход к следующей итерации цикла.
- AX инвертируется, чтобы получить значение -ARR.
- BX копирует значение AX.
- DX получает адрес элемента массива ARR.
- CX устанавливает количество итераций равным 4.
- AX загружает второй элемент массива ARR.
- AX проверяет, не равен ли он нулю. Если это так, то выполняется переход к следующей итерации цикла.
- AX инвертируется, чтобы получить значение -ARR.
- BX сравнивает текущий элемент массива со значением AX. Если они не равны, то выполняется переход к следующей итерации цикла.
- Если сравнение было, то BX обновляется значением AX.
- DX получает адрес элемента массива ARR.
- Цикл повторяется 4 раза (в зависимости от значения CX), пока не будет выполнено условие выхода из цикла.
- Код переходит к процедуре a4.
- AH устанавливается равным 4Ch, что соответствует команде выхода из программы.
- Выполняется команда выхода из программы с помощью INT 21h.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д