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
Ассемблер. Подсчет нулевых строк.
Программа простая, посчитать кол-во пустых строк массива, в которых только нулевые символы. Код уже написал, но есть ошибка, которую не могу найти. Компилятор - MASM под DOS.
Ошибка:
В DSEG есть один массив 4х4, и один закомментенный (2х4). В чем проблема: если тестируем на втором массиве(закомментенный), то все срабатывает как надо (кол-во строк соответсвенно изменял в коде), считает верно и сравнивает тоже.
Но если использовать первый массив, то нет. При debug он верно пропускает все 3 строчки, но когда сравнивается X[3][0] с 0, т.е. первый элемент 4 строки, он выдает, что ячейка не равна нулю.. Не могу понять где подвох..
Код:
Код:
в асме это значения адреса X+3+0, а не X+3*4+0,
поэтому значение X[3][0] будет равно 3,
надо в коде вручную BP умножать на 4, либо использовать например SI, в котором будет находиться BP*4
PS и кстати при обращении к памяти через регистр BP используется сегмент стека,
поэтому лучше либо поменять в программе BP и BX местами везде,
либо при обращении к памяти через BP в начале приписывать "DS:"
Все тот же 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
; запишем максимальное значение в регистр 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
LEA DX,RESULT
INT 21h
Только вот перед выводом текста он выводит ещё хз сколько символов, случайных из ASCII, а уже только в конце выводит строку.. Вот как от этих символов избавиться никто не знает?
[size=1][COLOR="Silver"]ЗЫЫ: не говорите что лентяй)) Просто на другую спец перевелся, и надо 6 экзаменов досдавать) Самому щас времени на все не хватает[/COLOR][/size]