Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ох уж эти квадратные скобки...

12K
11 мая 2009 года
ASoftware
87 / / 16.04.2009
Пользуюсь FASM-ом. Все говорят что если написать так:
mov ax,message ; то запишется адрес этой переменной
а если так:
mov ax,[message] ; то в регистр запишется значение

Приведу для понятливости в машинных кодах (Пусть message будет равнятся 4Fh и стоять по адресу 2A), то:

По теории должно быть так:

a1 2a 00 ; записать адрес в ax -> равносильно mov ax,message
b8 4F 00 ; записать значение в ax -> равносильно mov ax,[message]

На практике получается так:

a1 2a 00 ; mov ax,message
b8 2a 00 (Почему помещается адрес ??? ) ; mov ax,[message]
b8 4f ; mov ax,4fh


Или точно так же, только с 32 битным регистром ( eax ) :
66 a1 2a 00 -> mov eax,variable
66 b8 2a 00 00 00 -> mov eax,[variable] ->( с чего бы это??? )
66 b8 4f 00 00 00 -> mov eax,4fh


Память выделятся как для значения (4 байта), а помещается адрес!... Почему?
15K
13 мая 2009 года
Vertecs
116 / / 21.06.2008
Цитата: ASoftware
Пользуюсь FASM-ом. Все говорят что если написать так:
mov ax,message ; то запишется адрес этой переменной
а если так:
mov ax,[message] ; то в регистр запишется значение

Приведу для понятливости в машинных кодах (Пусть message будет равнятся 4Fh и стоять по адресу 2A), то:

По теории должно быть так:

a1 2a 00 ; записать адрес в ax -> равносильно mov ax,message
b8 4F 00 ; записать значение в ax -> равносильно mov ax,[message]

На практике получается так:

a1 2a 00 ; mov ax,message
b8 2a 00 (Почему помещается адрес ??? ) ; mov ax,[message]
b8 4f ; mov ax,4fh

Или точно так же, только с 32 битным регистром ( eax ) :
66 a1 2a 00 -> mov eax,variable
66 b8 2a 00 00 00 -> mov eax,[variable] ->( с чего бы это??? )
66 b8 4f 00 00 00 -> mov eax,4fh

Память выделятся как для значения (4 байта), а помещается адрес!... Почему?

Что-то Вы путаете. Молодой человек!
Насколько я знаю машинный код:

 
Код:
B8 2A 00          ; mov  ax,message
A1 2A 00          ; mov  ax,[message]
66 B8 2A 00 00 00 ; mov eax,message
66 A1 2A 00 00 00 ; mov eax,[message]
349
13 мая 2009 года
Phantom-84
656 / / 27.10.2005
Цитата:
Пользуюсь FASM-ом. Все говорят что если написать так:
mov ax,message ; то запишется адрес этой переменной
а если так:
mov ax,[message] ; то в регистр запишется значение

Правильно говорят.

Посмотрел Intel Manual. Написано, что опкод команды mov r16, r/m16 равен 0x8B, а не 0xB8.

12K
13 мая 2009 года
ASoftware
87 / / 16.04.2009
Цитата:
Что-то Вы путаете. Молодой человек!
Насколько я знаю машинный код:
Код:

B8 2A 00 ; mov ax,message
A1 2A 00 ; mov ax,[message]
66 B8 2A 00 00 00 ; mov eax,message
66 A1 2A 00 00 00 ; mov eax,[message]





mov ax,message
mov ax,[message]
mov ax,1234h

b80900 a10900 b83412 3412

Т.е. я так понимаю что записать значение, которое стоит по адресу 2А, это а12А00? Просто долго не мог понять, почему нельзя написать вместо этого b84F00. Наверное потому что программа заранее этого не знает, а вот компилятор мог бы это заранее предусмотреть...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог