Допустим, у нас есть data
сегмент объявлен как это:
.data
myVar DWORD 1, 5, 9
Без []
Теперь давайте это в code
разделе:
.code
mov eax, myVar
Если мы теперь взгляните на регистры (через отладчик, для примера ле), мы можем увидеть что-то вроде этого:
EAX = 00000001
С []
Мы можем использовать скобки в качестве оператора разыменования, как мы будем использовать *
в C, так что если мы теперь изменить линию к этому:
mov eax, [myVar]
мы получаем:
EAX = 00000001
hmm ... такой же.
Но теперь мы можем думать, ха !, если положить адрес смещение myVar
, я должен получить следующее значение из MYVAR «массива»:
mov eax, [myVar + 4] ; +4, because we have a DWORD (4 Bytes)
и результат есть:
EAX = 00000005
Это работает! Но что, если я сделаю то же самое без скобок?
mov eax, myVar + 4
EAX = 00000005
Хммм, такой же предмет! Поэтому не должно быть разницы в использовании двух обозначений. Таким образом, они совершенно эквивалентны.
_ "Если myVar является указателем, этот код будет вызывать значение по адресу в стеке." _ Фактически он будет делать то же самое, что и в первом случае (нажмите значение 'myVar'). – Michael
Хорошо. Значит, это означает, что [] не имеет значения. Правильно? –
№ «push [var] - нажмите 4 байта по адресу var в стек». Это означает, что если var не является указателем, это может привести к неопределенному поведению. –