Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ассемблер. Подсчет нулевых строк.

244
09 сентября 2008 года
UAS
2.0K / / 19.07.2006
Здравствуйте. Вообщем и меня вот жизнь закинула в асму по универу)
Программа простая, посчитать кол-во пустых строк массива, в которых только нулевые символы. Код уже написал, но есть ошибка, которую не могу найти. Компилятор - MASM под DOS.

Ошибка:
В DSEG есть один массив 4х4, и один закомментенный (2х4). В чем проблема: если тестируем на втором массиве(закомментенный), то все срабатывает как надо (кол-во строк соответсвенно изменял в коде), считает верно и сравнивает тоже.
Но если использовать первый массив, то нет. При debug он верно пропускает все 3 строчки, но когда сравнивается X[3][0] с 0, т.е. первый элемент 4 строки, он выдает, что ячейка не равна нулю.. Не могу понять где подвох..

Код:
Код:
DSEG SEGMENT
X DB 1,2,3,4,
     5,-6,-7,8,
     -9,10,1,1,
     0,0,0,0
;X DB 1,0,0,0,
;       0,0,0,0
STROKA DB 'RESULTAT V BX'
DSEG ENDS
SSEG SEGMENT STACK
DB 256 dup (?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
ORG 100H
; ЗАНЯТЫЕ РЕГИСТРЫ
; AX
; BX - содержит кол-во нулевых строк
; CX - счетчик для цикла
; DX - будет хранить значение внешнего счетка, пока идет цикл по ячейкам
; SI
; DI - индекс для ячейки в строке
; BP -  индекс для текущей строки
; SP

BEGIN:
    MOV AX,DSEG ;загрузим адрес начала сегмента
    MOV DS,AX ;данных в регистр DS

    MOV BX,0
    MOV BP,0
    MOV CX,4 ;кол-во строк
    ROWS:
        MOV DX,CX ;запоминает состояние счетчика для строк
        MOV CX,4 ;кол-во ячеек в строке
        MOV DI,0 ;обнуляем счетчик для ячеек
        CELLS:
            CMP X[BP][DI],0 ; сравниваем с нулем
            JNE END_CELLS; проверка на <>0. Если равно нулю, то проверяем является ли он последним элементом в строке, если нет, то переходим к следющей итерации
                CMP DI,3 ;если является последней ячейкой в строке, то строка явл. нулевой, если нет, то продолжаем цикл
                JNE CONTINUE_CELLS
                    INC BX
            CONTINUE_CELLS: INC DI
        LOOP CELLS
        END_CELLS:
        MOV CX,DX
        INC BP
    LOOP ROWS

    MOV AH,09H
    LEA DX,STROKA ;выводим строку
    INT 21H
    MOV AX,4C00H
    INT 21H
CSEG ENDS
END BEGIN
39K
09 сентября 2008 года
kupec
17 / / 11.08.2008
X[3][0] в асме это не тоже самое что в Си,
в асме это значения адреса X+3+0, а не X+3*4+0,
поэтому значение X[3][0] будет равно 3,
надо в коде вручную BP умножать на 4, либо использовать например SI, в котором будет находиться BP*4

PS и кстати при обращении к памяти через регистр BP используется сегмент стека,
поэтому лучше либо поменять в программе BP и BX местами везде,
либо при обращении к памяти через BP в начале приписывать "DS:"
244
16 сентября 2008 года
UAS
2.0K / / 19.07.2006
Думаю новую тему заводить не стоит. Так что тут спрошу)
Все тот же masm под DOS.
Проблема с определением на отрицательность числа, а именно: после перемножения чисел получаем какое-то отрицательное число (FFE8), т.е. AX = FFE8. Дальше идет сравнение чисел AX и DX. Вот проблема в том, что отрицательность AX не определяется.

Код:
Код:
; max(X+Y+Z,XYZ);
; запишем максимальное значение в регистр DX

DSEG SEGMENT
    X = 2 ;первое число
    Y = 3 ;второе число
    Z = -4 ;третье число
    RESULT DB 'Maksimalnoe znachenie: $'
DSEG ENDS

SSEG SEGMENT STACK
    DB 256 dup (0)
SSEG ENDS

CSEG segment
ASSUME CS:CSEG, DS:DSEG
ORG 100H

BEGIN:
    ;очищаем AX и DX
    XOR AX,AX
    XOR DX,DX

    MOV AX,X
    MOV BX,Y
    IMUL BX
    MOV BX,Z
    IMUL BX

    MOV DX,X
    ADD DX,Y
    ADD DX,Z

    ;сравним DX и AX
    CMP AX,DX
    JG DX2bigger ;если AX больше DX, то идем к метке DX2bigger, иначе продолжаем вычисления со следующей строчки
        AX2bigger: MOV DX,AX
    DX2bigger:

;;;;; ниже другой код

CSEG ENDS
END BEGIN

сравнивая регистры AX = FFE8 и DX = 0001 он определяет AX больше. Пока только один вариант - асма выделяет больше 2 байтов на регистр :confused:

ЗЫ: и ещё. Вывод строки RESULT происходит посредством
 
Код:
MOV AH,09H
LEA DX,RESULT
INT 21h

Только вот перед выводом текста он выводит ещё хз сколько символов, случайных из ASCII, а уже только в конце выводит строку.. Вот как от этих символов избавиться никто не знает?

[size=1][COLOR="Silver"]ЗЫЫ: не говорите что лентяй)) Просто на другую спец перевелся, и надо 6 экзаменов досдавать) Самому щас времени на все не хватает[/COLOR][/size]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог