|
Ассемблер в примерах - Матрицы и массивы
- Вопрос:
- Ввести элементы матрицы 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
| |