Как, зная адрес, узнать что в нем хранится?
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?
P.S. Мне не надо советов, типа все можно сделать по-другому, не посылая в стек и т.д. Меня интересует
конкретный случай: можно (тогда как) или нельзя.
P.S.2 Вроде бы суть проблемы понятно объяснил.
Проблема такая. Я имею адрес ячейки памяти. Мне надо узнать, какой символ в ней находится.
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?
P.S. Мне не надо советов, типа все можно сделать по-другому, не посылая в стек и т.д. Меня интересует
конкретный случай: можно (тогда как) или нельзя.
P.S.2 Вроде бы суть проблемы понятно объяснил.
mov bx,002eh
mov cx, word ptr es:bx
Вроде так.
Проблема такая. Я имею адрес ячейки памяти. Мне надо узнать, какой символ в ней находится.
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?
Да, похоже Вы только начали программировать на асме. Проведу небольшой курс :). Начнем с такого понятия как указатель. Указатель - это обычная переменная, которая хранит в себе адрес, по которому находятся какие-нить данные. Так что адрес, по которому находится переменная (в Вашем примере) это и есть по сути указатель. Когда мы загрузили этот адрес в регистр BX (АХ в данном случае не подходит) как нам сказать процессору, что нам необходимо загрузить в регистр AX именно значение по этому адресу? А очень просто, для этого можно просто написать регистр BX в квадратных скобках:
mov ax,[bx]
Вот и все, теперь процессор знает, что ему необходимо загрузить в AX не содержимое BX, а значение по адресу, хранящимся в регистре BX. Вот собственно и все. Поэтому рождается простое правило, что процессор при работе с переменными оперирует только адресами (указателями). Существует такой термин как ближний (near) и дальний (far) указатель. Я думаю, что в Си Вы с этим делом встречались. Различие их в том, что near указатели содержат в себе только смещение (как в нашем примере), а far - сегмент:смещение (см. пример by Mitja Gladkih, только вот для корректности надо бы es:bx в скобочках...)
А вообще, просто почитайте доки и не спрашивайте такие элементарные вещи!!! Задавайте вопросы только с реальными проблемами!!!:x
Вроде и без скобок можно.
Ну это смотря какой Ассемблер
Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра. Кстати инфы у меня много, а делать все надо срочно и нет времени книги перечитывать. Именно в таких случаях совет необходим, а не тонны литературы.
Все, разобрался. Про квадратные скобки я знал. Но вот пихал адрес в стек из регистра АХ, поэтому и не получалось.
Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра. Кстати инфы у меня много, а делать все надо срочно и нет времени книги перечитывать. Именно в таких случаях совет необходим, а не тонны литературы.
Ну насмешил :D :D :D
bx тут ни при чем. вместо него можно использовать любой регистр, например так:
pop ax
mov ax, [ax]
P.S. Ты думаешь ты дышешь воздухом?
Ну насмешил :D :D :D
bx тут ни при чем. вместо него можно использовать любой регистр, например так:
pop ax
mov ax, [ax]
P.S. Ты думаешь ты дышешь воздухом?
Ну, ну. Посмотрим как у тебя это откомпилится.
Вот
mov ax,[eax]
другое дело
Ну, ну. Посмотрим как у тебя это откомпилится.
Вот
mov ax,[eax]
другое дело
для реального, где ах это ах, а для защищенного ах это еах. Ну типа когда дебагишь. А так ты полностью прав. В реальном надо еах. Просто, по моему, такой код будет меньше, чем с bx, так как с ах команды на 1 байт меньше получаются.
для реального, где ах это ах, а для защищенного ах это еах. Ну типа когда дебагишь. А так ты полностью прав. В реальном надо еах. Просто, по моему, такой код будет меньше, чем с bx, так как с ах команды на 1 байт меньше получаются.
НЕЛЬЗЯ ПО AX АДРЕСОВАТЬСЯ!!! Вот и всё.
Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра.
А что еще делать, ежели задаешь такие, извини меня, дурацкие вопросы. Вначале надо язык изучить - не зная броду, не суйся в воду.
(хоть я первый, а ты говоришь о втором, но...)
НЕЛЬЗЯ ПО AX АДРЕСОВАТЬСЯ!!! Вот и всё.
Правильно и еще по CX и DX. Это касается любых, абсолютно любых режимов. Ни каким образом заставить процессор так адресоваться не получиться!!!
mov eax,0B845h
lea eax,[eax*2] ???
/************************************************/
или вот
xor eax,eax
mov ds,ax
mov ebx,[eax]
После
ax 0000
bx 0254
cx 0000
dx 0000
si 0000
di 0000
bp 0000
sp FFFE
ds 0000
es 526B
ss 526B
cs 526B
ip 0109
что делает это
mov eax,0B845h
lea eax,[eax*2] ???
загружает в eax число 0B845h, умноженное на два. А причём тут это? lea загружает в регистр указатель, тем более, начиная с 386 можно адресоваться по любому регистру, кроме сегментных и специальных(ну и ещё всяких там MMX, XMM).
в ax - смещение message,
а как понять lea eax,[eax*2]
lea ax,message
в ax - смещение message,
а как понять lea eax,[eax*2]
lea загружает то, что стоит в квадратных скобках.
lea загружает то, что стоит в квадратных скобках.
Спасибо
я такого не видел.....
Опкод в студию !
А нука покажите мне как начиная с i386 можно адресоваться по любому регистру ?
я такого не видел.....
Опкод в студию !
8B00 MOV EAX,DWORD PTR DS:[EAX]
8B03 MOV EAX,DWORD PTR DS:[EBX]
8B01 MOV EAX,DWORD PTR DS:[ECX]
8B06 MOV EAX,DWORD PTR DS:[ESI]
8B07 MOV EAX,DWORD PTR DS:[EDI]
3E8B4500 MOV EAX,DWORD PTR DS:[EBP]
3E8B0424 MOV EAX,DWORD PTR DS:[ESP]
Вот, пожалуйста. Как я где-то говорил, по mmx, xmm, и регистрам управления адресоваться нельзя.
8B00 MOV EAX,DWORD PTR DS:[EAX]
8B03 MOV EAX,DWORD PTR DS:[EBX]
8B01 MOV EAX,DWORD PTR DS:[ECX]
8B06 MOV EAX,DWORD PTR DS:[ESI]
8B07 MOV EAX,DWORD PTR DS:[EDI]
3E8B4500 MOV EAX,DWORD PTR DS:[EBP]
3E8B0424 MOV EAX,DWORD PTR DS:[ESP]
Вот, пожалуйста. Как я где-то говорил, по mmx, xmm, и регистрам управления адресоваться нельзя.
Я думал в реальном режиме можно :)
Валерий.
ЪБЗТХЦБЕФ - ОЕ ПЮЕОШ РПДИПДЙФ (ИПФС Ч ПТЙЗЕОБМЕ ОБРЙУБООП ЙНЕООП ЪБЗТХЦБЕФ), НОЕ ЛБЦЕФУС, ЮФП ВПМЕЕ РТБЧЙМШОП - ЧЩЮЙУМСЕФ БДТЕУ Й УПИТБОСЕФ ЕЗП Ч ХЛБЪБООПН ТЕЗЙУФТЕ.
рПЮЕНХ ОЕ РПДИПДЙФ? фЕТНЙОХ "ЪБЗТХЪЙФШ ТЕЗЙУФТ ЛБЛЙН-МЙВП ЪОБЮЕОЙЕН" ХЦЕ МЕФ РСФШДЕУСФ :) й, ЛУФБФЙ, "УПИТБОЙФШ" ПВЩЮОП ЙУРПМШЪХЕФУС Ч РТСНП РТПФЙЧПРПМПЦОПН ЪОБЮЕОЙЙ - УПИТБОЙФШ Ч РБНСФЙ
Почему не подходит? Термину "загрузить регистр каким-либо значением" уже лет пятьдесят И, кстати, "сохранить" обычно используется в прямо противоположном значении - сохранить в памяти
Сорри, немного некорректно сказал. Попробую поновой.
"lea загружает в регистр указатель" - вот эта фраза может быть не понятна новичку. С моей точки зрения, и что самое интересное Intel придерживается такой же схемы :), это вычислить и сохранить в регистре.
Вырезано из "IA-32 Intel® Architecture Software Developer’s Manual Volume 2: Instruction Set Reference"
Computes the effective address of the second operand (the source operand) and stores it in the
first operand (destination operand).
Я когда начинал, тоже прочел загрузить адрес(в русской книжке), и не мог понять для чего нужна отдельная инструкция если можно mov si,OFFSET xxx.
Удачи,
Валерий.
ЗЫ. Чем старше - тем больший зануда :)