
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Примеры на обработку матрицы
(Примеры демонстрируют как использовать способы адресации для обращения к элементам матрицы. На компьютере примеры не проверены и требуют доработки )
Пример. Определить сумму элементов матрицы.
A DW 50 DUP (?)
N DW (?);N*M<=50
M DW (?)
S DW (?)
; --------------------
; ┌───┬───┬───┬───┬───┐ ┐
; │A11│A12│A13│A14│A15│>┐ │ A [BX + SI]
; └───┴───┴───┴───┴───┘ │ │ / \
; ┌───────────────────────┘ │ смещение строк смещ. эл-тов
; │ ┌───┬───┬───┬───┬───┐ │ относительно в строке от-
; └>│A21│A22│A23│A24│A25│>┐ ├─ M=3 начала носит.начала
; └───┴───┴───┴───┴───┘ │ │ N=5 строки
; ┌───────────────────────┘ │ SI = 0,2,4,6 -> дельта SI = 2
; │ ┌───┬───┬───┬───┬───┐ │ BX = 0,10,20 -> дельта BX = 10
; └>│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,N ;
SHL DX,1 ; дельта BX = n*2
MOV AX,0 ;S:=0
MOV CX,M ;счетчик цикла по строкам
C1: PUSH CX
MOV CX,N ;счетчик цикла по столбцам
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
; ┌───────────────┘ N=3 A[i,j] <-> A[j,i]
; │ ┌───┬───┬───┐
; └>│A21│A22│A23│>┐
; └───┴▄▄▄┴───┘ │ SI = 0,2,4 -> дельта SI = 2
; ┌───────────────┘ BX = 0,6,12 -> дельта 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