Учитывая следующий код:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Что делает скобки ([L1]) представляют?
][][L1][
] означает содержимое памяти по адресу L1. После запуска [] mov al, [L1][
] здесь, регистр [] al[
] получит байт по адресу L1 (буква 'w').[
] В скобках указано, что адрес не указывается. Например[
] [mov eax, [1234]
]
[]означает, что содержимое адреса 1234 следует перенести в EAX. Итак:[
] [1234 00001
]
[]EAX будет содержать 00001.[
].] Просто означает получение памяти по адресу, помеченному меткой L1. [
] [] Если вам нравится C, то подумайте об этом вот так: [][L1][
] это то же самое, что []*L1[
][
Как и во многих языках ассемблера, это означает косвенное обращение. Другими словами, первый mov
загружает al
с содержимым из L1
(байт 'w'
другими словами), а не адрес.
Ваш второй mov
фактически загружает eax
с адресом L1
, и вы можете позже разыменовать его, чтобы получить или установить его содержимое.
В обоих случаях L1
концептуально считается адресом.
Предпочтение композиции над наследованием.
По тому, что вы сказали:
Объект альбома имеет один или несколько объектов исполнителя. Объект альбома имеет один или несколько объектов песни
класс Album { Художник [] Художники; Песни [] Песни; }
Однако я не совсем так это предполагаю. Я думаю, что каждый Альбом имеет одну или несколько песен, которые исполняются одним или несколькими исполнителями. Я бы сделал это как:
класс Альбом { Песни [] Песни; //другие свойства альбома }
Песня класса { Художник [] Художники; //другие свойства песни }
Артист класса { //свойства, специфичные для исполнителя }
И я настоятельно рекомендую взглянуть на принципы OOD.
-121--4533534-Создайте собственный тип делегата:
delegate void MyAction(ref DataRow dataRow, double doubleValue);
И используйте MyAction
вместо Action < ref DataRow, Double >
- который, как вы отметили, не компилируется.
Они означают, что вместо перемещения значения регистра или числового значения L1
в регистр al
, рассматривайте значение регистра или числовое значение L1
как указатель в память, извлекайте содержимое этого адреса памяти и перемещайте это содержимое в al
.
В этом случае L1 является ячейкой памяти, но та же логика применима, если имя регистра было в скобках:
mov al, [ebx]
Также называется нагрузкой.
Указывает, что регистр должен использоваться как указатель на фактическое местоположение, а не как действие на сам регистр.
Прямая адресация памяти - al
будет загружена со значением, расположенным по адресу памяти L1
.