19
Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 2 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович

Учебный курс

  • Upload
    fell

  • View
    58

  • Download
    6

Embed Size (px)

DESCRIPTION

Учебный курс. Архитектура ЭВМ и язык ассемблера Лекция 2 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович. Пример. TITLE Сложение и вычитание (AddSub.asm) ; числа 32-разрядные .386. .MODEL flat, sdtcall .STACK 4096. - PowerPoint PPT Presentation

Citation preview

Page 1: Учебный курс

Учебный курс

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

Лекция 2

заместитель министра связи и массовых коммуникаций РФ, старший преподаватель

Северов Дмитрий Станиславович

Page 2: Учебный курс

ПримерTITLE Сложение и вычитание (AddSub.asm); числа 32-разрядные.386.MODEL flat, sdtcall.STACK 4096ExitProcess PROTO, dwExitCode:DWORDDumpRegs PROTO

.codemain PROC

mov eax,1000hadd eax,4000hsub eax,2000hcall DumpRegsINVOKE ExitProcess,0

main ENDPEND main

2

Page 3: Учебный курс

––––

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

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

Символическое обозначение варианта директивыBYTE, SBYTE, WORD, SWORD, DWORD, DSWORDFWORD, QWORD, TBYTEREAL4, REAL8, REAL10

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

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

3

Page 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-разрядного операнда в памяти

4

Page 5: Учебный курс

--

-

-

Пересылки простые и неочевидные

MOV получатель, источникДлина одинаковаяОдин операнд – обязательно регистр

Нельзя получать в CS, IP, EIP

Нельзя imm16 в sreg

MOVZX/MOVESX расширение (без)знаковое

LAHF/SAHF опрос/установка младших флагов

XCHG обмен данными

5

Page 6: Учебный курс

Сложение и вычитание

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

Page 7: Учебный курс

Работа с данными и адресами:операторы и директивы

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

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

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

• TYPE, LENGTHOF, SIZEOF – вычислитьразмер данных

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

7

Page 8: Учебный курс

Адресация

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

MOV

MOV

MOV

al,var1

al,[var1]

al,[arrayB+1]

al,[arrayD+4]

• КосвеннаяMOV al,[esi]

INC BYTE PTR [esi]

8

Page 9: Учебный курс

Безусловный переход и цикл

JMP метка_перехода– безусловный переход

LOOP метка_перехода– ECX/CX уменьшается на единицу

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

LOOPD всегда ECX

LOOPW всегда CX

9

Page 10: Учебный курс

;;;;;

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

INCLUDE Irvine32.inc

.dataval1val2val3finalVal

dworddworddworddword

10000h40000h20000h?

Ещё пример

.codemain PROC

mov eax,val1add eax,val2sub eax,val3mov finalVal,eaxcall DumpRegs

exitmain ENDPEND main

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

10

Page 11: Учебный курс

⇐Решения ОС

Процесс создания программы• Редактор

⇒Ваш исходный текст• Ассемблер

⇒Объектный код• Компоновщик

⇒Загрузочный код

Ввод предписаний

⇐Изменения текста Предписания трансляции

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

⇐Статический код

• ОС+аппаратура

⇒Результат

Предписания исполнения

⇐Внешние события

⇐Внешние данные и код

• Загрузчик Предписания загрузкиlink32 AddSub.obj irvine32.lib kernel32.lib

⇒Исполняемый код

11

Page 12: Учебный курс

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

ClrScrCrLfDelayDumpMemDumpRegsGetCommandTailGetMsecondsGotoXYRandom32RandomiZeReadChar

ReadHexReadIntReadStringSetTextColorWaitMsgWriteBinWriteCharWriteDecWriteHexWriteIntWriteString

12

Page 13: Учебный курс

••••

Стек• Понятие стека

– LIFO (Last-In, FIst-Out)

• Стековая адресация памяти– SS ESP– «рост» в сторону меньших адресов

PUSH/POP r/m16|r/m32|imm32|imm16PUSHFD/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

13

Page 14: Учебный курс

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

PUSHFPOPF

; SP<=SP-2, [SS:SP]<=Flags; Flags<=[SS:SP]; SP<=SP+2,

• Полезно:Сохранение регистров

● Пересылка “без регистров”● Доступ к элементам, BP.

• ВАЖНО:Баланс операций PUSH и POP

● Контроль границ● Соглашения при передаче управления

14

Page 15: Учебный курс

END main

TITLE Программа реверсирования строкINCLUDE Irvine32.inc

(RevString.asm)

.dataaName BYTE "abcdefghijklmnopqrstuvwxyz0123456789",0nameSiZe = ($ - aName) - 1

.codemain PROC; Поместим строку посимвольно

mov ecx,nameSizemov esi,0

L1: movzx eax,aName[esi] ;push eax ;inc esiLoop L1

; Восстановим строку из стекаmov ecx,nameSizemov esi,0

L2: pop eax ;mov aName[esi],al ;inc esiLoop L2

в стек

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

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

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

; Отобразим строкуmov edx,OFFSET aNamecall WriteStringcall CrLfexit

main ENDP

Пример работы со стеком15

Page 16: Учебный курс

––––

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

• PROC и ENDP<имя процедуры>

<имя процедуры>

PROC <FAR|NEAR><тело процедуры>ENDP

• ДокументированиеЦелевые действияОжидаемые параметрыВозвращаемый результатНеобходимые условия

• CALL и RET– адрес возврата - в стеке– CALL <имя процедуры> (адрес втолкнуть и перейти)– RET (оказаться по вытолкнутому адресу)

16

Page 17: Учебный курс

––––

Использование процедур

• Вложенные вызовы• Локальные L1: и глобальные L2:: метки• Передача параметров через регистры• Сохранение и восстановление регистровPROC USES reg1 reg2 …• Функциональная декомпозиция

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

17

Page 18: Учебный курс

Пример с процедурами

18

TITLE Программа суммирования целых чисел (Sum2.asm); Запрашивает несколько целых чисел, сохраняет их в массиве, ; вычисляет сумму и отображает полученный результат INCLUDE Irvine32.inc IntegerCount = 3 ; Размер массива.datapromptl BYTE "Введите целое число со знаком: ",0prompt2 BYTE "Сумма чисел равна: ",0array DWORD IntegerCount DUP(?).codemainPROCcall ClrScrmov esi,OFFSET arraymov ecx,IntegerCountcall PromptForlntegerscall ArraySumcall DisplaySumexit 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 L1popad ; Восстановим все регистрыretPromptForlntegers ENDP

Page 19: Учебный курс

Пример с процедурами (продолжение)

19

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