Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Массив целых чисел

Вопрос:
Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем положительные и отрицательные числа. Если чередуются, то вывести 0, если нет, то вывести номер первого элемента, нарушающего закономерность.

Ответ:
Пишу простейший вариант:
1) массив байт
2) проверяю одинаковость знаков с помощью знакового умножения IMUL
.model tiny
.code
org 100h
start:
  mov ax, 3
  int 10h

  lea si, a
  xor bh, bh ; флаг знака произведения
  mov cx,N
  mov dx, 1 ; Место
  dec cx
@@next:  
  mov al, [si]
  mov bl, [si+1] 
  imul bl
  or ax, ax
  jns @@wrong
  inc si
  inc dx
  loop @@next
  jmp @@out
@@wrong:
  inc bh  
@@out:  
  xor ax, ax
  or bh, bh
  jz @@3
    mov ax, dx
@@3:  
  CALL writeDEC
  
  lea dx, PressKey
  mov ah,9
  int 21h

  xor ax, ax
  int 16h

  int 20h
  
a db -1,3,-2,-3,-5,1,-9
N equ $ - a

writeDEC proc
; Ожидает слово в AX
  push ax
  push bx
  push cx
  push dx
 xor cx, cx
 mov bx, 10
@@1:
 xor dx, dx
 div bx
 push dx
 inc cx
 or ax, ax
 jnz @@1
 
@@2:
 pop ax
 add al, '0'
 int 29h
 loop @@2  
  
  pop  dx
  pop  cx
  pop  bx
  pop  ax
  ret
writeDEC endp  

PressKey db 13,10,'Press any key ...$'
end start

   Вперёд
   Содержание