Регистр указателя инструкций
Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Регистр указателя инструкций





EIP-32

IP -16

Содержит смещение следующей подлежащей выполнению команды относительно начала сегмента кода. После выполнения команды меняется автоматически.

Полный адрес команды формирует пара регистров CS:IP.

Регистр флагов

EFLAGS-32

FLAGS -16

Биты этих регистров называются флагами.

Различают флаги состояния, управляющие, системные и зарезервированные флаги.

Флаг переноса CF

(Carry Flag) идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.

Флаг паритета PF

(Parity Flag) устанавливается в 1, если младшие 8 бит результата операции содержат четное число двоичных единиц.

Флаг вспомогательного переноса AF

(Auxiliary Flag) используется в операциях над упакованными двоично-десятичными числами.

Он идентифицирует перенос или заем из старшей тетрады (бита 4).

Флаг нуля ZF

(ZeroFlag) устанавливается в 1, если результат операции равен нулю.

Флаг знака SF

(SignFlag) показывает знак результата операции, устанавливаясь в 1 при отрицательном результате.

Флаг переполнения OF

(OverflowFlag) фиксирует переполнение,т.е. выход результата операции за пределы допустимого для данного процессора диапазона значений.
Флаги состояния автоматически устанавливаются процессором после выполнения каждой команды.

Управляющий флаг трассировки TF

(TraceFlag) используется в отладчиках для осуществления пошагового выполнения программы. Если TF = 1, то после выполнения каждой команды процессор реализует процедуру прерывания 1 (через вектор прерывания с номером 1).

Управляющий флаг разрешения прерываний IF

(InterruptFlag) разрешает (если равен 1) или запрещает (если равен 0) процессору реагировать на прерывания от внешних устройств.



Управляющий флаг направления DF

(DirectionFlag) используется особой группой команд, предназначенных для обработки строк.Если DF = 0, строка обрабатывается в прямом направлении, от меньших адресов к большим; если DF = 1, обработка строки идет в обратном направлении.

 

Команды

Команды пересылки данных.Команды пересылки данных осуществляют обмен данными и адресами между ячейками памяти и регистрами или портами ввода-вывода.

Эти команды разделены на четыре группы:

ü команды общего назначения,

ü команды ввода-вывода,

ü команды пересылки адресов

ü и команды пересылки флагов.

Основная команда общего назначения MOV (MOVe – переслать) может переслать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также переслать непосредственно адресуемое значение в регистр или ячейку памяти.

Команда MOV имеет следующий формат: MOV приемник, источник.

Команды работы со стеком.Для временного сохранения данных (содержимого регистра или ячейки памяти) удобно использовать стек.

Для работы со стеком есть две команды

PUSH (поместить слово в стек) и POP (извлечь слово из стека). Команда PUSH помещает содержимое регистра или ячейки памяти размером в слово на вершину стека. Команда POP, наоборот, снимает слово с вершины стека и помещает его в регистр или ячейку памяти.

Команды PUSH и POP имеют следующие форматы:

PUSH источник

POP приемник.

Будучи взаимно обратными командами, PUSH и POP обычно используются парами, т.е. каждой команде PUSH в программе должна соответствовать команда POP.

Вершина стека – это ячейка в сегменте стека, адрес которой содержится в указателе стека SP.

Регистр SP всегда указывает на слово, помещенное в стек последним.

Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник в стек.

Команды ввода-вывода.Команды ввода-вывода используются для взаимодействия с периферийными устройствами системы.

Они имеют формат:

IN аккумулятор,порт OUT порт, аккумулятор

Где аккумулятор – регистр AL при обмене байтами или регистр AX при обмене словами. Операндом порт может быть десятичное число от 0 до 255, что позволяет адресоваться к 256 устройствам.

Команды пересылки адреса.Команды пересылки адреса передает не содержимое переменных, а их адреса.

Команда LEA (load effective address – загрузить эффективный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр.

Она имеет формат: LEA регистр16,память16

Где операнд память16 должен иметь атрибут WORD.

Сложение и вычитание.Для сложения и вычитания используются инструкции ADD и SUB. ADD прибавляет содержимое операнда- источника (правый) к содержимому операнда приемнике и сохраняет результат в операнде приемнике.

SUB работает так же, за исключением того, что он вычитает операнд источника из операнда приемника.

Команды приращения и уменьшения приемника на единицу. Когда ассемблерной программе требуется производить сложение, хорошо, если добавляемое значение это 1.

Это называется инкремент.

Аналогично, когда значение 1 вычитается из регистра или переменной это называется декремент.

Для таких операций, как изменение счетчика цикла или изменение регистра указателя при просмотре памяти, Вы используете инкремент и декремент.

В соответствии с частым использованием инкремента и декремента ассемблер предоставляет инструкции INC и DEC.

Как можно, ожидать INC прибавляет к регистру или переменной 1 и DEC вычитает 1 из регистра или переменной.

Умножение и деление. Инструкция MUL умножает два 8 или 16-битных беззнаковых сомножителя, генерируя 16 или 32- битное число.

Один из сомножителей при умножении 8-битовых чисел должен быть запомнен в AL; другой может быть в любом 8-битном регистре общего назначения или быть операндом памяти. MUL всегда сохраняет 16 битный результат в AX. Например, MOVAL,25 MOV DH,40 MUL DH ... умножает AL на DH, сохраняя результат 1000 в AХ.

Заметим, что MUL требует только один операнд; другой сомножитель всегда в AL (или в AX в случае умножения слов).

При умножении слов один сомножитель должен быть сохранен в AX, в то время как другой может быть любым 16-битным регистром общего назначения или операндом памяти. MUL помещает 32-битный результат в DX:AX с младшими 16 битами результата в AX и старшими 16 битами результата в DX.

Команда DIV (divide – разделить) выполняет деление чисел без знака, а команда IDIV выполняет деление чисел со знаком.

Команды имеют формат DIV источник IDIV источник

Где источник делитель размеров в байт или слово, находящееся в регистре общего назначения или в ячейке памяти.

Делимое должно иметь двойной размер; оно извлекается из регистра AX (при делении на 8-битовое число) или из регистров DX и AX при делении на 16-битовое число).

Результат возвращается следующим образом: Если операнд-источник представляет собой байт, то частное возвращается в регистр AL, а остаток в AH.

Если операнд-источник слово, то частное возвращается в AX, а остаток – в регистр DX.

Изменение знака.Инструкции NEG может изменить знак содержимого регистра общего назначения или переменной.

Логические операции.Ассемблер поддерживает полный набор инструкций, которые производят логические операции, включая END, OR, XOR и NOT.

AND устанавливая каждый бит в назначении в 1 только тогда, когда соответствующие биты источников – 1

Инструкция OR устанавливая каждый бит в назначении в 1 если хотя бы 1 соответствующий исходный бит установлен в 1. OR позволяет Вам устанавливать исходный бит(ы) в 1.

Инструкция устанавливая каждый бит назначения в 1, только если 1 из соответствующих битов источника был 0, а другой 1

Сдвиги и циклические сдвиги.Микропроцессор Intel обеспечивает ряд способов для передвижения битов в регистре или переменной памяти вправо или влево.

Простейший из них - логический сдвиг. SHL (сдвиг влево, так же известный как SAL) передвигает каждый бит в назначении на 1 разряд влево или в направлении к старшему значащему биту.

Умножение при помощи сдвига много быстрее, чем использование инструкции MUL.

SHR (сдвиг вправо) во многом подобен SHL: он сдвигает биты операнда вправо, либо на 1, либо на CL бит, при этом младший значащий бит сдвигается во флаг переноса, а старший значащий бит устанавливается в 0.

SHR - это быстрый способ беззнакового деления на 2.

SAR - арифметический сдвиг вправо, такой же как SHR, за исключением того, что в SAR старший значащий бит операнда сдвигается вправо на следующий бит и затем возвращается в самого себя.

Работа со строками. В ассемблере под строкой понимается последовательность соседних байтов или слов. В связи с этим все строковые команды имеют две разновидности - для работы со строками из байтов (в мнемонику операций входит буква B) и для работы со строками из слов (в мнемонику входит W).

Имеются следующие операции над строками:

ü пересылка элементов строк (в память, из памяти, память-память);

