Разделы презентаций


Архитектура ЭВМ и язык ассемблера

Содержание

ПримерTITLE Сложение и вычитание (AddSub.asm); числа 32-разрядные.386.MODEL flat, sdtcall.STACK 4096ExitProcess PROTO, dwExitCode:DWORDDumpRegs PROTO.codemain PROCmov eax,1000hadd eax,4000hsub eax,2000hcall DumpRegsINVOKE ExitProcess,0main ENDPEND main

Слайды и текст этой презентации

Слайд 1Архитектура ЭВМ
и язык ассемблера

Архитектура ЭВМ и язык ассемблера

Слайд 2
Пример
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
ПримерTITLE Сложение и вычитание (AddSub.asm); числа 32-разрядные.386.MODEL flat, sdtcall.STACK 4096ExitProcess PROTO, dwExitCode:DWORDDumpRegs PROTO.codemain PROCmov eax,1000hadd eax,4000hsub eax,2000hcall

Слайд 3




Директивы определения данных
• Структура
[имя] код инициализатор[,инициализаторы]
• Имя

идентификатор
– символическое обозначение адреса данных
• Код
Символическое обозначение варианта директивы
BYTE,

SBYTE, WORD, SWORD, DWORD, DSWORD
FWORD, QWORD, TBYTE
REAL4, REAL8, REAL10

• Инициализаторы

– Константное выражение, в т.ч. (символическая) константа,
– Повтор: DUP , неинициализатор: ?

• Порядок следования байтов – сначала младшие

––––Директивы определения данных• Структура[имя] код инициализатор[,инициализаторы]• Имя     идентификатор– символическое обозначение адреса данных• КодСимволическое

Слайд 4
Типы операндов (команд)
• 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-разрядного операнда в памяти

Типы операндов (команд)• r8, r16,r32 – 8-, 16-, 32-разрядный РОН• reg – произвольный РОН• sreg – 16-разрядный

Слайд 5
-
-
-
-
Пересылки простые и неочевидные
MOV получатель, источник
Длина одинаковая
Один операнд – обязательно

регистр
Нельзя получать в CS, IP, EIP
Нельзя imm16 в sreg
MOVZX/MOVESX расширение

(без)знаковое
LAHF/SAHF опрос/установка младших флагов
XCHG обмен данными
----Пересылки простые и неочевидныеMOV получатель, источникДлина одинаковаяОдин операнд – обязательно регистрНельзя получать в CS, IP, EIPНельзя imm16

Слайд 6Директива 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 ;Откроем сегмент стека
db 256 dup (?) ;Отводим под стек 256 байт
stk ends ;Закроем сегмент стека
end begin ;Конец
Директива ASSUME-специфицирует ‘сегментный регист’ как регистр, принимаемый по умолчанию для всех меток и переменных.assume CS:code,DS:datacode 	segment ;Откроем

