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

Ваш аккаунт

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

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

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

Как, зная адрес, узнать что в нем хранится?

2.1K
13 января 2003 года
qrwa
10 / / 13.01.2003
Проблема такая. Я имею адрес ячейки памяти. Мне надо узнать, какой символ в ней находится.
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?

P.S. Мне не надо советов, типа все можно сделать по-другому, не посылая в стек и т.д. Меня интересует
конкретный случай: можно (тогда как) или нельзя.
P.S.2 Вроде бы суть проблемы понятно объяснил.
419
13 января 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by qrwa
Проблема такая. Я имею адрес ячейки памяти. Мне надо узнать, какой символ в ней находится.
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?

P.S. Мне не надо советов, типа все можно сделать по-другому, не посылая в стек и т.д. Меня интересует
конкретный случай: можно (тогда как) или нельзя.
P.S.2 Вроде бы суть проблемы понятно объяснил.


mov bx,002eh
mov cx, word ptr es:bx
Вроде так.

395
13 января 2003 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by qrwa
Проблема такая. Я имею адрес ячейки памяти. Мне надо узнать, какой символ в ней находится.
Например: Имеем переменную "а=5". Ее адрес (допустим 002Е) помещаем в стек. Через некоторое
время вынимаем этот адрес из стека и помещаем в регистр (допустим AX). Как сейчас, зная адрес,
узнать значение (или символ), которое там хранится? Далее это значение необходимо для различных
действий.
В С++ есть указатели. А в Ассемблере как?



Да, похоже Вы только начали программировать на асме. Проведу небольшой курс :). Начнем с такого понятия как указатель. Указатель - это обычная переменная, которая хранит в себе адрес, по которому находятся какие-нить данные. Так что адрес, по которому находится переменная (в Вашем примере) это и есть по сути указатель. Когда мы загрузили этот адрес в регистр BX (АХ в данном случае не подходит) как нам сказать процессору, что нам необходимо загрузить в регистр AX именно значение по этому адресу? А очень просто, для этого можно просто написать регистр BX в квадратных скобках:
mov ax,[bx]
Вот и все, теперь процессор знает, что ему необходимо загрузить в AX не содержимое BX, а значение по адресу, хранящимся в регистре BX. Вот собственно и все. Поэтому рождается простое правило, что процессор при работе с переменными оперирует только адресами (указателями). Существует такой термин как ближний (near) и дальний (far) указатель. Я думаю, что в Си Вы с этим делом встречались. Различие их в том, что near указатели содержат в себе только смещение (как в нашем примере), а far - сегмент:смещение (см. пример by Mitja Gladkih, только вот для корректности надо бы es:bx в скобочках...)

А вообще, просто почитайте доки и не спрашивайте такие элементарные вещи!!! Задавайте вопросы только с реальными проблемами!!!:x

419
14 января 2003 года
Mitja Gladkih
284 / / 19.12.2002
Вроде и без скобок можно.
395
14 января 2003 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by Mitja Gladkih
Вроде и без скобок можно.


Ну это смотря какой Ассемблер

2.1K
14 января 2003 года
qrwa
10 / / 13.01.2003
Все, разобрался. Про квадратные скобки я знал. Но вот пихал адрес в стек из регистра АХ, поэтому и не получалось.

Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра. Кстати инфы у меня много, а делать все надо срочно и нет времени книги перечитывать. Именно в таких случаях совет необходим, а не тонны литературы.
1.9K
14 января 2003 года
SkLite
38 / / 02.12.2002
Цитата:
Originally posted by qrwa
Все, разобрался. Про квадратные скобки я знал. Но вот пихал адрес в стек из регистра АХ, поэтому и не получалось.

Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра. Кстати инфы у меня много, а делать все надо срочно и нет времени книги перечитывать. Именно в таких случаях совет необходим, а не тонны литературы.


Ну насмешил :D :D :D
bx тут ни при чем. вместо него можно использовать любой регистр, например так:
pop ax
mov ax, [ax]

P.S. Ты думаешь ты дышешь воздухом?

395
14 января 2003 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by SkLite

Ну насмешил :D :D :D
bx тут ни при чем. вместо него можно использовать любой регистр, например так:
pop ax
mov ax, [ax]

P.S. Ты думаешь ты дышешь воздухом?



Ну, ну. Посмотрим как у тебя это откомпилится.
Вот
mov ax,[eax]
другое дело

1.9K
14 января 2003 года
SkLite
38 / / 02.12.2002
Цитата:
Originally posted by RelB


Ну, ну. Посмотрим как у тебя это откомпилится.
Вот
mov ax,[eax]
другое дело


