Никак не могу найти ошибку в коде - 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 mainneg
. Ищу помощи и желательно как можно более понятным языком, пока слабо ориентируюсь в ассемблере. 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.