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

Ассемблер в примерах - Поиск элементов в массиве и вывод на экран

Вопрос:
Как написать программу для поиска минимально и максимального элемента в массиве,с вводом и выводом массива на экран.При написании использовать команду Lea тоесть адресацию массива.

Ответ:
Нужно получить исполняемый файл формата СОМ Размер массива определяется "автоматически", так что просто добавляйте или удаляйте элементы
Пример окна вывода программы:


Исходный массив:12  23  -3  4  0  7
Минимальный  элемент массива: -3
Максимальный элемент массива: 23
Press any key ..


.model tiny; нужно будет получить исполняемый файл формата СОМ
.code
org 100h
start:
   mov ax, 3
   int 10h	; устанавливаем текстовый режим
   
   lea dx, srcArray
   mov ah, 9
   int 21h
   
   cld  	; буду использовать строковые инструкции
   	; установим флаг направления
   mov cx, arsize
   lea si, ar
@@_next:
    lodsw
    CALL writeWordDEC_signed
    mov al, ' '
    int 29h
    int 29h
LOOP @@_next   
    ; определение минимального и максимального
    lea si, ar
    lodsw
    mov min_el, ax
    mov max_el, ax
 
    mov cx, arsize      
@@_analize_next:
      lodsw
      cmp ax, min_el
      jge @@10
      mov min_el, ax
@@10:
      cmp ax, max_el
      jle @@20
      mov max_el, ax
@@20:
LOOP @@_analize_next

  lea dx, minElem
  mov ah, 9
  int 21h
  mov ax, min_el
  CALL writeWordDEC_signed
  
  lea dx, maxElem
  mov ah, 9
  int 21h
  mov ax, max_el
  CALL writeWordDEC_signed
  
  lea dx, PressKey
  mov ah,9
  int 21h

  xor ax, ax
  int 16h

  int 20h
  
; две подпрограммы для вывода чисел на экран  
  writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
 push ax
 push bx
 push dx
 push cx
   mov bx, 10
   xor cx, cx
@@1:
   xor dx, dx
   div  bx
   push dx
   inc cx
   or ax, ax
   jnz @@1
 @@2:
   pop ax
   add al, '0'
   int 29h	; это прерывание умеет делать только одно -
   		; выводить символ в AL на экран
   LOOP @@2    
 pop  cx
 pop  dx
 pop  bx
 pop  ax
 ret
writeWordDEC endp

WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
; просто, если отрицательное, выводит минус, превращает в
; положительное и вызывает подпрограмму writeWordDEC
 or ax, ax
 jns @@_no_sign 
   push ax
   mov al, '-'
   int 29h
   pop ax
   neg ax ; изменение знака на +
@@_no_sign:
 CALL writeWordDEC     
 ret
WriteWordDEC_signed endp 

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

srcArray db 'Исходный массив:',13,10,'$'
maxElem  db 13,10,'Максимальный элемент массива: $'
minElem  db 13,10,'Минимальный  элемент массива: $'
ar       dw 12, 23, -3, 4, 0, 7	; сюда просто добавляйте числа, если хотите
arsize   equ ($ - ar)/2  	; так определяется констата = размер массива в словах (число элементов)
			; $ - операция вычисления текущего адреса
min_el   dw  ?
max_el   dw  ?		
end start


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