ü сравнение двух строк;

ü просмотр строки с целью поиска элемента, равного заданному.

Каждая из этих операций выполняется только над одним элементом строки, однако, одновременно происходит автоматическая настройка на следующий или предыдущий элемент строки.

Имеются специальные команды повторения (REP и др.), которые заставляют следующую за ними строковую команду многократно повторяться (до 216 раз), в связи с чем, такая пара команд позволяет обработать всю строку, причем намного быстрее, чем запрограммированный цикл.

Команда Lea.LEA SI,<начальный/конечный адрес строки> Если же надо загрузить сразу оба регистра DS и SI, тогда можно воспользоваться командой LDS SI,m32 которая в регистр SI заносит первое слово, а в регистр DS - второе слово из двойного слова, имеющего адреc m32 (таким образом, по адресу m32+2 должен храниться сегмент, а по адресу m32 - смещение начального или конечного элемента строки). Начальную загрузку регистров ES и DI обычно осуществляют одной командой

LES DI,m32 которая действует аналогично команде LDS. Перечислим вкратце строковые команды ассемблера.

Команда загрузки элемента строки в аккумулятор (LODSB или LODSW) пересылает в регистр AL или AX очередной элемент строки, на который указывает пара DS:SI, после чего увеличивает (при DF=0) или уменьшает (при DF=1) регистр SI на 1 или 2. Команда записи аккумулятора в строку (STOSB или STOSW) заносит содержимое регистра AL или AX в тот элемент строки, на который указывает пара ES:DI, после чего изменяет регистр DI на 1 или 2.

Команда пересылки строк (MOVSB или MOVSW) считывает элемент первой строки, определяемый парой DS:SI, в элемент второй строки, определяемый парой ES:DI, после чего одновременно меняет регистры SI и DI.

Команда сравнения строк (CMPSB или CMPSW) сравнивает очередные элементы строк, указываемые парами DS:SI и ES:DI, и результат сравнения (равно, меньше и т.п.) фиксирует в флагах, после чего меняет регистры SI и DI.

Команда сканирования строки (SCASB или SCASW) сравнивает элемент строки, адрес которого задается парой ES:DI, со значением регистра AL или AX и результат сравнения фиксирует в флагах, после чего меняет содержимое регистра DI.

Перед любой строковой командой можно поставить одну из двух команд, называемых "префиксами повторения", которая заставит многократно повториться эту строковую команду.

Команды переходов.В систему команд ассемблера входит обычный набор команд перехода: безусловные и условные переходы, переходы с возвратами и др.

По способу изменения счетчика команд переходы делятся на абсолютные и относительные. Если в команде перехода указан адрес (смещение) той команды, которой надо передать управление, то это абсолютный переход.

Однако в команде может быть указана величина (сдвиг), которую надо добавить к текущему значению регистра IP, чтобы получился адрес перехода, и тогда это будет относительный переход при этом сдвиг может быть положительным и отрицательным, так что возможен переход вперед и назад.

По величине сдвига относительные переходы делятся на короткие (сдвиг задается байтом) и длинные (сдвиг - слово).

Абсолютные же переходы делятся на прямые и косвенные:

при прямом переходе адрес перехода задается в самой команде, а при косвенном - в команде указывается регистр или ячейка памяти, в котором (которой) находится адрес перехода

JMP но в зависимости от типа операнда, ассемблер формирует разные машинные команды. 1) Внутрисегментный относительный короткий переход.

Циклы.Цикл это ничего более, чем блок кода, который заканчивается условным переходом так, что этот код может выполняться постоянно, до тех пор, пока не выполнится условие окончания. Циклы используются для обработки массивов, проверки статуса портов ввода-вывода, пока не будет достигнуто определенное состояние, очистки блоков памяти, чтения строк с клавиатуры, вывода строк на экран и т.п. Поэтому они часто используются, и Ассемблер предоставляет несколько специальных инструкций для циклов: LOOP, LOOPE, LOOPNE и JCXZ.

Когда Вам нужен цикл, который повторяется до тех пор, пока счетчик не достигнет нуля, загрузите счетчик в CX и используйте инструкцию LOOP.

