помощью директивы struct и ends. Перед использованием структуры её
нужно описать:SOMESTRUCTURE STRUCT
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
SOMESTRUCTURE ENDS
Уже после можно объявлять её конкретные экземпляры.
FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.
Email: Нажмите что бы посмотреть
SOMESTRUCTURE STRUCT
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
SOMESTRUCTURE ENDS
Уже после можно объявлять её конкретные экземпляры.
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
Указанная запись гарантирует, что мы получаем доступ к нужному нам полю, нужной нам структуры.
MYSTRUCT struc
dword1 dd ?
dword2 dd ?
some_word dw ?
abyte db ?
anotherbyte db ?
MYSTRUCT ends
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.
invoke MessageBox,0,chr$("Text"),chr$("Caption"),MB_OK
; Без $ можно и так:
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)
.data
response db 20 DUP (?)
label1 BYTE 'The results are ', 0
wordString WORD 50 DUP (?)
arrayD DWORD 60 DUP (0)
Чисто технически строки и массивы – это одно и тоже. Просто строки мы воспринимаем не просто как массивы, а как строки. Рассмотренные ниже операции применимы и к обычным массивам.
LODS byteVar
Тот же LODS можно вызывать с параметрами, например так:
LODSB – для работы с байтовыми операндами (byte)
LODSW – для работы с двухбайтовыми операндами (словами, word)
LODSD – для работы с четырёхбайтовыми операндами (двойное слово, double word)
В этом случае LODS поймет, что работает с однобайтовыми символами по размеру byteVar. Важно! При этом значение и смещение byteVar не влияют на исполнение команды. byteVar нужен просто для определения размера.
Если же параметр не указывается – то требуются мнемоники B, W или D, дописанные к команде.
lods источник
lodsb
lodsw
lodsd
(LOaD String Byte/Word/Double word operands)
Загрузка строки байтов/слов/двойных слов
LODS загружает символ из памяти по адресу esi в al/ax/eax и смещает значение esi.
Обычно команду LODS используют в некотором цикле для просмотра некоторой цепочки с элементами фиксированного размера.
;загрузить первые 2 байта из str в ax можно и так:
mov esi,0
mov ax,[esi]
inc esi
inc esi
;Но первый пример работает быстрее. Да и удобнее.
stos приемник
stosb
stosw
stosd
(Store String Byte/Word/Double word operands)
Сохранение строки байтов/слов/двойных слов
LODS наоборот. STOS сохраняет символ из al/ax/eax в память по адресу edi и смещает значение в edi.
movs приемник,источник
movsb
movsw
movsd
(MOVe String Byte/Word/Double word)
Пересылка строк байтов/слов/двойных слов
LODS + STOS одной командой. Скопировать символ из адреса в esi по адресу в edi и сместить значение в esi и edi.
cmps приемник,источник
cmpsb
cmpsw
cmpsd
(CoMPare String Byte/Word/Double word operands)
Сравнение строк байтов/слов/двойных слов
Cравнение двух последовательностей (цепочек) элементов в памяти по адресам esi и edi.
scas приемник
scasb
scasw
scasd
(SCAn String Byte/Word/Double word operands)
Сканирование строки байтов/слов/двойных слов
Поиск значения в последовательности (цепочке) элементов в памяти.