![](/user_photo/2706_HbeT2.jpg)
- •Архитектура ЭВМ и язык ассемблера
- •Пример
- •Директивы определения данных
- •Типы операндов (команд)
- •Пересылки простые и неочевидные
- •Директива 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
![](/html/2706/752/html_DbeDdrbPgL.8dMJ/htmlconvd-nZ7fj26x1.jpg)
Директива 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
![](/html/2706/752/html_DbeDdrbPgL.8dMJ/htmlconvd-nZ7fj28x1.jpg)
Директива ORG
•Директива ORG устанавливает счетчик адресов в соответствии со значением заданного ей ‘выражения’. Последующие адреса инструкций и данных начинаются с этого нового значения. Можно использовать символ счетчика ($).
|
|
|
• ORG |
120h |
|
• Mov |
ax,dx; оператор mov начинается с |
|
байта 120h в текущем сегменте |
||
|
|
|
ORG |
$+2 |
|
ARRAY |
DW 100 DUP (0); |
•Переменная array декларируется с начальным адресом,на 2 байта превышающим текущий адрес
![](/html/2706/752/html_DbeDdrbPgL.8dMJ/htmlconvd-nZ7fj29x1.jpg)
Директива 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 |