Virtual size это размер, занимаемый в памяти.
Флаги определяют характеристики (только чтение/запись/исполняемый и т.д.).
6.2 Пример программы
Имеется пример программы:
.data
Number1 dd 12033h
Number2 dw 100h,200h,300h,400h
Number3 db "blabla",0
.data?
Value dd ?
.code
mov eax, Number1
mov ecx, offset Number2
add ax, word ptr [ecx+4]
mov Value, eax
Эта программа не будет транслирована, но это не важно.
В секции данных (.data) есть 3 метки: Number1, Number2, Number3. Эти метки используются как указатели на то место в программе, где они расположены.
Директивы db, dw и dd используются для определения и инициализации основных единиц памяти, байт (db), слово (dw) и двойное слово (dd), на которую будет указывать метка стоящая перед этой директивой. Метка заменяет численное значение адреса распределенных единиц памяти символическим именем.
С директивой db, вы также можете определить строку, потому, что строка это фактически порядок байт, соответствующих символам в строке.
Секция данных (из примера выше) в памяти будет выглядеть вот-так: 33,20,01,00,00,01,00,02,00,03,00,04,62,6c,61,62,6c,61,00
(все числа шестнадцатиричные)
Я выделил цветами некоторые числа. Метка Number1 указывает на место в памяти, где синий байт 33, метка Number2 указывает на место в памяти, где красный 00, Number3 на зеленый 62.
Теперь, если вы мспользуете это в своей программе:
mov ecx, Number1
Это фактически будет означать:
mov ecx, dword ptr [место в памяти, где расположена dword 12033h]
А это:
mov ecx, offset Number1
означает:
mov ecx, место в памяти, где расположена dword 12033h
В первом примере, ecx получит значение, которое находится в памяти указанной меткой Number1. Во втором, ecx станет указателем на то место в памяти, на которое указывает метка Number1.
Эти два примера ниже, имеют тот же самый эффект: