Àññåìáëåð1_2_á

Download Report

Transcript Àññåìáëåð1_2_á

Системное программное обеспечение
Лекции: Ассемблер, система
прерываний, основы построения
компиляторов, ассемблер «под
Windows»
Семинары: подготовка к лабораторным
работам
Лаб. работы: 4 – по специальному
расписанию
Зачет: (кафедральный) по лаб. работам
Экзамен:
два вопроса и задача на ассемблере
1
1 Машинный язык
Структурная схема микропроцессора i8086
2
Регистры
a) четыре регистра общего назначения (регистры данных):
AX - регистр-аккумулятор,
BX - базовый регистр,
СХ - счетчик,
DX - регистр-расширитель аккумулятора;
б) три адресных регистра:
SI - регистр индекса источника,
DI - регистр индекса результата,
BP - регистр-указатель базы;
в) три управляющих регистра:
SP - регистр-указатель стека,
IP - регистр-счетчик команд,
PSW - регистр флагов (слово состояния программы);
г) четыре сегментных регистра:
CS - регистр сегмента кодов,
DS - регистр сегмента данных,
ES - регистр дополнительного сегмента данных,
SS - регистр сегмента стека.
3
Организация основной памяти
0
1
2
3 4
5
6
7 …
Адрес
базы
Смещение
Схема адресация «база +смещение»: A = Aб + Асм
Сегментная схема адресация микропроцессора i8086:
4
Схема адресации
Исполнительный адрес
Индекс
SI, DI
База
BX, BP
Смещение
Disp
+
Исполнительный
адрес (16)
Указатель
(32)
Блок преобразования
адресов
Сегментный
адрес (16)
Сегментныйрегистр
регистр
Сегментный
Сегментный
регистр
SS
Сегментный
регистр
ES
DS
CS
ОП
Физический
адрес (20)
5
Адресация сегментов
1. Сегмент кода:
CS: IP
2. Сегменты данных:
BX + DI + <Смещение>
BX + SI + <Смещение>
BP + DI + <Смещение>
DS: BP + SI + <Смещение>
ES: BX + <Смещение>
BP + <Смещение>
SI + <Смещение>
DI + <Смещение>
3. Сегмент стека:
SS:SP
6
Слово состояния программы (PSW)
О
D
I
Т
S
Z
А
P
С
- флаг переполнения;
- флаг направления;
- флаг прерывания;
- флаг трассировки;
- флаг знака: 1 - число < 0, 0 - число > 0;
- флаг нуля: 1 - число = 0;
- флаг переноса из тетрады;
- флаг четности;
- флаг заема/переноса.
7
Форматы машинных команд
Префиксы
Код
операции
1 байт
адресации
2 байта
смещения
2 байта
данных
р/памятьр
100010DW
Mod Reg R/M См.мл.байт См. ст.байт
литерал
р/память
1100011W
Mod 000 R/M
D - 1- в регистр, 0 - из регистра
W - 1- операнды-слова, 0 - байты
W=1
Reg 000 AX
001 CX
010 DX
011 BX
100 SP
101 BP
110 SI
111 DI
W=0
000 AL
001 CL
010 DL
011 BL
100 AH
101 CH
110 DH
111 BH
Sr
00 ES
01 CS
10 SS
11 DS
См.мл.байт См. ст.байт
Данные
Mod - 00 - Disp=0 байт
01 - Disp=1 байт
10 - Disp=2 байта
11 - операнды-регистры
M = 000
001
010
011
100
101
110
111
EA=(BX)+(SI) +Disp
EA=(BX)+(DI) +Disp
EA=(BP)+(SI) +Disp
EA=(BP)+(DI) +Disp
EA=( SI) +Disp
EA=(DI) +Disp
EA=( BP)+ Disp *
EA=(BX) + Disp
8
Примеры машинных команд
Примеры:
89 CB
1) mov BX,CX
100010DW Mod Reg R/M
10001001 11 001 011
2) mov CX, 6[BX]
8B
4F
06
100010DW Mod Reg R/M См.мл.байт
10001011 01 001 111 00000110
3) mov byte ptr 6[BX], 10
C6
47
06
0A
1100011W Mod 000 R/M См.мл.байт Данные
11000110 01 000 111 00000110 00001010
9
Ассемблер
Предложения ассемблера бывают четырех типов:
• команды или инструкции, представляющие собой
символические аналоги машинных команд.
В процессе трансляции инструкции ассемблера
преобразуются в соответствующие команды системы
команд микропроцессора;
• макрокоманды — оформляемые определенным
образом предложения текста программы,
замещаемые во время трансляции другими
предложениями;
• директивы, являющиеся указанием транслятору
ассемблера на выполнение некоторых действий. У
директив нет аналогов в машинном представлении;
• строки комментариев, содержащие любые
символы, в том числе и буквы русского алфавита.
Комментарии игнорируются транслятором.
10
Формат команды ассемблера
[<Метка> :] <Код операции > [<Спиcок операндов >]
; [<Комментарий>]
Примеры:
1) m1: mov AX,BX ; пересылка числа
2)
cbw
3) ; суммы по месяцам
11
Определение полей памяти для
размещения данных
DB <Число> или (<Список чисел>) или ?
[<Имя поля>] DW < Количество > DUP ( <Список чисел > )
DD < Количество > DUP ( ? )
Примеры:
a db 12
db ?
dw 1234H
db 5 dup (?)
a
0 C
?
b
b db ′A′
s
s dw 4,-1
k
k db 00001100b
3 4
1 2
?
?
?
?
0 0
F F
F F
?
6 1
0 4
0 C
12
Операнды команд ассемблера
1. Операнды команд ассемблера могут размещаться:
а) в регистрах;
б) в команде – литералы;
в) в памяти.
Примеры:
1) mov AX,10
2) mov AX, 6[BX+DI]
2. Длина операнда определяется:
а) кодом команды:
б) регистром:
в) явно: byte ptr, word ptr, dword ptr
Пример:
mov 0[BX],10  mov word ptr 0[BX],10
13
Команды пересылки / преобразования данных
1. Команда пересылки данных
MOV <Адрес приемника>,< Адрес источника>
Примеры:
Литерал
а) mov AX, BX
б) mov SI, 1000
в) mov 0[DI], AL
г) mov AX, code
mov DS, AX
Оперативная
память
AX,BX,CX,DX,
SI, DI. SP, BP
Сегментные
регистры
14
Команды пересылки / преобразования данных (2)
2. Команда обмена данных
ХCHG <Операнд 1> , <Операнд 2>
Примеры:
а) xchg BX, CX
б) xchg BX, 0[DI]
3. Команда загрузки исполнительного адреса
LEA <Регистр> , <Операнд 2>
Пример:
а) lea BX, exword
б) lea DI, 6[BX,SI]
Адрес
сегмента
Смещение
exword
15
Команды пересылки / преобразования данных (3)
4-5. Команды загрузки указателя
LDS <Регистр> ,<Операнд 2>
LЕS <Регистр > ,<Операнд 2>
Пример:
lds SI, exword
6-7. Команда записи слова в стек и извлечения из стека
PUSH <Операнд>
POP <Операнд>
Примеры:
push
pop
SI
0[BX]
16
Команды пересылки / преобразования данных (4)
8-9. Команды сложения
ADD <Операнд 1>, <Операнд 2>
ADC <Операнд 1>, <Операнд 2>
Пример. Сложение 32-разрядных чисел
mov AX,value1
мл.байт
ст.байт
add AX,value2
mov res,AX
mov AX,value1+2
adc AX,value2+2
mov res+2,AX
10-11. Команды вычитания
SUB <Операнд 1>, <Операнд 2>
SBB <Операнд 1>, <Операнд 2>
17
Команды пересылки / преобразования данных (5)
12. Команда сравнения
СМP <Операнд 1> , <Операнд 2>
Примеры:
а) cmp AX,5
б) cmp byte ptr 0[BX],’A’
13-14. Команда добавления/вычитания единицы
INC <Операнд>
DEC <Операнд>
Примеры:
inc AX
dec byte ptr 8[BX,DI]
15. Команда изменения знака
NEG <Операнд>
18
Команды пересылки / преобразования данных (6)
16-17. Команды умножения
MUL <Операнд>
IМUL <Операнд>
mov AX,4
imul word ptr A
19
Команды пересылки / преобразования данных (7)
18-19. Команды «развертывания» чисел
CBW
; AL -> AX
CWD
; AX -> DX:AX
20
Команды пересылки / преобразования данных (8)
20-21. Команды деления
DIV <Операнд>
IDIV <Операнд>
mov AX,40
cwd
idiv word ptr A
21
Пример программирования выражения
X = (A+C)(B-1)/(C+8)
A
B
C
X
Сегмент данных:
dw
25
dw
-6
dw
11
dw
?
Сегмент кода:
mov
CX,C
add
CX,8
mov
BX,B
dec
BX
mov
AX,A
add
AX,C
imul BX
idiv CX
mov
X,AX
22
Команды передачи управления
1. Команда безусловного перехода
short
JMP near ptr <Символическое имя или адрес>
far ptr
Примеры:
а)
jmp short Label1
б) cycle: …
jmp cycle
в)
jmp
BX
г)
jmp
dword ptr [BX]
23
Команды передачи управления (2)
2. Команды условного перехода
<Команда> <Символическое имя или адрес>
Команды условного перехода:
JZ
JE
JNZ
JNE
JL
JNG,
JG
JNL,
JA
JNA,
JB
JNB,
JLE
JGE
JBE
JAE
– переход по "ноль";
– переход по "равно";
– переход по "не нуль";
– переход по "не равно";
– переход по "меньше";
– переход по "меньше или равно ";
– переход по "больше";
– переход по "больше или равно ";
– переход по "выше" (беззнаковое “больше”);
– переход по "не выше"(беззнаковое “не больше”);
– переход по "ниже" (беззнаковое “меньше”);
– переход по "не ниже" (беззнаковое “не меньше”).
24
Условный переход на более чем 128 байт
jz zero

jnz continue
jmp zero
continue: ...
25
Программирование ветвлений
ELSE:
COM:
cmp
...
j<условие> ELSE
<операции 1>
jmp
COM
<операции 2>
<продолжение>
26
Пример 1. Процедура определения
большего числа
Написать процедуру вычисления X=max(A,B):
max
proc
mov
cmp
jl
mov
jmp
LESS:
mov
mov
CONTINUE: ret
max
endp
near
AX, A
AX, B
LESS
X, AX
CONTINUE
AX, B
X, AX
; сравнение A и B
; переход по меньше
;
переход на конец ветвления
27
Пример 2. Определение НОД (Ex1.asm)
code
segment
assume cs:code,ds:code
c
dw
?
a
dw
24
b
dw
18
begin proc far
push DS
mov AX,0
push AX
mov AX,code
mov DS,AX
28
Пример. Определение НОД (2)
Начало
Ввод
A, B
cycl
да
A=B
нет
да
A>B
A:=A-B
нет
lit
B:=B-A
com
Вывод
A
Конец
kon
mov
mov
cycl: cmp
je
jl
sub
jmp
lit: sub
com: jmp
kon: mov
ret
begin endp
code ends
end
ax,a
bx,b
ax,bx
kon
lit
ax,bx
short com
bx,ax
cycl
c,ax
begin
29
Команды передачи управления (3)
3. Команды организации циклической обработки
1) Команда организации цикла
LOOP < Символическое имя или адрес>
Пример:
mov cx, loop_count
begin_loop: < Тело цикла>
…
loop begin_loop
30
Команды передачи управления (4)
2) Команда перехода по обнуленному счетчику
JCXZ <адрес перехода>
Пример:
mov cx, loop_count
jcxz
end_of_loop
begin_loop: < Тело цикла >
…
loop begin_loop
end_of_loop: ...
31
Команды передачи управления (5)
3) Команды организации цикла с условием
LООРE <Символическое имя или адрес>
LOOPNE <Символическое имя или адрес>
Пример:
mov CX, loop_count
jcxz
end_of_loop
begin_loop:
< Тело цикла>
cmp
al, 100
loopne begin_loop
end_of_loop:
...
32
Программирование циклической обработки
Определить сумму натуральных чисел 1..n.
; сегмент данных
S
dw
0
n
dw
18
; сегмент кода
mov
CX,n
mov
AX,0
cycle: add
AX,CX
loop cycle
mov
S,AX
S=0
i=1,n
S=S+i
mov
mov
mov
cycle: add
inc
loop
mov
CX,n
AX,0
BX,1
AX,BX
BX
cycle
S,AX
33
Программирование обработки массивов
A
4
DS
6
-1
7
A
5
DS
A
4
6
-1
7
5
dw
4,6,-1,7,5
A
4
6
-1
7
5
S=0
BX
Вариант 1
mov
lea
mov
cycle:add
add
loop
BX
AX,0
BX,A
CX,5
AX,0[BX]
BX,2
cycle
Вариант 2
mov
AX,0
mov
BX,0
mov
CX,5
cycle:add
AX,A[BX]
add
BX,2
loop cycle
i=1,n
S=S+A[i]
34
Программирование обработки матриц
A
A
2
6
8
3
-8
6
DS
A
-1
5
-3
-1
4
1
db
db
db
8
7
6
2,3,1,-1,8
6,-8,5,4,7
8,6,3,1,6
DI
2
3
-1
-1
8
BX
mov
mov
cycle1: push
mov
cycle2: ...
inc
loop
pop
loop
BX,0
CX,3
CX
CX,5
A[BX]
BX
cycle2
CX
cycle1
6
-8
5
4
7
8
mov
mov
cycle1: push
mov
mov
cycle2: ...
add
loop
pop
inc
loop
6
-3
1
DI,0
CX,5
CX
CX,3
BX,0
A[BX,DI]
BX,5
cycle2
CX
DI
cycle1
6
35
Пример
Определить количество положительных, нулевых и отрицательных
значений в массиве
code
segment
assume cs:code,ds:code
x
dw
1,-1,3,0,15,-4,0
n
dw
7
ng
dw
?
nl
dw
?
nz
dw
?
;
begin
proc
far
push
ds
mov
ax,0
push
ax
mov
ax,code
36
mov
ds,ax
mov
mov
mov
mov
again:
cmp
jle
inc
jmp
less_or_eq: jl
inc
next:
add
dec
jnz
mov
sub
sub
mov
mov
mov
ret
begin
endp
code
ends
end
Пример (2)
cx,n
bx,0
di,bx
si,bx
x[bx],0
less_or_eq
di
short next
next
si
bx,2
cx
again
ax,n
ax,di
ax,si
ng,di
nl,ax
nz,si
Начало
ng=0
nz=0
i=1,n
>0
x[i]  0
ng=ng+1
=0
<0
ng=ng+1
nl=n-ng-nz
begin
Конец
37
Команды передачи управления (6)
4) Команды вызова подпрограмм
а) Команда вызова процедуры
CALL <Символическое имя или адрес >
б) Команда возврата управления
RET [<Целое>]
Текст процедуры должен быть оформлен в виде:
<Имя процедуры> ргос < Описатель удаленности>
<Тело процедуры>
<Имя процедуры> endp
38
Организация передачи управления в
процедуру
Основная
Процедура
программа
<Имя> PROC
CALL <Имя>
RET
<Имя> ENDP
Стек
Адрес возврата
2 или 4 байта
39
Команды обработки строк
DS:SI
DF =0
ES:DI
DF =0
Источник
Приемник
Элемент: байт или слово
Установка/сброс флага направления:
STD
CLD
40
Команды обработки строк (2)
DS:SI
1) Команда загрузки строки LODS
LODSB
; загрузка байта
LODSW
; загрузка слова
ES:DI
AX(AL)
2) Команда записи строки STOS
STOSB
; запись байта
STOSW
; запись слова
AX(AL)
DS:SI
3) Команда пересылки MOVS.
MOVSB
;пересылка байта
МОVSW
;пересылки слова
ES:DI
41
Команды обработки строк (3)
4) Префиксная команда повторения
REP <команда>
Пример:
mov CX,10
lea SI, A
lea DI, B
rep movsb
42
Команды обработки строк (4)
5) Команда сканирования строки SCAS
SCASB
;поиск байта
SCASW
;поиск слова
AX(AL)-(ES:DI) -> флаги
AX(AL)
ES:DI
6) Команда сравнения строк CMPS
СMPSB ;сравнение байт
СMPSW ;сравнение слов
(CS:SI)-(ES:DI) -> флаги
DS:SI
ES:DI
43
Команды обработки строк (5)
7) Префиксные команды "повторять, пока равно" и
"повторять, пока не равно"
REPE
< Команда >
REPNE < Команда >
Пример:
mov CX,10
lea SI, A
lea DI, B
repe cmpsb
44
Пример. Сравнение строки с таблицей (Ex2_2)
S
ES:DI
Tabl
DS:SI
ABCDE
Flaq=0
SFDYE
i = 1,6
DHFYU
ABCDR
FYEDK
нет
S=Tabl[i]
да
ABCDE
Flaq=0
SYUFK
Flaq=i
45
Сравнение строки с таблицей (2)
code segment
assume CS:code,DS:code,ES:code
Flag DB
0
S
DB
'ABCDE'
Tabl DB
'ARTYG','FGJJU'
DB
'FGHJK','ABCDY'
DB
'ABCDE','FTYRG'
begin proc far
push DS
mov
AX,0
push AX
mov
AX,code
mov
DS,AX
mov
ES,AX
lea
SI,S
lea
DI,Tabl
mov
CX,6
mov
BL,1
cld
46
Сравнение строки с таблицей (3)
Cycle:
push SI
push DI
push CX
mov
CX,5
repe cmpsb
pop
CX
pop
DI
pop
SI
je
Found
add
DI,5
inc
BL
loop Cycle
jmp
not_Found
Found: mov byte ptr Flag,BL
not_Found: ret
begin
endp
code
ends
end begin
47
Команды манипулирования битами
1. Логические команды
NOT <Операнд> ; логическое НЕ;
AND <Операнд 1>, <Операнд 2> ;логическое И;
OR
<Операнд 1>, <Операнд 2> ;логическое ИЛИ;
XOR <Операнд 1>, <Операнд 2> ;исключающее ИЛИ;
TEST <Операнд 1>, <Операнд 2> ; И без записи результата
Пример. Выделить из числа в AL первый бит:
and
al, 10000000B
10110001
10000000
10000000
48
Команды манипулирования битами (2)
2. Команды сдвига
<Код операции> <Операнд>, СL или 1
Команды:
SAL – сдвиг влево арифметический;
CF
0
SHL – сдвиг влево логический;
CF
0
SAR – сдвиг вправо арифметический;
SHR – сдвиг вправо логический;
ROL – сдвиг влево циклический;
CF
CF
0
CF
ROR – сдвиг вправо циклический;
CF
RCL – сдвиг циклический влево с флагом переноса;
RCR – сдвиг циклический вправо с флагом переноса
49
Команды манипулирования битами (3)
Пример. Умножить число в AX на 10:
mov
bx, ax
shl
ax, 1
shl
ax, 1
add
ax, bx
shl
ax, 1
50
Управление вводом/выводом
Генератор
синхронизации
Шина
Упр.
шиной
МП
И
н
т
с
ОП
Интерфейс
Порты
Устройство
в/в
IN
AL или AX, <Порт> или DX
OUT <Порт> или DX, AL или AX
Пример:
in
AL, 60H
out
60H, AL
51