4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
||||||
1 | ||||||
Что делает операция PTR31.03.2012, 23:04. Показов 44203. Ответов 15
Метки нет (Все метки)
Привет всем!
У меня вопрос к опытным программистам в ассемблере х86. Недавно в документации по Турбо Паскалю 6.0 в секции использования ассемблера наткнулся на такую операцию, как PTR. Она имеет 2 операнда (синтаксис: a PTR b). Эмпирически сообразил о синтаксисе, но что она делает не понял. Привожу пример отрывка программы (ассемблерная вставка):
0
|
31.03.2012, 23:04 | |
Ответы с готовыми решениями:
15
Что означает ptr в строке byte ptr[si],al Что такое qword ptr gs Что означает mov byte ptr ds:[1], 'b'? Что за адрес в MOV EAX,DWORD PTR DS:[10008234] |
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
31.03.2012, 23:55 | 2 | |||||
Сообщение от antares
0
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
||||||||||||||||
01.04.2012, 00:35 [ТС] | 3 | |||||||||||||||
Всем спасибо за помощь. Ответ нагуглил сам:
PTR - Операция назначения типа. Результатом будет ссылка на память со значением выражения, следующего за операцией и типом выражения перед операцией. Например:
Добавлено через 17 минут 2 Charles Kludge то что ты указал это оператор вставки ассемблера в виде машинных кодов, но основной способ вставки через конструкцию asm ...end; впрочем как говорится "на вкус и цвет..." Добавлено через 14 минут p.s. кстати, по поводу полученного значения в первичном примере, все равно непонятно почему 3004h. Что это, смещение в сегменте данных, указывающее на второй операнд? И какой тип определен значением 03h?
0
|
Charles Kludge
|
01.04.2012, 08:31
#4
|
Не по теме: Мдя...Первоапрельский троллинг не удался.:cry:
0
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
|
01.04.2012, 16:42 [ТС] | 5 |
на правах оффтопа
это не страшно, всегда можно текущую дату сдвинуть в право на разницу между ней и 1ым апреля, и попробовать еще раз ))) и все же, как же по теме?) почему именно 3004h?
0
|
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|||||||||||
01.04.2012, 17:00 | 6 | ||||||||||
Сообщение от antares
0
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
|||||||||||
01.04.2012, 18:38 [ТС] | 7 | ||||||||||
2 Charles Kludge ты имеешь ввиду ассемблер рассматривает $2 как имя переменной? интересно, что же он себе представил под $3? xD подозреваю, что взял тип переменной $3
Сорри за глупый вопрос, что есть FPC? поиск на форуме ничего не дал ( Добавлено через 48 минут в общем, в примере "$2" от "2" ничем не отличается в результате, и это точно не идентификатор переменной, поскольку вставленный впереди оператор
0000h 0000 0000 0000 0000 0400h 0000 0100 0000 0000 3004h 0011 0000 0000 0100 3030h 0011 0000 0011 0000 НО! Когда я вместо "$2" поставил объявленную ранее в коде Паскаля переменную (int), то получил на выходе нормальные значения из этой переменной:
0001h 0000 0000 0000 0001 0002h 0000 0000 0000 0010 0003h 0000 0000 0000 0011 p.s. заранее прошу прощения, что лезу со "своим" Паскалем в ваш монастырь, больно случай интересный
0
|
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
01.04.2012, 18:52 | 8 |
Сообщение от antares
или Virtual Pascal - гуглите. Позволяют получить асм-листинг генерируемого кода с исходниками в комментах. Бугланд-совместимые, но 32-бита.
1
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
|
01.04.2012, 19:31 [ТС] | 9 |
хотелось бы услышать мнение Mikl___, если не трудно
0
|
Ушел с форума
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
|
|
02.04.2012, 12:07 | 10 |
А чем ответ Charles Kludge не устроил? Да и что такое PTR ты сам нашел:
1
|
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
02.04.2012, 12:43 | 11 |
0
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
||||||
04.04.2012, 21:50 [ТС] | 12 | |||||
в данном случае меня интересует природа результата, в 7ом посте я рассмотрел 2 варианта, второй мне ясен, но что собой представляют операнды в первом варианте? Еще раз,
Добавлено через 17 минут 2 Charles Kludge эта ссылка плохая, пришлось влезть в код форума и зайти на материал по титулу, тоже самое со второй, за чтиво спасибо, обязательно проштудирую) на счет Virtual Pascal - для win32 я пользуюсь Delphi 8.0 .NET мне хватает, да и не любитель я гоняться за новинками) Добавлено через 42 минуты странно, среди списка дизассемблеров нет отладчика OllyDbg Добавлено через 7 минут в отладчик не лазил, лень , видимо 3004h это адрес в сегменте данных, по которому лежат данные о типе и значении данных, я так это понял из темы, всем еще раз спасибо за участие)
0
|
Ушел с форума
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
|
||||||||||||||||
05.04.2012, 04:59 | 13 | |||||||||||||||
antares, попробовал повторить твой пример в MASM, TASM
masm выдал invalid type expression ввел в программу переменную А
В ассемблере оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением ТИП PTR ВЫРАЖЕНИЕ Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far. Например,
Видимо в Паскале это не совсем так, опытным путем ты установил, что число 3 соответствует WORD, попробуй поэкспериментировать с командами mov al,число ptr 2 и mov eax,число ptr 2 и тогда будет понятно какое число соответствует типам BYTE и DWORD. А число $2 в выражении mov ax,$3 ptr $2 это адрес соответствующий переменной ds:[2]
1
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
||||||||||||||||||||||||||
05.04.2012, 16:20 [ТС] | 14 | |||||||||||||||||||||||||
пробовал вместо типа ставить от 0h до fh - на результат не влияет;
если вместо второго операнда (значение/метка) указываю переменную, выдается значение в формате объявленного типа для данной переменной; отрывок кода:
0000h 0000 0000 0000 0000 0001h 0000 0000 0000 0001 0002h 0000 0000 0000 0010 0003h 0000 0000 0000 0011 0004h 0000 0000 0000 0100 0005h 0000 0000 0000 0101 0006h 0000 0000 0000 0110 0007h 0000 0000 0000 0111 0008h 0000 0000 0000 1000 0009h 0000 0000 0000 1001 000Ah 0000 0000 0000 1010 000Bh 0000 0000 0000 1011 000Ch 0000 0000 0000 1100 000Dh 0000 0000 0000 1101 000Eh 0000 0000 0000 1110 000Fh 0000 0000 0000 1111 однако, когда начинаю вторым операндом ставить (как я понимаю) константы от 0h до fh, начинают вылазить интересные значения; отрывок кода:
0h : 0000h 0000 0000 0000 0000 1h : 0400h 0000 0100 0000 0000 2h : 3004h 0011 0000 0000 0100 3h : 3030h 0011 0000 0011 0000 4h : 3030h 0011 0000 0011 0000 5h : 3030h 0011 0000 0011 0000 6h : 0430h 0000 0100 0011 0000 7h : 3004h 0011 0000 0000 0100 8h : 3030h 0011 0000 0011 0000 9h : 3030h 0011 0000 0011 0000 Ah : 3130h 0011 0001 0011 0000 Bh : 0431h 0000 0100 0011 0001 Ch : 3004h 0011 0000 0000 0100 Dh : 3030h 0011 0000 0011 0000 Eh : 3130h 0011 0001 0011 0000 Fh : 3031h 0011 0000 0011 0001 вот такие интересные результаты) отмечу лишь, что их природа довольно не линейна; мое резюме: возможно "косяк" Борланда, хотя я к ним отношусь с большим пиететом; но возможно и есть какое то объяснение, о понимании которого я чего-то не знаю. Добавлено через 51 минуту 0! Интересный момент. Задал тип явно, с WORD вроде все понятно, результат как и раньше, но когда поставил BYTE, пришлось указать байт регистра; отрывок кода:
7DF8h 0111 1101 1111 1000 31F8h 0011 0001 1111 1000 как вы видите значение 31h отразилось где надо; в предыдущем эксперименте 31h присутствовало в младшем байте - возможно это связано с тем, что второй операнд имеет емкость один байт; решил использовать вторым операндом двухбайтное значение (со всеми соответствующими изменениями в коде по регистру и типу); при этом после операции менялись оба байта аккумулятора, видимо потому что тип был WORD и/или регистр был двухбайтный; отрывок кода:
0Fh : 3031h 0011 0000 0011 0001 10h : 0430h 0000 0100 0011 0000 11h : 3004h 0011 0000 0000 0100 12h : 3030h 0011 0000 0011 0000 13h : 3130h 0011 0001 0011 0000 14h : 3131h 0011 0001 0011 0001 15h : 0431h 0000 0100 0011 0001 16h : 3004h 0011 0000 0000 0100 17h : 3130h 0011 0001 0011 0000 18h : 3031h 0011 0000 0011 0001 19h : 3030h 0011 0000 0011 0000 1ah : 0430h 0000 0100 0011 0000 1bh : 3004h 0011 0000 0000 0100 1ch : 3130h 0011 0001 0011 0000 1dh : 3031h 0011 0000 0011 0001 1eh : 3130h 0011 0001 0011 0000 1fh : 0431h 0000 0100 0011 0001 как видите качественный состав значений множества результатов не изменился, бьюсь об заклад, что увеличивая старший байт операнда он и не изменится, хотя возможно повлияет на последовательность самих значений. p.s. К сожалению Турбо Паскаль 6.0 с регистрами расширенного состава не работает, поэтому провести эксперименты с EAX не смог. Добавлено через 18 минут действительно, прогнал пару проб типа
1
|
Ушел с форума
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
|
|||||||||||||||||||||||||||||||||||||||||||
06.04.2012, 07:16 | 15 | ||||||||||||||||||||||||||||||||||||||||||
antares,
читаем первоисточник "Turbo Assembler version 3.2 User's Guide" от Borland International глава 5. "Using expreessions and sybol values"
Видно что число перед PTR соответствует размеру byte, word, dword, pword, qword, tbyte в байтах. Для закрепления результата пишем программу на ТАСМе, в комментариях показано, КАК этот код воспринимается программой hiew32.exe и ЧТО появляется в регистре EAX и на вершине стека FPU в результате ее выполнения
0
|
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
|
|
12.05.2012, 15:44 [ТС] | 16 |
да, пожалуй, абсолютно ))
одно огорчило, мне надлежало самому догадаться поискать ответ в описании ассемблера сборки Борланда, ну чтоже, "век живи - век учись" ) еще раз всем спасибо!
0
|
12.05.2012, 15:44 | |
12.05.2012, 15:44 | |
Помогаю со студенческими работами здесь
16
Что означает cmp dword ptr ds:[eax+10h],0300h? Подскажите, пожалуйста, что означает эта строка в ассемблере: 00b00DE0 add byte ptr [eax], al, как её прочитать? Что делает операция >>? Что делает операция new? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |