CodeNet / Языки программирования / Ассемблер / Windows / Assembler & Win32. Курс молодого бойца
Данные в ассемблере
6 октября 2006 года
Секции .data, .data? и .const нужны для определения данных программы. Место под данные резервируется с помощью директив db, dw, dd, dq, dt.
db - 1 байт dw - 2 байта - 1 слово dd - 4 байта - 2 слова dq - 8 байт - 4 слова dt - 10 байт
Секция .data наиболее универсальная мы резервируем память под данные и сразу же инициализируем их, т.е. задаём им начальные значения. Все данные из этой секции включаются в исполнимый файл. Секция .data? менее гибкая, так как данные нельзя инициализировать. Все данные в этой секции не включаются в исполнимый файл, поэтому место только резервируется, но начальные значения не задаются. Данные в обеих секциях имеют полный режим доступа. Секция .const предназначена только чтения. Но ошибок не возникает при попытке изменить эти данные (????). Эта секция самая бесполезная.
.data Perem dd 0000FF11h X1 dw 01235h Binary db 00111010b dd 11225599h decimal dw 28d large dq 01123456789ABCDEFh dw 1011100101010111b .data? Perem1 dd ? Perem2 dq ? Perem5 dw ? Dd ? Dw ? Perem4 db ? ..const Const1 dd 012345678h dw 768d
Строки.
В ассемблере можно задавать только ANSI строки, Unicode строки сложнее задавать и для их обработки существует целый ряд API функций. В ассемблере также можно вместо присваивания однобайтовой переменной некоторого числа можно присвоить переменно букву. Но, в конечном счете, эта переменная будет равна коду буквы в кодировке ANSI. При инициализации символа можно использовать и кавычки и апострофы - без разницы.
.data Char1 db 'W' Char2 db 'Й' db "r"
Всё выше написанное тоже самое что и:
.data Char1 db 57h Char2 db 0C9h db 72h
При объявлении строк можно просто написать стоку после директивы db. Это воспринимается как последовательность символов
String db "ASM" Тоже самое: String db 'A' Db "S" Db "M"
Тоже самое:
String db 41h Db 53h Db 4Dh
Тоже самое:
String db 41h, 53h, 4Dh
При передаче строк функциям в качестве параметров надо чтобы в конце строки был 0, для того чтобы функция смогла найти конец строки.
String db "ASM",0 Msg db "First ASSEMBLER program",0 Ttl db 'Hello, World!!!!',0
Заполнение данными.
Иногда нужно описать много одинаковых переменных примерно штук 30. Вы будете делать так
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 30 раз
Это неудобно и некрасиво, тем более можно обсчитаться. Для сделана директива DUP.
db 30 DUP (0) ; тот же результат
в скобках указываем, чем надо заполнять, можно использовать символы в кавычках, обязательно чтобы размер в скобках совпадал с директивой.
Примеры:
Dd 10 DUP ("в") Dw 45h DUP (0DF23h) Dd 100b DUP (12345678h)
С данными всё понятно. Читаем следующий урок. На 6 уроке мы будем говорить о метках и их использовании.