ksenofobius
@ksenofobius
Люблю долбить по клавишам

Почему не работает scasw?

Нужно, используя инструкции обработки цепочек, найти количество заданных элементов в массиве integer. Проблема в том что если просто делаю repne scasw, не находит совпадений и доходит до конца (при этом с cmp и loop все работает). Собственно вот кусок кода отвечающий за это:
start:
  mov ax, data
  mov ds, ax
  xor dx, dx
  mov cx, 8
  lea di, es:[massiv]
  xor bx, bx
  mov ax, 11d
  cld

m1:
  scasw
  cmp ax, 11d
  jne bli
  inc bx
bli:
  loop m1

  mov ax, bx
  call OutputInt
  mov dx,offset strend
  mov ah,9
  int 21h

  mov ax, 4c00h
  int 21h

и сегмент данных
data Segment
  massiv dw 11d, 11d, 66d, 665d, 66d, 344d, 266d, 5221d
  strdsc db 6,0
  strbuf db 6 dup (?)
  strend  db 13,10,'$'
data ends
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
Как указал выше Антон , Ваш код не соответствует логике команды.
SCASW сравнивает ячейку по адресу ES:DI с AX, выставляет флаги результатов сравнения и инкрементирует DI на 2. Автоматический инкремент DI позволяет (и собственно это и есть основной режим использования) предварять SCAS* префиксами проверки условий (REPE, REPNE).

Соответственно Ваш код должен содержать строку
REPNE SCASW
вместо
SCASW
CMP AX,...
и цикла

А сейчас Ваш код действительно как будто бы ориентирован на LODSW а не SCASW
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы