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

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

Вопрос:
Ввести элементы матрицы 3х4(слова). Из элементов четных столбцов создать одномерный массив mas1. Определить минимальный элемент MIN массива mas1. Все элементы mas1, не кратные 3, сложить с числом (-2). Вывести матрицу, начальный и измененный массив mas1, величину MIN.

Ответ:
Программа в приложении.
.model tiny
.code
  JUMPS
  LOCALS @@
org 100h
start:
   mov ax, 3
   int 10h

; jmp @@DEBUG   ;   - метка для отладки - без ввода  
   lea dx, msg_input
   mov ah, 9
   int 21h
   lea di, ar3x4
   cld
   mov cx, 3
@@1:
    push cx
    mov  cx, 4
@@2:       
    CALL inputWord
    CALL next_line
    stosw
    LOOP @@2
    
    pop  cx
    LOOP @@1
    
;  @@DEBUG:  ; - метка для отладки - без ввода  
   lea dx, msg_original
   mov ah, 9
   int 21h
   CALL outMatrix
   
; заполнение массива
; первый четный столбец
  lea si, ar3x4
  add si, 2
  lea di, mas1 
  mov cx, 3 
@@3:
  lodsw
  add si, 6
  stosw
LOOP @@3
; второй четный столбец
  lea si, ar3x4
  add si, 6
  mov cx, 3
@@4:    
  lodsw
  add si, 6
  stosw
  LOOP @@4     
  
; отображение исходного массива  
  lea dx, msg_mass1
  mov ah, 9
  int 21h
  lea si, mas1
  mov cx, 6
@@5:
  lodsw
  CALL writeDEC
  LOOP @@5  
  CALL next_line  
  
; поиск минимального элемента
  lea si, mas1
  lodsw
  mov bx, ax ; это и будет минимальный
  mov cx, 5
@@6:
   lodsw
   cmp ax, bx
   jge @@7
     mov  bx, ax
@@7:   
  LOOP @@6
  lea dx, msg_min
  mov ah, 9
  int 21h
  mov ax, bx
  CALL writeDEC
  CALL next_line

; изменение массива
  lea si, mas1
  mov cx, 6
  mov bx, 3
@@8:
  mov ax, [si]
  xor dx, dx
  div bx
  or dx, dx ; DX = остаток от деления, если 0, то кратен 3
  jz  @@9
    mov ax, [si]
    add ax, -2
    mov [si], ax
@@9:      
  add si, 2
  LOOP @@8
  
  lea dx, msg_mass2
  mov ah, 9
  int 21h
  lea si, mas1
  mov cx, 6
@@10:
    lodsw
    CALL writeDEC
    LOOP @@10  
  
  lea dx, PressKey
  mov ah,9
  int 21h
  xor ax, ax
  int 16h

  int 20h
  
inputWORD proc
; возвращает введенное слово в AX
; при переполнении возвращает то, что было "до тех пор"
 push bx
 push cx  ; хранилище
 push dx
 push si  ; Сивол знака
 xor  cx, cx
 xor  si, si ; положительное число
 mov  bx, 10 ; основание системы
@@inp_00: 
 mov ah, 7
 int 21h   ; ввод без эхо, ожидает нажатия
 cmp al, '-'
 jne  @@inp_01
   inc si
   int 29h
   jmp @@inp_03
@@inp_01:
 cmp al, 13  ; ENTER
 je  @@inp_out
@@inp_02: 
 cmp al, '0'
 jb  @@inp_03 ; не цифра
 cmp al, '9'
 ja  @@inp_03   
@@inp_next: 
 int 29h
 push ax
   mov ax, cx
   mul bx
   jc @@inp_out
   mov cx, ax   
 pop  ax 
 sub al, '0'
 xor ah, ah
 add cx, ax
 jc  @@inp_out
@@inp_03:
   mov ah, 7
   int 21h
   jmp @@inp_01
@@inp_out: 
 mov ax, cx 
 or si, si
 jz @@_inp_out
 neg ax
@@_inp_out: 
 pop  si
 pop  dx
 pop  cx
 pop  bx
 ret
inputWORD endp 
 
writeDEC proc  ;процедура вывода десятичного представления числа со знаком
;  Ожидется слово для вывода в AX
  push ax
  push bx
  push cx
  push dx
  push di  ; сигнал отрицательного знака
 xor cx, cx
 mov bx, 10
 xor di, di ; 0 = положительное
 or ax, ax
 jns @@next_digit ; переход, если не отрицательное
  inc di
  neg ax
@@next_digit:
 xor dx, dx
 div bx
 push dx
 inc cx
 or ax, ax
 jnz @@next_digit
 
 mov dx, count_of_digits
 sub dx, cx
 or di, di
 jz @@_zer
     dec dx
   @@_zer: 
     push cx
     mov  cx, dx
     mov al, ' '
   @@next_space:
     int 29h
   loop @@next_space    
   pop  cx  
 or di, di
 jz @@next_char
   mov al, '-'
   int 29h
@@next_char:
 pop ax
 add al, '0'
 int 29h
 loop @@next_char  
  pop  di  
  pop  dx
  pop  cx
  pop  bx
  pop  ax
  ret
writeDEC endp  
  
next_line proc ; переход на следующую строку
 push ax
  mov al, 13
  int 29h
  mov al, 10
  int 29h
 pop  ax
 ret
next_Line endp

outMatrix proc
 push ax
 push cx
 push si
   lea  si, ar3x4
   cld
   mov cx, 3
 @@1:
   push cx
   mov  cx, 4
 @@2:   
   lodsw
   CALL writeDEC
   LOOP @@2
   CALL next_line
   pop  cx
   LOOP @@1   
 CALL next_line  
 
 pop  si  
 pop  cx
 pop  ax
 ret
outMatrix endp 
  
msg_input    db 'Вводите целые числа (слова). Каждое число заканчиваете ENTER: ',13,10,'$'
msg_original db  13,10,'Исходная матрица',13,10,'$'
msg_mass1    db  13,10,'Исходный массив',13,10,'$'
msg_mass2    db  13,10,'Измененный массив',13,10,'$'
msg_min      db  13,10,'Минимальный элемент массива = $'
  
  
ar3x4 dw  1,  2,  3,  4   ; 4 dup (?)
      dw  5,  6,  7,  8   ; 4 dup (?)
      dw  9, 10, 11, 12 ; 4 dup (?)

mas1 dw 8 dup (?)   
count_of_digits  dw 6 ; обязательное число знаков - недостающие выведутся пробелами
     

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

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