Процедуры в языке ассемблера.команде CALL, когда надо вызвать процедуру. Это же имя должно быть повторено в директиве ENDP, заканчивающей описание процедуры.

Предложения между этими двумя директивами образуют тело процедуры (подпрограмму).

Имя процедуры является фактически меткой первой из команд тела, поэтому данную команду не надо специально метить

Прерывания INT.Команда INT прерывает обработку программы, передает управление в DOS или BIOS для определенного действия и затем возвращает управление в прерванную программу для продолжения обработки.

Наиболее часто прерывание используется для выполнения операций ввода или вывода.

Формат команды INT тип_прерывания

Для выхода из программы на обработку прерывания и для последующего возврата команда INT выполняет следующие действия: - уменьшает указатель стека на 2 и заносит в вершину стека содержимое флагового регистра; - очищает флаги TF и IF; - уменьшает указатель стека на 2 и заносит содержимое регистра CS в стек; - уменьшает указатель стека на 2 и заносит в стек значение командного указателя; - вычисляет адрес вектора прерывания, умножая тип_прерывания на 4; загружает второе слово вектора прерываний в регистр CS; загружает в IP первое слово вектора прерывания; -обеспечивает выполнение необходимых действий; - восстанавливает из стека значение регистра и возвращает управление в прерванную программу на команду, следующую после INT.

 

 


Практическая часть

Лабораторная работа № 1

Тема:Регистры,памяти и логическая адресация

Задание:Написать программу “Получение данных из командной строки” на языке Ассемблер

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

optioncasemap: none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32, comctl32, ws2_32

.data

.code

start:

callGetCommandLine

push 0

pushchr$("Command Line")

pusheax

push 0

callMessageBox

push 0

callExitProcess

endstart

 

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

5)Запустил программу OllyDbg.Просмотрел код

 

 


Лабораторная работа №2

Тема: Передача параметров через стек

 

Задание 1: Передача параметров через стек, возврат результата через регистр EAX.

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.686

.model flat, c

optioncasemap: none

include\masm32\include\windows.inc

include\masm32\include\kernel32.inc

includelib\masm32\lib\kernel32.lib

.data

add 76

b dd-8

ddd ?

.code

program:

push b

push a

call Procedure

add esp,8

movd,eax

push 0

Procedure proc

moveax,[esp+4]

movedx,[esp+8]

subeax,edx

ret

Procedureendp

endprogram

 

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

5)Запустил программу OllyDbg.Просмотрел код

 

 

Задание 2:Передача параметров через стек, возврат результат по адресу.

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

optioncasemap:none

include/masm32/include/windows.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/kernel32.lib

.data

add 76

b dd-8

ddd ?

.code

program:

push offset d

push b

push a

call Procedure

addesp, 8

movd,eax

push 0

Procedure proc

moveax,[esp+4]

movedx,[esp+8]

subeax,edx

movedx,[esp+12]

mov [edx],eax

ret

Procedure endp

endprogram

 

3) Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

5)Запустил программу OllyDbg.Просмотрел код

 

 

Лабораторная работа №3

Тема:Команды обработки данных на языке Ассемблер.

Задание:Сложение двух чисел

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

optioncasemap:none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32,comctl32,ws2_32

.data

.code

start:

moveax, 123

movebx, -90

addeax, ebx

testeax, eax

jz zero

invoke MessageBox,0, chr$("Вeaxне 0!"), chr$("info"), 0

jmplexit

zero:

invokeMessageBox, 0, chr$("Вeax 0!"), chr$("info"), 0

lexit:

invokeExitProcess, 0

endstart

 

3) Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

 

Лабораторная работа №4

Тема:Применение команд цикла на языке Ассемблер

 

Задание 1:Организация цикла.Repeat

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

optioncasemap:none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32,comctl32,ws2_32

.data

msg_titledb "Title",0

A DB 1h

bufferdb 128 dup(?)

formatdb "%d",0

.code

start:

mov AL, A

.REPEAT

inc AL

.UNTIL AL==7

invokewsprintf, addr buffer, addr format, AL

invokeMessageBox, 0, addr buffer, addrmsg_title, MB_OK

invokeExitProcess, 0

