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
→ Ссылка