для реального, где ах это ах, а для защищенного ах это еах. Ну типа когда дебагишь. А так ты полностью прав. В реальном надо еах. Просто, по моему, такой код будет меньше, чем с bx, так как с ах команды на 1 байт меньше получаются.

424
14 января 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by SkLite

для реального, где ах это ах, а для защищенного ах это еах. Ну типа когда дебагишь. А так ты полностью прав. В реальном надо еах. Просто, по моему, такой код будет меньше, чем с bx, так как с ах команды на 1 байт меньше получаются.



НЕЛЬЗЯ ПО AX АДРЕСОВАТЬСЯ!!! Вот и всё.

419
15 января 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by qrwa

Тому кто первый ответил-> сочинения тебя писать никто не просил, хватило бы только упоминания о магических свойствах ВХ регистра.


А что еще делать, ежели задаешь такие, извини меня, дурацкие вопросы. Вначале надо язык изучить - не зная броду, не суйся в воду.
(хоть я первый, а ты говоришь о втором, но...)

395
15 января 2003 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by (C)dragon


НЕЛЬЗЯ ПО AX АДРЕСОВАТЬСЯ!!! Вот и всё.


Правильно и еще по CX и DX. Это касается любых, абсолютно любых режимов. Ни каким образом заставить процессор так адресоваться не получиться!!!

2.0K
20 января 2003 года
yup
31 / / 03.12.2002
что делает это
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
424
20 января 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by yup
что делает это
mov eax,0B845h
lea eax,[eax*2] ???



загружает в eax число 0B845h, умноженное на два. А причём тут это? lea загружает в регистр указатель, тем более, начиная с 386 можно адресоваться по любому регистру, кроме сегментных и специальных(ну и ещё всяких там MMX, XMM).

424
20 января 2003 года
(C)dragon
307 / / 04.12.2002
Да, вроде бы и по sp нельзя адресоваться.
2.0K
20 января 2003 года
yup
31 / / 03.12.2002
lea ax,message
в ax - смещение message,

а как понять lea eax,[eax*2]
424
20 января 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by yup
lea ax,message
в ax - смещение message,

а как понять lea eax,[eax*2]



lea загружает то, что стоит в квадратных скобках.

2.0K
21 января 2003 года
yup
31 / / 03.12.2002
Цитата:
Originally posted by (C)dragon


lea загружает то, что стоит в квадратных скобках.




Спасибо

2.2K
06 июня 2003 года
spaces
28 / / 10.04.2003
А нука покажите мне как начиная с i386 можно адресоваться по любому регистру ?
я такого не видел.....
Опкод в студию !
424
07 июня 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by spaces
А нука покажите мне как начиная с 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, и регистрам управления адресоваться нельзя.

2.2K
09 июня 2003 года
spaces
28 / / 10.04.2003
Цитата:
Originally posted by (C)dragon


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, и регистрам управления адресоваться нельзя.



Я думал в реальном режиме можно :)

1.8K
09 июня 2003 года
gwg605
76 / / 06.03.2003
загружает - не очень подходит (хотя в оригенале написанно именно загружает), мне кажется, что более правильно - вычисляет адрес и сохраняет его в указанном регистре.

Валерий.
1.8K
09 июня 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by gwg605
ЪБЗТХЦБЕФ - ОЕ ПЮЕОШ РПДИПДЙФ (ИПФС Ч ПТЙЗЕОБМЕ ОБРЙУБООП ЙНЕООП ЪБЗТХЦБЕФ), НОЕ ЛБЦЕФУС, ЮФП ВПМЕЕ РТБЧЙМШОП - ЧЩЮЙУМСЕФ БДТЕУ Й УПИТБОСЕФ ЕЗП Ч ХЛБЪБООПН ТЕЗЙУФТЕ.



рПЮЕНХ ОЕ РПДИПДЙФ? фЕТНЙОХ "ЪБЗТХЪЙФШ ТЕЗЙУФТ ЛБЛЙН-МЙВП ЪОБЮЕОЙЕН" ХЦЕ МЕФ РСФШДЕУСФ :) й, ЛУФБФЙ, "УПИТБОЙФШ" ПВЩЮОП ЙУРПМШЪХЕФУС Ч РТСНП РТПФЙЧПРПМПЦОПН ЪОБЮЕОЙЙ - УПИТБОЙФШ Ч РБНСФЙ

1.8K
10 июня 2003 года
gwg605
76 / / 06.03.2003
Цитата:
Originally posted by Lonesome

Почему не подходит? Термину "загрузить регистр каким-либо значением" уже лет пятьдесят И, кстати, "сохранить" обычно используется в прямо противоположном значении - сохранить в памяти



Сорри, немного некорректно сказал. Попробую поновой.

"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.

Удачи,
Валерий.
ЗЫ. Чем старше - тем больший зануда :)

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