endstart

 

3) Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

Задание 2:Организация цикла While

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

optioncasemap:none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32,comctl32,ws2_32

.data

msg_titledb "Title",0

A DB 1h

bufferdb 128 dup(?)

formatdb "%d",0

.code

start:

moveax, 1

movedx, 1

.WHILE edx==1

inceax

.IF eax==7

.BREAK

.ENDIF

.ENDW

invokewsprintf, addr buffer, addr format, AL

invokeMessageBox, 0, addr buffer, addrmsg_title, MB_OK

invokeExitProcess, 0

endstart

 

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

 

 

Лабораторная работа 5

Тема:Программирование действий с массивами данных на языке Ассемблер

 

Задание:Сумма всех элементов массива

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

option casemap:none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32,comctl32,ws2_32

.data

msg_title db "Title",0

A DB 1h

x dd 0,1,2,3,4,5,6,7,8,9,10,11

n dd 12

buffer db 128 dup(?)

format db "%d", 0

.code

start:

mov eax, 0

mov ecx, n

mov edx, 0

L:add eax, x[ebx]

add ebx, type x

dec ecx

cmp ecx, 0

jne L

invoke wsprintf, addr buffer, addr format, AL

invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK

invoke ExitProcess, 0

end start

 

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

Лабораторная работа 6

Тема:Особенности работы с процедурами на языке Ассемблер

 

Задание 1:Передача параметров и возврат из процедуры с использованием соглашения о вызовах stdcall

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.686

.model flat, stdcall

option casemap:none

include/masm32/include/windows.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/kernel32.lib

.data

x dd 0

y dd 4

.code

program:

push y

push x

call Procedure

push 0

call ExitProcess

Procedure proc

ret 8

Procedure endp

end program

 

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

 

Задание 2: Передача параметров и возврат из процедуры с использованием соглашения о вызовах cdecl

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.686

.model flat, с

option casemap:none

include/masm32/include/windows.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/kernel32.lib

.data

x dd 0

y dd 0

.code

program:

push y

push x

call Procedure

add esp, 8

push 0

Procedure proc

ret

Procedure endp

end program

 

3) Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

5)Запустил программу OllyDbg.Просмотрел код

 

 

 

Задание 3:Рекурсивная процедура вычисления факториала целого беззнакового числа. Процедура получает параметр через стек и возвращает результат через регистр EAX

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.686

.model flat, c

option casemap:none

include/masm32/include/windows.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/kernel32.lib

.data

a dd 76

b dd -8

d dd ?

.code

program:

push offset d

push b

push a

call factorial

add esp, 8

mov d, eax

push 0

factorial proc

mov eax,[esp+4]

test eax,eax

jz L1

dec eax

push eax

call factorial

add esp,4

mul dword ptr[esp+4]

jmp L2

L1:inc eax

L2:ret

factorial endp

end program

3)Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

5)Запустил программу OllyDbg.Просмотрел код

Лабораторная работа 7

Тема:Работа со строками в языке Ассемблер.

 

Задание:Расчет формулы на Ассемблере

1)Запустил программу MASM32 Editor

2)Написал текст исходного кода

.486

.model flat, stdcall

option casemap:none

include/masm32/include/windows.inc

include/masm32/include/user32.inc

include/masm32/include/kernel32.inc

includelib/masm32/lib/user32.lib

includelib/masm32/lib/kernel32.lib

include/masm32/macros/macros.asm

uselib masm32,comctl32,ws2_32

.data

msg_title db "Title", 0

A DB 1h

x dd 0,1,2,3,4,5,6,7,8,9,10,11

n dd 12

buffer db 128 dup(?)

format db "%d", 0

.code

start:

mov eax, 0

mov ecx, n

add edx, 0

L:add eax, x[ebx]

add ebx, type x

dec ecx

cmp ec[, 0

jne L

invoke wsprintf, addr buffer, addr format, AL

invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK

invoke ExitProcess, 0

end start

 

3) Выполнил отладку программы командой project-run program

4)Создал exe-файл

 

 

5)Запустил программу OllyDbg.Просмотрел код

 

Раздел 2.Основы HTML

Теоретическая часть









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.