Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


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

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

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

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

Презентация на тему Структуры и строки в MASM. Префиксы Rep

Содержание

СтруктурыСтруктура это набор переменных (данных). Структура задаётся с помощью директивы struct и ends. Перед использованием структуры её нужно описать:SOMESTRUCTURE STRUCTdword1 dd ?dword2 dd ?some_word dw ?abyte db ?anotherbyte db ?SOMESTRUCTURE ENDSУже после можно объявлять её конкретные
ЭВМ и Периферийные устройства  лекция 8 СтруктурыСтруктура это набор переменных (данных). Структура задаётся с помощью директивы struct и СтруктурыСтруктуры можно объявлять как в секции .data, так и в секции .data?MYSTRUCT СтруктурыДля того чтобы получить доступ к записи надо указать метку переменной, которой СтруктурыЕсли имя поля не гарантирует уникальности то лучше использовать такой тип использования СтруктурыКак и всё остальное, структуры- это всего-лишь данные в памяти. Поэтому вместо Макрос chr$()сhr$(). Он создает в секции .data массив байт и передает указатель Идентификатор $$ всегда равен текущему смещению в сегменте, в котором в данный Макрос SIZEOFSIZEOF служит для определения размера чего-либо (переменной, массива, строки, структуры). Может СтрокиСтроки представляются из себя группу байт, слов, двойных слой в памяти.Строки обычно Установка флага DFКоманда CLD сбрасывает флаг DF в 0.Комманда STD устанавливает флаг DF в 1 Rep.Rep – выполняет указанную команду, пока cx0 при этом уменьшая cxДействия rep:1) Префикс Rep.Rep – выполняет указанную команду, пока (e)cx0 при этом уменьшая (e)cx.rep Префиксы Repe и Repz.epe и repz используются перед следующими цепочечными командами и Префиксы Repe и Repz.repe и repz используются перед следующими цепочечными командами и Префиксы Repne и Repnz.epne и repnz также имеют один код операции и Строки. Команды для работы со строками.Как уже упоминалось, со строками можно работать Строки. Использование команд для работы со строками.Все указанные инструкции можно использовать как LODSЗагрузить элемент из ячейки памяти, адресуемой парой ds:esi/si (для нас esi), в LODS. Пример.str   dw   ......    cld STOSЗаписать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi (у STOS. Пример.;заполнить некоторую область памяти пробелами..datastr1   db   'Какая-то Пример совместной работы LODS и STOS;пример совместной работы stosb и lodsb:;копировать одну MOVSВыполнить копирование байта, слова или двойного слова из операнда источника в операнд MOVS. Пример.;копировать одну строку в другую полностьюstr1  db   'str1 CMPSвыполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:адрес CMPS. Пример..dataobl1 db 'Строка для сравнения'obl2 db 'Строка для сравнения'.code... cld ;просмотр SCASвыполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di (у нас edi). SCAS. Пример.;сосчитать число пробелов в строке str.datastr1 db  '...'len_str1=sizeof str1.codelea edi,str1
Слайды презентации

Слайд 2 Структуры
Структура это набор переменных (данных). Структура задаётся с

СтруктурыСтруктура это набор переменных (данных). Структура задаётся с помощью директивы struct

помощью директивы struct и ends. Перед использованием структуры её

нужно описать:

SOMESTRUCTURE STRUCT
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
SOMESTRUCTURE ENDS

Уже после можно объявлять её конкретные экземпляры.


Слайд 3 Структуры
Структуры можно объявлять как в секции .data, так

СтруктурыСтруктуры можно объявлять как в секции .data, так и в секции

и в секции .data?
MYSTRUCT struc
dword1 dd ?
dword2 dd ?
some_word

dw ?
abyte db ?
anotherbyte db ?
MYSTRUCT ends

.data
msg1 MYSTRUCT
.data?
msg2 MYSTRUCT

Слайд 4 Структуры
Для того чтобы получить доступ к записи надо

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

указать метку переменной, которой она обозначена и через точку

указать имя поля.

mov [msg.dword1], 45h
xor eax,eax
mov eax, [msg.dword1] ; eax = 45

при этом запись msg.dword1 считается обычной меткой данных: берётся смещение метки msg плюс смещение поля dword1 в структуре,
размер данных по умолчанию равен размеру директивы указанной после метки поля. Также можно пользоваться обращением к полю
при обращении к записи через регистр:

mov [msg.dword2], 45h
xor eax,eax
lea ebx, msg
mov eax, [ebx].dword2 ; eax = 45

MYSTRUCT struc
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
MYSTRUCT ends


Слайд 5 Структуры
Если имя поля не гарантирует уникальности то лучше

СтруктурыЕсли имя поля не гарантирует уникальности то лучше использовать такой тип

использовать такой тип использования записи:
mov [msg.dword2], 45h
xor eax,eax
lea ebx,

msg
mov eax, [ebx].MYSTRUCT.dword2 ; eax = 45

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

MYSTRUCT struc
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
MYSTRUCT ends


Слайд 6 Структуры
Как и всё остальное, структуры- это всего-лишь данные

СтруктурыКак и всё остальное, структуры- это всего-лишь данные в памяти. Поэтому

в памяти. Поэтому вместо обращения по конкретным именам, можно

использовать смещение в памяти

mov [msg.abyte], 45h
xor eax,eax
lea ebx, msg
mov al, [ebx+10d] ; al = 45

MYSTRUCT struc
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
MYSTRUCT ends

к ebx прибавлено10d, потому что смещение поля abyte в структуре равно 10d.


Слайд 7 Макрос chr$()
сhr$(). Он создает в секции .data массив

Макрос chr$()сhr$(). Он создает в секции .data массив байт и передает

байт и передает указатель на них в функцию. Для

юникода есть аналогичный макрос uni$(). В итоге, вызов функции приобретает такой вид:

invoke MessageBox,0,chr$("Text"),chr$("Caption"),MB_OK


Слайд 8 Идентификатор $
$ всегда равен текущему смещению в сегменте,

Идентификатор $$ всегда равен текущему смещению в сегменте, в котором в

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

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

; Без $ можно и так:
StringStart LABEL BYTE
db 0dh,0ah,'Текстовая строка'odh,0ah
StringEnd LABEL BYTE
STRING_LENGTH EQU (StringEnd-StringStart)

; А с $ всё проще:
StringStart LABEL BYTE
db 0dh,0ah,'Текстовая строка'odh,0ah
STRING_LENGTH EQU ($-StringStart)

; Длину (в словах) массива слов можно вычислить следующим образом:
WordArray DW 90h, 25h, 0, 16h, 23h
WORD_ARRAY_LENGTH EQU (($-WordArray)/2)


Слайд 9 Макрос SIZEOF
SIZEOF служит для определения размера чего-либо (переменной,

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

массива, строки, структуры). Может применятся, как константа.
.data
str1 db

'...'
len_str1=sizeof str1; можно и так


start:
mov cx,sizeof str1; и так

Слайд 10 Строки
Строки представляются из себя группу байт, слов, двойных

СтрокиСтроки представляются из себя группу байт, слов, двойных слой в памяти.Строки

слой в памяти.
Строки обычно объявляются в сегменте данных вот

так:

.data
response db 20 DUP (?)
label1 BYTE 'The results are ', 0
wordString WORD 50 DUP (?)
arrayD DWORD 60 DUP (0)

Чисто технически строки и массивы – это одно и тоже. Просто строки мы воспринимаем не просто как массивы, а как строки. Рассмотренные ниже операции применимы и к обычным массивам.


Слайд 11 Установка флага DF
Команда CLD сбрасывает флаг DF в

Установка флага DFКоманда CLD сбрасывает флаг DF в 0.Комманда STD устанавливает флаг DF в 1

0.
Комманда STD устанавливает флаг DF в 1


Слайд 12 Rep.
Rep – выполняет указанную команду, пока cx0 при

Rep.Rep – выполняет указанную команду, пока cx0 при этом уменьшая cxДействия

этом уменьшая cx
Действия rep:
1) анализ содержимого cx:
если cx0, то

выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если cx=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2) уменьшить значение cx=cx–1 и вернуться к шагу 1;


Слайд 13 Префикс Rep.
Rep – выполняет указанную команду, пока (e)cx0

Префикс Rep.Rep – выполняет указанную команду, пока (e)cx0 при этом уменьшая

при этом уменьшая (e)cx.
rep используется перед следующими цепочечными командами

и их краткими эквивалентами: movs, stos, ins, outs.
Действия rep:
1) анализ содержимого (e)cx:
если (e)cx<>0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если (e)cx=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2) уменьшить значение (e)cx=(e)cx–1 и вернуться к шагу 1;


Слайд 14 Префиксы Repe и Repz.
epe и repz используются перед

Префиксы Repe и Repz.epe и repz используются перед следующими цепочечными командами

следующими цепочечными командами и их краткими эквивалентами: cmps, scas.

Действия repe и repz:

1) анализ содержимого cx и флага zf:
если (e)cx<>0 (у нас ecx)или zf<>0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
если (e)cx=0 (у нас ecx) или zf=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2) уменьшить значение (e)cx=(e)cx-1 и вернуться к шагу 1;


Слайд 15 Префиксы Repe и Repz.
repe и repz используются перед

Префиксы Repe и Repz.repe и repz используются перед следующими цепочечными командами

следующими цепочечными командами и их краткими эквивалентами: cmps, scas.

Действия repe и repz:

1) анализ содержимого cx и флага zf:
если (e)cx<>0 (у нас ecx) или zf<>0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
если (e)cx=0 (у нас ecx) или zf=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2) уменьшить значение (e)cx=(e)cx-1 и вернуться к шагу 1;


Слайд 16 Префиксы Repne и Repnz.
epne и repnz также имеют

Префиксы Repne и Repnz.epne и repnz также имеют один код операции

один код операции и имеют смысл при использовании перед

следующими цепочечными командами и их краткими эквивалентами: cmps, scas. Действия repne и repnz:

1)анализ содержимого (e)cx и флага zf:
если (e)cx<>0 (у нас ecx) или zf=0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если (e)cx=0 (у нас ecx) или zf<>0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2)уменьшить значение (e)cx=(e)cx–1 и вернуться к шагу 1.


Слайд 17 Строки. Команды для работы со строками.
Как уже упоминалось,

Строки. Команды для работы со строками.Как уже упоминалось, со строками можно

со строками можно работать как с массивами. Однако есть

специальные команды, упрощающие работу:

LODS - load string, загрузить строку
STOS - store string, сохранить строку
MOVS - move string, переместить строку
CMPS - compare string, сравнить строку
SCAS - scan string, сканировать строку

Слайд 18 Строки. Использование команд для работы со строками.
Все указанные

Строки. Использование команд для работы со строками.Все указанные инструкции можно использовать

инструкции можно использовать как с параметрами, так и без.

Если

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

Например у LODS это выглядит так:

LODS byteVar

Тот же LODS можно вызывать с параметрами, например так:

LODSB – для работы с байтовыми операндами (byte)
LODSW – для работы с двухбайтовыми операндами (словами, word)
LODSD – для работы с четырёхбайтовыми операндами (двойное слово, double word)

В этом случае LODS поймет, что работает с однобайтовыми символами по размеру byteVar. Важно! При этом значение и смещение byteVar не влияют на исполнение команды. byteVar нужен просто для определения размера.
Если же параметр не указывается – то требуются мнемоники B, W или D, дописанные к команде.


Слайд 19 LODS
Загрузить элемент из ячейки памяти, адресуемой парой ds:esi/si

LODSЗагрузить элемент из ячейки памяти, адресуемой парой ds:esi/si (для нас esi),

(для нас esi), в регистр al/ax/eax. Размер элемента определяется

неявно (для команды lods) или явно в соответствии с применяемой командой (для команд lodsb, lodsw, lodsd);
Изменить значение регистра esi на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага направления df:
df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.

lods источник  lodsb  lodsw  lodsd

(LOaD String Byte/Word/Double word operands)
Загрузка строки байтов/слов/двойных слов

LODS загружает символ из памяти по адресу esi в al/ax/eax и смещает значение esi.


Слайд 20 LODS. Пример.
str dw ...
...

LODS. Пример.str  dw  ......  cld  lea

cld
lea

si,str
lodsw ;загрузить первые 2 байта из str в ax.
; При этом esi увеличилась на 2, так как флаг df=0

Обычно команду LODS используют в некотором цикле для просмотра некоторой цепочки с элементами фиксированного размера.

;загрузить первые 2 байта из str в ax можно и так:
mov esi,0
mov ax,[esi]
inc esi
inc esi
;Но первый пример работает быстрее. Да и удобнее.


Слайд 21 STOS
Записать элемент из регистра al/ax/eax в ячейку памяти,

STOSЗаписать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi

адресуемую парой es:di/edi (у нас edi). Размер элемента определяется

неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd);
Изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df:
df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.

stos приемник  stosb  stosw  stosd

(Store String Byte/Word/Double word operands)
Сохранение строки байтов/слов/двойных слов

LODS наоборот. STOS сохраняет символ из al/ax/eax в память по адресу edi и смещает значение в edi.


Слайд 22 STOS. Пример.
;заполнить некоторую область памяти пробелами.
.data
str1

STOS. Пример.;заполнить некоторую область памяти пробелами..datastr1  db  'Какая-то строка'...

db 'Какая-то строка'
...
cld

mov al,' '
lea edi,str1
mov cx,sizeof str1
rep stosb ;заполняем пробелами строку strr

Слайд 23 Пример совместной работы LODS и STOS
;пример совместной работы

Пример совместной работы LODS и STOS;пример совместной работы stosb и lodsb:;копировать

stosb и lodsb:
;копировать одну строку в другую до первого

пробела
.data
str1 db 'Какая-то строка'
len_str1=sizeof str1
str2 db len_str1 dup (' ')
...
cld
mov cx,len_str1
lea esi,str1
lea edi,str2
m1: lodsb
cmp al,' '
je exit ;выход, если пробел
stosb
loop m1
exit:

Слайд 24 MOVS
Выполнить копирование байта, слова или двойного слова из

MOVSВыполнить копирование байта, слова или двойного слова из операнда источника в

операнда источника в операнд приемник, при этом адреса элементов

предварительно должны быть загружены:
адрес источника — в пару регистров ds:esi/si (у нас esi) (ds по умолчанию, допускается замена сегмента);
адрес приемника — в пару регистров es:edi/di (у нас edi) (замена сегмента не допускается);
в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;
если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;
если есть префикс повторения, то выполнить определяемые им действия (см. команду rep).

movs приемник,источник  movsb  movsw  movsd

(MOVe String Byte/Word/Double word)
Пересылка строк байтов/слов/двойных слов

LODS + STOS одной командой. Скопировать символ из адреса в esi по адресу в edi и сместить значение в esi и edi.


Слайд 25 MOVS. Пример.
;копировать одну строку в другую полностью
str1

MOVS. Пример.;копировать одну строку в другую полностьюstr1 db  'str1 копируется

db 'str1 копируется в str2'
len_str1=sizeof str1
a_str1 dd

str1
str2 db len_str1 dup (' ')
a_str2 dd str2
...
mov cx,len_str1
lea si,str1
lea di,str2
cld
rep movsb

Слайд 26 CMPS
выполнить вычитание элементов (источник - приемник), адреса элементов

CMPSвыполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть

предварительно должны быть загружены:
адрес источника — в пару регистров

ds:esi/si (у нас esi);
адрес назначения — в пару регистров es:edi/di (у нас edi);
в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;
в зависимости от результата вычитания установить флаги:
если очередные элементы цепочек не равны, то cf=1, zf=0;
если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
при наличии префикса выполнить определяемые им действия (см. команды repe/repne).

cmps приемник,источник cmpsb cmpsw cmpsd

(CoMPare String Byte/Word/Double word operands)
Сравнение строк байтов/слов/двойных слов

Cравнение двух последовательностей (цепочек) элементов в памяти по адресам esi и edi.


Слайд 27 CMPS. Пример.
.data
obl1 db 'Строка для сравнения'
obl2 db 'Строка

CMPS. Пример..dataobl1 db 'Строка для сравнения'obl2 db 'Строка для сравнения'.code... cld

для сравнения'
.code
...
cld ;просмотр цепочки в направлении возрастания адресов

mov cx,20 ;длина цепочки
lea esi,obl1 ;адрес источника поместить esi
lea edi,obl2 ;адрес назначения поместить в edi
repe cmpsb ;сравнивать, пока равны
jnz m1 ;если не конец цепочки, то встретились разные элементы
... ;действия, если цепочки совпали
...
m1:
... ;действия, если цепочки не совпали

Слайд 28 SCAS
выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой

SCASвыполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di (у нас

es:edi/di (у нас edi). Замена сегмента es не допускается;
по

результату вычитания установить флаги;
изменить значение регистра edi/di (у нас edi) на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу.

scas приемник  scasb  scasw  scasd

(SCAn String Byte/Word/Double word operands)
Сканирование строки байтов/слов/двойных слов

Поиск значения в последовательности (цепочке) элементов в памяти.


  • Имя файла: struktury-i-stroki-v-masm-prefiksy-rep.pptx
  • Количество просмотров: 156
  • Количество скачиваний: 0