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] ; то в регистр запишется значение
Приведу для понятливости в машинных кодах (Пусть 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 байта), а помещается адрес!... Почему?
Цитата: 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 байта), а помещается адрес!... Почему?
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 байта), а помещается адрес!... Почему?
Что-то Вы путаете. Молодой человек!
Насколько я знаю машинный код:
Код:
Цитата:
Пользуюсь FASM-ом. Все говорят что если написать так:
mov ax,message ; то запишется адрес этой переменной
а если так:
mov ax,[message] ; то в регистр запишется значение
mov ax,message ; то запишется адрес этой переменной
а если так:
mov ax,[message] ; то в регистр запишется значение
Правильно говорят.
Посмотрел Intel Manual. Написано, что опкод команды mov r16, r/m16 равен 0x8B, а не 0xB8.
Цитата:
Что-то Вы путаете. Молодой человек!
Насколько я знаю машинный код:
Код:
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]
Насколько я знаю машинный код:
Код:
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. Наверное потому что программа заранее этого не знает, а вот компилятор мог бы это заранее предусмотреть...