Слайд 7Построить листинг, запустить отладчик (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 begin:
4 0000 B8 ---- R mov AX,data ;Настроим DS
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 ;
15 0000 54 68 65 20 70 72 6F string db "The program works!$" ;
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 ;Конец
Microsoft (R) Macro Assembler Version 4.00 3/4/13 17:48:31

Symbols-1


Segments and Groups:

N a m e Size Align Combine Class

CODE . . . . . . . . . . . . . . 0011 PARA NONE
DATA . . . . . . . . . . . . . . 0013 PARA NONE
STK . . . . . . . . . . . . . . 0100 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

Построить листинг, запустить отладчик (debug , –t, -r, u) Microsoft (R) Macro Assembler Version 4.00

Слайд 8
Директива ORG
Директива ORG устанавливает счетчик адресов в соответствии со значением

заданного ей ‘выражения’. Последующие адреса инструкций и данных начинаются с

этого нового значения. Можно использовать символ счетчика ($).
ORG 120h
Mov ax,dx; оператор mov начинается с байта 120h в текущем сегменте

ORG $+2
ARRAY DW 100 DUP (0);
Переменная array декларируется с начальным адресом,на 2 байта превышающим текущий адрес

Директива ORGДиректива ORG устанавливает счетчик адресов в соответствии со значением заданного ей ‘выражения’. Последующие адреса инструкций и

Слайд 9Директива EVEN
Директива EVEN выравнивает последующий байт данных или инструкции по

границе некоторого слова. Если текущее значение счетчика адресов нечетно, то

эта директива увеличивает значение счетчика адресов до четного и генерирует инструкцию NOP, если четно, то не делает ничего.
ORG 0
Test1 DB 1
EVEN
Test2 DW 513
EVEN указывает на необходимость увеличения счетчика и генерирует NOP(90h). Смещение равно 2, а не 1, если бы было EVEN

Директива EVENДиректива EVEN выравнивает последующий байт данных или инструкции по границе некоторого слова. Если текущее значение счетчика

Слайд 10
Сложение и вычитание
• Команды
INC reg/mem
DEC reg/mem
NEG reg/mem
ADD получатель, источник
SUB получатель,

источник
• Флаги
ZF- обнуление
CF- выход за границу разрядной сетки
OF- выход за

границу дополнительного кода
SF- копия старшего (знакового) бита
Сложение и вычитание• КомандыINC reg/memDEC reg/memNEG reg/memADD получатель, источникSUB получатель, источник• ФлагиZF- обнулениеCF- выход за границу разрядной

Слайд 11
Работа с данными и адресами:
операторы и директивы
• OFFSET – вычислить

смещение от начала
сегмента в адресном выражении
• ALIGN – установить начало

очередных
данных на границу указанного размера
• PTR – установить размер указываемых

данных

• TYPE, LENGTHOF, SIZEOF – вычислить

размер данных

• LABEL – задать имя и тип адреса, без

выделения памяти,

Работа с данными и адресами:операторы и директивы• OFFSET – вычислить смещение от началасегмента в адресном выражении• ALIGN

Слайд 12Адресация в Ассемблере
1. Регистровая адресация - операнды располагаются в любых

регистрах общего назначения или сегментных регистрах mov bx, ax mov es, ax 2.

Непосредственная адресация mov ax, 2 add ax, 2 3. Прямая адресация - если известен адрес операнда располагающегося в памяти mov ax,es:0001 mov ax, es:word_var В последнем случае ассемблер сам заменит слово word_var на соответствующий адрес
Адресация в Ассемблере1. Регистровая адресация - операнды располагаются в любых регистрах общего назначения или сегментных регистрах mov

Слайд 13Адресация в Ассемблере
4. Косвенная адресация - адрес операнда в памяти

можно не указывать непосредственно, а хранить в любом регистре mov ax,

[bx] 5. Адресация по базе со сдвигом - комбинация двух предыдущих методов адресации mov ax, [bx+2] mov ax, [bp]+2
Адресация в Ассемблере 4. Косвенная адресация - адрес операнда в памяти можно не указывать непосредственно, а хранить

Слайд 14Адресация в Ассемблере
6. Косвенная адресация с масштабированием mov ax,[esi*2]+2 -

этот метод адресации полностью идентичен предыдущему, за исключением того, что

с его помощью можно прочитать элемент массива слов, двойных слов или учетверенных слов, просто поместив номер элемента в регистр множитель, может быть равен 1, 2, 4 или 8 - соответствует размеру элемента массива — байту, слову, двойному слову, учетверенному слову соответственно
Адресация в Ассемблере  6. Косвенная адресация с масштабированием mov ax,[esi*2]+2 - этот метод адресации полностью идентичен

Слайд 15Адресация в Ассемблере
7. Адресация по базе с индексированием - в

этом методе адресации смещение операнда в памяти вычисляется как сумма

чисел, содержащихся в двух регистрах, и смещения, если оно указано Все следующие команды — это разные формы записи одного и того же действия: mov ax,[bx+si+2] mov ax,[bx][si]+2 mov ax,[bx+2][si] mov ax,[bx][si+2] mov ax,2[bx][si] 8. Адресация по базе с индексированием и масштабированием - это самая полная возможная схема адресации, в которую входят все случаи, рассмотренные ранее, как частные mov eax, ds:[eax+ebx*2+2]
Адресация в Ассемблере7. Адресация по базе с индексированием - в этом методе адресации смещение операнда в памяти

Слайд 16
Адресация

• Прямая (адрес задан непосредственно)
MOV

MOV

MOV

MOV
al,var1

al,[var1]

al,[arrayB+1]

al,[arrayD+4]
• Косвенная

MOV al,[esi]

INC BYTE PTR [esi]

Адресация• Прямая (адрес задан непосредственно)MOVMOVMOVMOVal,var1al,[var1]al,[arrayB+1]al,[arrayD+4]• КосвеннаяMOV al,[esi]INC BYTE PTR [esi]

Слайд 17
Безусловный переход и цикл
JMP метка_перехода
– безусловный переход
LOOP метка_перехода
– ECX/CX уменьшается

на единицу
– если ECX/CX не ноль, то переход по метке

иначе следующая команда

LOOPD всегда ECX
LOOPW всегда CX

Безусловный переход и циклJMP метка_перехода– безусловный переходLOOP метка_перехода– ECX/CX уменьшается на единицу– если ECX/CX не ноль, то

Слайд 18
;
;
;
;
;
TITLE Add and Subtract, Version 2 (AddSub2.asm)
; Сложение и вычитание

32-битных целых переменных
; результат – в переменной.

INCLUDE Irvine32.inc
.data
val1
val2
val3
finalVal
dword
dword
dword
dword
10000h
40000h
20000h
?
Ещё пример
.code
main PROC
mov

eax,val1
add eax,val2
sub eax,val3
mov finalVal,eax
call DumpRegs

exit
main ENDP
END main

Загрузить 10000h
добавить 40000h
вычесть 20000h
записать результат (30000h)
отобразить регистры

;;;;;TITLE Add and Subtract, Version 2 (AddSub2.asm); Сложение и вычитание 32-битных целых переменных; результат – в переменной.INCLUDE

Слайд 19Способы адресации Построить сегменты и создать exe файлы

Способы адресации Построить сегменты и создать exe файлы

Слайд 20⇐Решения ОС
Процесс создания программы
• Редактор
⇒Ваш исходный текст
• Ассемблер
⇒Объектный код
• Компоновщик
⇒Загрузочный

код
Ввод предписаний
⇐Изменения текста
Предписания трансляции
⇐Текстовые библиотеки

Предписания компоновки
⇐Статический код

• ОС+аппаратура
⇒Результат

Предписания исполнения
⇐Внешние события
⇐Внешние данные и код

• Загрузчик Предписания загрузки
link32 AddSub.obj irvine32.lib kernel32.lib
⇒Исполняемый код

⇐Решения ОСПроцесс создания программы• Редактор⇒Ваш исходный текст• Ассемблер⇒Объектный код• Компоновщик⇒Загрузочный код  Ввод предписаний⇐Изменения текста  Предписания

Слайд 21
Учебная библиотека
ClrScr
CrLf
Delay
DumpMem
DumpRegs
GetCommandTail
GetMseconds
GotoXY
Random32
RandomiZe
ReadChar
ReadHex
ReadInt
ReadString
SetTextColor
WaitMsg
WriteBin
WriteChar
WriteDec
WriteHex
WriteInt
WriteString

Учебная библиотекаClrScrCrLfDelayDumpMemDumpRegsGetCommandTailGetMsecondsGotoXYRandom32RandomiZeReadCharReadHexReadIntReadStringSetTextColorWaitMsgWriteBinWriteCharWriteDecWriteHexWriteIntWriteString

Слайд 22




Стек
• Понятие стека
– LIFO (Last-In, FIst-Out)
• Стековая адресация памяти
– SS

ESP
– «рост» в сторону меньших адресов
PUSH/POP r/m16|r/m32|imm32|imm16
PUSHFD/POPFD – флаги 32

бита
PUHSF/POPF - флаги 16 бит

PUSHAD/POPAD – регистры по 32 бита

EAX,ECX,EBX,ESP,EBP,ESI,EDI

• PUHSA/POPA - регистры по 16 бит

AX, CX, BX, SP, BP, SI, DI

••••Стек• Понятие стека– LIFO (Last-In, FIst-Out)• Стековая адресация памяти– SS ESP– «рост» в сторону меньших адресовPUSH/POP r/m16|r/m32|imm32|imm16PUSHFD/POPFD

Слайд 23


Стек, использование.
PUSHF
POPF
; SP

регистров”
● Доступ к элементам, BP.
• ВАЖНО:
Баланс операций PUSH и POP

Контроль границ
● Соглашения при передаче управления
●●Стек, использование.PUSHFPOPF; SP

Слайд 24
END main
TITLE Программа реверсирования строк
INCLUDE Irvine32.inc
(RevString.asm)
.data
aName BYTE "abcdefghijklmnopqrstuvwxyz0123456789",0
nameSiZe

= ($ - aName) - 1
.code
main PROC
; Поместим строку посимвольно
mov

ecx,nameSize
mov esi,0
L1: movzx eax,aName[esi] ;
push eax ;
inc esi
Loop L1
; Восстановим строку из стека
mov ecx,nameSize
mov esi,0
L2: pop eax ;
mov aName[esi],al ;
inc esi
Loop L2

в стек


Загрузим символ строки
Поместим его в стек


в обратном порядке.


Загрузим символ из стека
Сохраним в массиве

; Отобразим строку
mov edx,OFFSET aName
call WriteString
call CrLf
exit
main ENDP
Пример работы со стеком

END mainTITLE Программа реверсирования строк	INCLUDE Irvine32.inc(RevString.asm).dataaName  BYTE

Слайд 25




Определение процедур

• PROC и ENDP




PROC

ENDP
• Документирование
Целевые

действия
Ожидаемые параметры
Возвращаемый результат
Необходимые условия
• CALL и RET
– адрес возврата -

в стеке
– CALL <имя процедуры> (адрес втолкнуть и перейти)
– RET (оказаться по вытолкнутому адресу)
––––	Определение процедур• PROC и ENDPPROC ENDP• Документирование		Целевые действия		Ожидаемые параметры		Возвращаемый результат		Необходимые условия• CALL и RET	– адрес возврата -

Слайд 26




Использование процедур
• Вложенные вызовы
• Локальные L1: и глобальные L2:: метки

Передача параметров через регистры
• Сохранение и восстановление регистров
PROC USES reg1

reg2 …

• Функциональная декомпозиция

Разбиение сложного действия на простые
Автономная проверка простых действий
Обнаружение связей и оценка их «силы»

Разделение «структурирования» и кодирования

––––Использование процедур• Вложенные вызовы• Локальные L1: и глобальные L2:: метки• Передача параметров через регистры• Сохранение и восстановление

Слайд 27Директивы PROC и ENDP
 
Push ax;ввод в стек 3-го параметра
Push bx;ввод

в стек 2-го параметра
Push cx;ввод в стек 1-го параметра
Call addup:вызов

процедуры
Add cp, 6:удаление введенных в стек параметров
Addup proc near;адрес возврата для ближнего обращения
Занимает 2 байта
Push bp;сохранение указателя основания ещё 2 байта, поэтому параметры начинаются с 4-го байта
Mov bp, sp;загрузка стека в указатель основания
Mov ax,[bp+4]; получение 1-го параметра
Add ax,[bp+6] ; получение 2-го параметра
Add ax,[bp+8] ; получение 3-го параметра
Pop bp;восстановление основания
Ret;возврат
Addup endp
 

Директивы PROC и ENDP Push	 ax;ввод в стек 3-го параметраPush	 bx;ввод в стек 2-го параметраPush	 cx;ввод в стек

Слайд 28Пример с процедурами
TITLE Программа суммирования целых чисел

(Sum2.asm)
; Запрашивает несколько целых чисел, сохраняет их в

массиве, ; вычисляет сумму и отображает полученный результат
INCLUDE Irvine32.inc
IntegerCount = 3 ; Размер массива
.data
promptl BYTE "Введите целое число со знаком: ",0
prompt2 BYTE "Сумма чисел равна: ",0
array DWORD IntegerCount DUP(?)
.code
mainPROC
call ClrScr
mov esi,OFFSET array
mov ecx,IntegerCount
call PromptForlntegers
call ArraySum
call DisplaySum
exit main ENDP
;----------------------------------------------------------------
PromptForlntegers PROC
; Запрашивает числа и записывает их в массив.
; Передается: ESI = адрес массива двойных слов,
; ЕСХ= размер массива.
; Возвращается: ничего
; Вызывает: Readlnt, WriteString
;--------------------------------------------------------------

pushad ; Сохраним все регистры
mov edx,OFFSET promptl ; Адрес приглашения
L1:
call WriteString ; Выведем приглашение
call Readlnt ; Прочитаем число (оно в ЕАХ)
mov [esi],eax ; Запишем число в массив
add esi,4 ; Скорректируем указатель
; на следующий элемент массива
call CrLf ; Перейдем на новую строку' на экране
loop L1
popad ; Восстановим все регистры
ret
PromptForlntegers ENDP



Пример с процедурамиTITLE Программа суммирования целых чисел      (Sum2.asm); Запрашивает несколько целых чисел,

Слайд 29Пример с процедурами (продолжение)
ArraySum PROC
Вычисляет сумму элементов массива 32-разрядных целых

чисел
Передается: ESI = адрес массива
ЕСХ = количество элементов массива
Возвращается:

ЕАХ = сумма элементов массива
push esi ; Сохраним значения регистров ESI и ЕСХ
push, ecx;
mov еах,О ; Обнулим значение суммы
Ы: add eax,[esi] ; Прибавим очередной элемент массива
add esi,4 ; Вычислим адрес следующего элемента массива
loop L1 ;Повторим цикл для всех элементов массива
pop ecx ; Восстановим значения регистров ESI и ЕСХ
pop esi
ret ; Вернем сумму в регистре ЕАХ
ArravSum EXDP
;-------------------------------------------------------------------------------
DisplavSum PROC
Отображает сумму элементов массива на экране.
Передается: ЕАХ = сумма элементов массива
Возвращается: ничего
Вызывает: WriteString, Writelnt
;-------------------------------------------------------------------------------
push edx
mov edx.OFFSET prompt2 ; Выведем пояснение
call WriteString
call Writelnt ; Отобразим регистр ЕАХ
call CrLf
pop edx
DisplaySum ENDP
END main

Пример с процедурами (продолжение)ArraySum PROCВычисляет сумму элементов массива 32-разрядных целых чиселПередается: ESI = адрес массиваЕСХ = количество

Слайд 30org 100h
start: mov ax,13h; устанавливаем режим 320х240х256 цветов
int 10h

push 0A000h; ES=0A000h начало видеопамяти в графических режимах

pop es
mov di,50*320+50; начало линий в точке Х=50 Y=50
mov al,0Fh; цвет линий
mov cx,110
rep stosb; выводим горизонтальную линию
mov di,50*320+50
mov cx,100
a1: stosb; рисуем вертикальную линию
add di,319
loop a1
mov di,50*320+50
mov cx,75
a2: stosb; линия под углом 45 градусов
add di,320
loop a2
mov di,50*320+50
mov cx,50
a3: stosb; линия под углом 30 градусов
stosb
add di,320
loop a3
mov ah,0; даем полюбоваться на дела рук своих пока не нажмут на клавиатуру
int 16h
mov ax,3; устанавливаем текстовый режим
int 10h
ret; выходим из программы

org 100hstart:	mov ax,13h; устанавливаем режим 320х240х256 цветов  int 10h  push 0A000h; ES=0A000h начало видеопамяти в

Слайд 31Директивы MACRO,ENDM
Макрокоманда представляет собой строку, содержащую некоторое символическое имя —

имя макрокоманды, предназначенную для того, чтобы быть замещенной одной или

несколькими другими строками. Имя макрокоманды может сопровождаться параметрами.
Директивы MACRO,ENDMМакрокоманда представляет собой строку, содержащую некоторое символическое имя — имя макрокоманды, предназначенную для того, чтобы быть

Слайд 32Синтаксис макроопределения следующий: имя_макрокоманды macro список_формальных_аргументов
тело макроопределения
endm

Синтаксис макроопределения следующий: имя_макрокоманды macro список_формальных_аргументов тело макроопределения endm

Слайд 33Где должны располагаться макроопределения?
Есть три варианта:
В начале исходного

текста программы до сегмента кода и данных с тем, чтобы

не ухудшать читабельность программы. Этот вариант следует применять в случаях, если определяемые вами макрокоманды актуальны только в пределах одной этой программы.
В отдельном файле. Этот вариант подходит при работе над несколькими программами одной проблемной области. Чтобы сделать доступными эти макроопределения в конкретной программе, необходимо в начале исходного текста этой программы записать директиву include имя_файла

Где должны располагаться макроопределения? Есть три варианта: В начале исходного текста программы до сегмента кода и данных

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика