
- •Архитектура ЭВМ и язык ассемблера
- •Пример
- •Директивы определения данных
- •Типы операндов (команд)
- •Пересылки простые и неочевидные
- •Директива ASSUME-специфицирует
- •Построить листинг, запустить отладчик (debug , –t, -r, u)
- •Директива ORG
- •Директива EVEN
- •Сложение и вычитание
- •Работа с данными и адресами: операторы и директивы
- •Адресация в Ассемблере
- •Адресация в Ассемблере
- •Адресация в Ассемблере
- •Адресация в Ассемблере
- •Адресация
- •Безусловный переход и цикл
- •TITLE Add and Subtract, Version 2 (AddSub2.asm)
- •Способы адресации Построить сегменты и создать exe файлы
- •Процесс создания программы
- •Учебная библиотека
- •Стек
- •Стек, использование.
- •TITLE Программа реверсирования строк
- •Определение процедур
- •Использование процедур
- •Директивы PROC и ENDP
- •Пример с процедурами
- •Пример с процедурами (продолжение)
- •Директивы MACRO,ENDM
- ••Синтаксис макроопределения
Архитектура ЭВМ и язык ассемблера
Пример
TITLE Сложение и вычитание (AddSub.asm) ; числа 32-разрядные
.386
.MODEL flat, sdtcall
.STACK 4096
ExitProcess PROTO, dwExitCode:DWORD DumpRegs PROTO
.code |
|
|
main |
PROC |
|
|
mov |
eax,1000h |
|
add |
eax,4000h |
|
sub |
eax,2000h |
|
call DumpRegs |
|
|
INVOKE ExitProcess,0 |
|
main |
ENDP |
|
END |
main |
2 |
|
|
Директивы определения данных
• Структура
[имя] код инициализатор[,инициализаторы]
• Имя идентификатор
–символическое обозначение адреса данных
•Код
–Символическое обозначение варианта директивы
–BYTE, SBYTE, WORD, SWORD, DWORD, DSWORD
–FWORD, QWORD, TBYTE
–REAL4, REAL8, REAL10
•Инициализаторы
–Константное выражение, в т.ч. (символическая) константа,
–Повтор: DUP , неинициализатор: ?
•Порядок следования байтов – сначала младшие
3
Типы операндов (команд)
• r8, r16,r32 – 8-, 16-, 32-разрядный РОН
•reg – произвольный РОН
•sreg – 16-разрядный сегментный регистр
•imm8,imm16,imm32 – 8-, 16-, 32-разрядное значение, заданное непосредственно в команде
•r/m8,r/m16,r/m32 – 32-разрядный 8-, 16-, 32- разрядный операнд, кодирующий 8-, 16-, 32-
разрядный РОН или адрес 8-, 16-, 32-разрядного операнда в памяти
• mem- адрес 8-, 16-, 32-разрядного операнда в памяти
4
Пересылки простые и неочевидные
MOV получатель, источник
-Длина одинаковая
-Один операнд – обязательно регистр
- |
Нельзя получать в CS, IP, EIP |
- |
Нельзя imm16 в sreg |
MOVZX/MOVESX расширение (без)знаковое LAHF/SAHF опрос/установка младших флагов XCHG обмен данными
5

Директива ASSUME-специфицирует
‘сегментный регист’ как регистр, принимаемый по умолчанию для всех меток и переменных.
•assume CS:code,DS:data
•code segment ;Откроем сегмент команд
•begin:
• |
mov |
AX,data ;Настроим DS |
• |
mov |
DS,AX ;на сегмент данных; |
• |
mov |
DX,offset string ;Адрес выводимой строки |
• |
mov |
ah,09h |
• |
int |
21h ;Вызов DOS |
• |
mov |
AX,4C00h ;Функция DOS завершения программы |
• |
int |
21h ;Вызов DOS |
•code ends ;Закроем сегмент команд
•data segment ;
• string |
db |
"The program works!$" ; |
•data ends ;Закроем сегмент данных
• |
stk segment stack ;Откроем сегмент стека |
256 байт |
|
• |
db |
256 dup (?) ;Отводим под стек |
•stk ends ;Закроем сегмент стека
•end begin ;Конец
Построить листинг, запустить отладчик (debug , –t, -r, u)
• |
Microsoft (R) Macro Assembler Version 4.00 |
3/4/13 17:48:31 |
|||
• |
|
|
|
|
|
• |
|
|
|
|
Page 1-1 |
• |
|
|
|
|
|
• |
1 |
|
assume CS:code,DS:data |
|
|
• |
2 0000 |
|
code |
segment ;Откроем сегмент команд |
|
• |
3 0000 |
B8 ---- R |
begin: |
mov |
AX,data ;Настроим DS |
• |
4 0000 |
|
|||
• |
5 0003 |
8E D8 |
|
mov |
DS,AX ;на сегмент данных; |
• |
6 0005 |
BA 0000 R |
|
mov |
DX,offset string ;Адрес выводимой |
•строки
• |
7 |
0008 B4 09 |
mov |
ah,09h;обращение за воспроизведением строки |
|
• |
8 |
000A |
CD 21 |
int |
21h ;Вызов DOS |
• |
9 |
000C |
B8 4C00 |
mov |
AX,4C00h ;Функция DOS завершения |
•программы
• |
10 000F CD 21 |
int |
21h ;Вызов DOS |
•11
• |
12 0011 |
code |
ends ;Закроем сегмент команд |
•13
• |
14 0000 |
data |
segment ; |
db |
"The program works!$" ; |
• |
15 0000 |
54 68 65 20 70 72 6F |
string |
•16 67 72 61 6D 20 77 6F
•17 72 6B 73 21 24
• |
18 0013 |
data |
ends ;Закроем сегмент данных |
•19
• |
20 0000 |
stk |
segment stack ;Откроем сегмент сте |
•ка
• |
21 0000 0100[ |
db |
256 dup (?) ;Отводим под стек 256 |
•байт
• |
22 |
?? |
• |
23 |
] |
•24
• |
25 0100 |
stk ends ;Закроем сегмент стека |
•26
• |
27 |
end begin ;Конец |
3/4/13 17:48:31 |
• |
Microsoft (R) Macro Assembler Version 4.00 |
||
• |
|
|
|
• |
|
|
Symbols-1 |
• |
|
|
|
•Segments and Groups:
• |
N a m e |
|
Size |
Align |
Combine Class |
• |
CODE . . . . . . . . . . . . . |
. |
0011 |
PARA |
NONE |
• |
DATA . . . . . . . . . . . . . . |
0100 |
0013 |
PARA |
NONE |
• |
STK . . . . . . . . . . . . . . |
PARA |
STACK |
|
•Symbols:
• |
N a m e |
Type |
Value |
Attr |
• |
BEGIN . . . . . . . . . . . . . |
L NEAR |
0000 |
CODE |
• |
STRING . . . . . . . . . . . . . |
L BYTE |
0000 |
DATA |
•22 Source Lines
• 22 Total Lines
•26 Symbols
•49888 Bytes symbol space free
•0 Warning Errors
•0 Severe Errors

Директива ORG
•Директива ORG устанавливает счетчик адресов в соответствии со значением заданного ей ‘выражения’. Последующие адреса инструкций и данных начинаются с этого нового значения. Можно использовать символ счетчика ($).
|
|
|
• ORG |
120h |
|
• Mov |
ax,dx; оператор mov начинается с |
|
байта 120h в текущем сегменте |
||
|
|
|
ORG |
$+2 |
|
ARRAY |
DW 100 DUP (0); |
•Переменная array декларируется с начальным адресом,на 2 байта превышающим текущий адрес

Директива EVEN
•Директива EVEN выравнивает последующий байт данных или инструкции по границе некоторого слова. Если текущее значение счетчика адресов нечетно, то эта директива увеличивает значение счетчика адресов до четного и генерирует инструкцию NOP, если четно, то не делает ничего.
• |
|
ORG |
0 |
|
• |
Test1 |
DB |
1 |
|
• |
|
EVEN |
|
|
• |
Test2 |
DW |
513 |
|
•EVEN указывает на необходимость увеличения счетчика и генерирует NOP(90h). Смещение равно 2, а не 1, если бы было EVEN
Сложение и вычитание
• Команды |
|
INC reg/mem |
|
DEC reg/mem |
|
NEG reg/mem |
|
ADD получатель, источник |
|
SUB получатель, источник |
|
• Флаги |
|
ZF- обнуление |
|
CF- выход за границу разрядной сетки |
|
OF- выход за границу дополнительного кода |
|
SF- копия старшего (знакового) бита |
10 |