ФУНКЦИЯ ВВОДА СИМВОЛА
ВЫВОД СТРОКИ НА ЭКРАН ДИСПЛЕЯ
ФУНКЦИИ ВВОДА/ВЫВОДА
ПРИМЕР НА ОБРАБОТКУ МАТРИЦЫ
Сумма матрицы.
A DW 50 DUP (?)
N DW (?)
M DW (?)
S DW (?)
; --------------------
; ┌───┬───┬───┬───┬───┐ ┐
; │A11│A12│A13│A14│A15│>┐ │ A [BX + SI]
; └───┴───┴───┴───┴───┘ │ │ / \
; ┌───────────────────────┘ │ смещение строк смещ. эл-тов
; │ ┌───┬───┬───┬───┬───┐ │ относительно в строке от-
; └>│A21│A22│A23│A24│A25│>┐ ├─ N=3 начала носит.начала
; └───┴───┴───┴───┴───┘ │ │ строки
; ┌───────────────────────┘ │ SI = 0,2,4,6 -> дельта SI = 2
; │ ┌───┬───┬───┬───┬───┐ │ BX = 0,8,16 -> дельта BX = 8
; └>│A31│A32│A33│A34│A35│ │
; └───┴───┴───┴───┴───┘ ┘
; Решение на Паскале:
; for i:= 1 to n do
; for j:= 1 to m do
; s:=s+a[i,j]
MOV BX,0
MOV DX,M ;- дельта BX = m*2
SHL DX,1 ;/
MOV AX,0 ;S:=0
MOV CX,N ;счетчик цикла по строкам
C1: PUSH CX
MOV CX,M ;счетчик цикла по столбцам
MOV SI,0
C2: ADD AX,A[BX,SI]
INC SI
INC SI
LOOP C2
POP CX
ADD BX,DX
LOOP C1
MOV S,AX
В квадратной матрице поменять значения элементов, симметричных, относительно главной диагонали.
A DW 50 DUP (?)
N DW ? ; <=7
; ---------------------------
; ┌───┬───┬───┐ Решение на Паскале :
; │A11│A12│A13│>┐ for i:= 1 to n-1 do
; └▄▄▄┴───┴───┘ │ for j:=i+1 to n do
; ┌───────────────┘ A[i,j] <-> A[j,i]
; │ ┌───┬───┬───┐
; └>│A21│A22│A23│>┐
; └───┴▄▄▄┴───┘ │ SI = 0,2,4,6 -> дельта SI = 2
; ┌───────────────┘ BX = 0,8,16 -> дельта BX = 8
; │ ┌───┬───┬───┐
; └>│A31│A32│A33│
; └───┴───┴▄▄▄┘
;Будем использовать в программе математические индексы i,j
;В специальной процедуре будем вычислять смещение текущего элемента,
;относительно начала матрицы
; SI = 1,2..N – строки
; DI = 1,2..N – столбцы
; BX - смещение = f(i,j) = f(SI,DI)
; Cмещение строки = (i-1)*n*2
; Cмещение эл-тов строки = (j-1)*2
; BX = (i-1)*n*2 + (j-1)*2 = 2*((i-1)*n+j-1)
PUSH SI ; i
PUSH DI ; J
CALL SM
MOV AX,A[BX]
JMP ---
SM PROC NEAR
PUSH AX
PUSH DX
MOV BP,SP
MOV AX,[BP+8]
DEC AX
IMUL N
MOV BX,[BP+6]
DEC AX
IMUL N
MOV BX,[BP+6]
DEC BX
ADD BX,AX
SHL BX,1
POP DX
POP AX
RET 4
SM ENDP
----------------------
MOV CX,N ;-счетчик просмотра строк
DEC CX ;/
MOV SI,1 ;i:=1
с1: PUSH CX
;значение в CX в данном примере определяет кол-во просматривае-
;мых элементов текущей строки, поэтому новое значение CX не формируется.
MOV DI,SI ;-начальное значение j
INC DI ;/
C2: PUSH SI
PUSH DI
CALL SM
MOV AX,AC[BX]
PUSH BX
PUSH DI
PUSH SI
CALL SM
XCNG BX
MOV A[BX],AX
INC DI ; j:=j+1
LOOP C2
POP CX
INC SI ; i:=i+1
LOOP C1
Реализованы в 21h прерывании MS DOS.
Функция вызова команды int 21h
Команда работает аналогично команде сall, дополнительно она сохраняет в стеке регистры флагов и сбрасывает флаг прерывания. Функции MS DOS реализованы как обычные процедуры. Каждая из команд заканчивается командой IRET, аналогично RET, но дополнительно из стека восстанавливается регистр флагов.
MSD1 DB 'Введите размеры матрицы ',13,10,'$'
; с переводом каретки на начало строки
; $ – ограничитель строки
MOV AH,0Ah
LEA DX,BL_PARAM
INT 21h
;при вызове 21H прерывания машина ожидает ввода строки, начиная
;с текущей позиции курсора. Пользователь может набрать на экране
;6 символов максимум. При вводе следующего символа выдается
;предупреждающий звуковой сигнал и символ не вводится. Если стро-
;ка введена неправильно, то клавишей BackSpace ее можно исправить.
1) СТРОКА _ ENTER
123456 7
┌───┬───┬───┬───┬───┬───┬───┐
│'С'│'Т'│'Р'│'О'│'К'│'А'│0Dh│
└───┴───┴───┴───┴───┴───┴───┘
actlen = 6
2) CТР _ ENTER
┌───┬───┬───┬───┬───┬───┬───┐
│'С'│'Т'│'Р'│0Dh│ * │ * │ * │
└───┴───┴───┴───┴───┴───┴───┘
actlen = 3
Если не набран не один символ, то actlen = 0, а в поле S код = 0Dh
MOV AH,07h
INT 21h
Ввод символа без эха на экране. Символ возвращается в AL.
MOV AH,01h
INT 21h
Ввод символа с эхом на экране. Символ возвращается в AL.