Assembler Найти есть ли в массиве два нуля, идущих подряд. Массив слов
data segment
mass dw 10,20,30,479,-347,40,50,70,124,97
data ends
code segment
assume cs: code, ds: data
start:
mov ax, data
mov ds, ax
lea bx, mass
mov cx, 10
mov ax, 0
beg:
mov ax, [bx]
or ax, [bx+2]
jz NN
inc bx
inc bx
NN:
mov ax,1
loop beg
quit:
mov ax, 4c00h
int 21h
code ends
end start
Нужно узнать есть ли в массиве два нуля идущих подряд. Почему выводит единицу, если в массиве нет нулей, как исправить?
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
а ничего, что код
NN:
mov ax,1
loop beg
у вас выполняется всегда
при [bx] or [bx + 2] == 0 у вас туда прыгает сразу, а если условие не выполняется, то через пару inc bx дойдет
скорее надо было бы делать так:
mov ax, [bx]
or ax, [bx+2]
jnz NN
mov dx,1
NN:
inc bx
inc bx
loop beg
quit:
если я конечно правильно понял
P.S.
А что вы флаг двойного нуля в ax пишите, который дальше используете для других целей mov ax, 4c00h ?
Автор решения: PRODIGY
→ Ссылка
В коде есть ошибка.
Длину цикла в СХ нужно уменьшить на 1, иначе на последней итерации получим выход за границы массива. Если без оптимизации и с обычным сравнением CMP, то можно сделать так:
;// fasm-code
;//------------
org 100h
jmp start
mass dw 10,20,30,479,-347,40,0,0,124,97
massLen = ($-mass)/2
start: mov cx,massLen ;// длина массива
dec cx ;// -1
mov si,mass ;// его адрес для LODSW
mov bx,0 ;// будет счётчиком найденных =0
@cycle: lodsw ;// AX = слово из SI (SI+2)
cmp ax,0 ;// проверить его на нуль
jnz @next ;// пропустить, если нет
cmp ax,[si] ;// сравнить со-следующим
jnz @next ;// если нет..
inc bx ;// иначе: счётчик +1
@next: loop @cycle ;// промотать цикл СХ=раз..
mov al,bl ;// счётчик в AL
add al,30h ;// перевод из числа в символ
int 29h ;// вывод AL на консоль
mov ah,8 ;// ждём нажатия клавиши,
int 21h ;// ..чтобы окно не закрылось.
@exit: mov ax,4C00h ;// GAME OVER!
int 21h