ФУНКЦИЯ ВВОДА СИМВОЛА

ВЫВОД СТРОКИ НА ЭКРАН ДИСПЛЕЯ

ФУНКЦИИ ВВОДА/ВЫВОДА

ПРИМЕР НА ОБРАБОТКУ МАТРИЦЫ

 

Сумма матрицы.

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.