С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/218: Рейтинг темы: голосов - 218, средняя оценка - 4.55
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
1

Что делает операция PTR

31.03.2012, 23:04. Показов 44203. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!
У меня вопрос к опытным программистам в ассемблере х86. Недавно в документации по Турбо Паскалю 6.0 в секции использования ассемблера наткнулся на такую операцию, как PTR. Она имеет 2 операнда (синтаксис: a PTR b). Эмпирически сообразил о синтаксисе, но что она делает не понял. Привожу пример отрывка программы (ассемблерная вставка):
Pascal
1
2
3
4
asm
     MOV AX, $3 PTR $2
     MOV i, AX
end;
выводя на консоль значение переменной i, получаю (при текущих операндах) 3004h, но что это и каким образом получено не понятно. Разложил значение по-битно, все равно ничего не понял. Если кто знает, помогите пожалуйста разобраться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2012, 23:04
Ответы с готовыми решениями:

Что означает ptr в строке byte ptr[si],al
Что означает ptr в строке byte ptr,al Вот весь код, может понадобится Преобразование двоичного...

Что такое qword ptr gs
Есть инструкция jmp qword ptr gs: Каким образом мне понять куда она прыгает (конкретный...

Что означает mov byte ptr ds:[1], 'b'?
Здравствуйте, обьясните пожалуйста фрагмент кода. mov byte ptr ds:, 'a' mov byte ptr...

Что за адрес в MOV EAX,DWORD PTR DS:[10008234]
Занимаюсь дизассемблированием одной софтинки в ollydbg. Встретилась такая команда MOV EAX,DWORD...

15
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
31.03.2012, 23:55 2
Цитата Сообщение от antares
Турбо Паскалю 6.0
Ой ли? Даже в TP7.0, исходники рантайма которого я просматриваю, ассемблерные вставки звучали как
Pascal
1
2
3
4
5
procedure LstBinaryMode;
inline(
  $8B/$1E/Lst/        { MOV   BX,Lst.Handle }
  $B8/$00/$44/        { MOV   AX,4400H      }
  $CD/$21);            { INT   21H           }
0
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
01.04.2012, 00:35  [ТС] 3
Всем спасибо за помощь. Ответ нагуглил сам:
PTR - Операция назначения типа. Результатом будет ссылка на память со значением выражения, следующего за операцией и типом выражения перед операцией.
Например:
Assembler
1
mov     dl,BYTE PTR OutBufPtr
или
Assembler
1
2
mov   al,  BYTE PTR [100H]
mov   bx,  WORD PTR [100H]
или
Assembler
1
call      NEAR PTR FarProc
в последнем случае произходит обращение к процедуре с назначением типа ближнего обращения

Добавлено через 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
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Мдя...Первоапрельский троллинг не удался.
на правах оффтопа
это не страшно, всегда можно текущую дату сдвинуть в право на разницу между ней и 1ым апреля, и попробовать еще раз )))

и все же, как же по теме?) почему именно 3004h?
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
01.04.2012, 17:00 6
Цитата Сообщение от antares
Assembler
1
2
 MOV AX, $3 PTR $2
 MOV i, AX
Дык, это в любом случае разворачивается в адрес переменной/ф-ции
Assembler
1
mov ax, near ptr loc_name
или значение по этому адресу
Assembler
1
mov ax, word ptr loc_name
IMHO, проще взять FPC да посмотреть, что же там именно.
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" ничем не отличается в результате, и это точно не идентификатор переменной, поскольку вставленный впереди оператор
Assembler
1
INC 2
был компилятором не понят) чесно я и не надеялся, при этом меняя операнд "$2"/"2" поочередно на "0","1","2","3" получил следующее соответственно ("$3" заменил на WORD, потому как явный "косяк" был):
0000h 0000 0000 0000 0000
0400h 0000 0100 0000 0000
3004h 0011 0000 0000 0100
3030h 0011 0000 0011 0000

НО! Когда я вместо "$2" поставил объявленную ранее в коде Паскаля переменную (int), то получил на выходе нормальные значения из этой переменной:
Pascal
1
2
3
4
5
6
7
8
for i:=1 to 3 do
begin
     asm
        MOV AX, WORD PTR i
        MOV j, AX
     end;
     WriteHexWord(j); Write(' '); WriteBitWord(j); WriteLn;
end;
результат:
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
что есть FPC?
http://freepascal.org/
или Virtual Pascal - гуглите. Позволяют получить асм-листинг генерируемого кода с исходниками в комментах. Бугланд-совместимые, но 32-бита.
1
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
01.04.2012, 19:31  [ТС] 9
хотелось бы услышать мнение Mikl___, если не трудно
0
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
02.04.2012, 12:07 10
Цитата Сообщение от antares Посмотреть сообщение
хотелось бы услышать мнение Mikl___, если не трудно
А чем ответ Charles Kludge не устроил? Да и что такое PTR ты сам нашел:
PTR - Операция назначения типа. Результатом будет ссылка на память со значением выражения, следующего за операцией и типом выражения перед операцией.
Лучше и не скажешь...
1
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
02.04.2012, 12:43 11
antares, BTW, Turbo Pascal disassemblers and DUMPPROG
Virtual Pascal 2.1 Build 279
0
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
04.04.2012, 21:50  [ТС] 12
Цитата Сообщение от Mikl___ Посмотреть сообщение
Да и что такое PTR ты сам нашел:
в данном случае меня интересует природа результата, в 7ом посте я рассмотрел 2 варианта, второй мне ясен, но что собой представляют операнды в первом варианте? Еще раз,
Assembler
1
MOV AX, $3 PTR $2
$2 - что это? Зная что это, я пойму почему в результате 3004h.

Добавлено через 17 минут
2 Charles Kludge эта ссылка плохая, пришлось влезть в код форума и зайти на материал по титулу, тоже самое со второй, за чтиво спасибо, обязательно проштудирую) на счет Virtual Pascal - для win32 я пользуюсь Delphi 8.0 .NET мне хватает, да и не любитель я гоняться за новинками)

Добавлено через 42 минуты
странно, среди списка дизассемблеров нет отладчика OllyDbg

Добавлено через 7 минут
в отладчик не лазил, лень , видимо 3004h это адрес в сегменте данных, по которому лежат данные о типе и значении данных, я так это понял из темы, всем еще раз спасибо за участие)
0
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
05.04.2012, 04:59 13
antares, попробовал повторить твой пример в MASM, TASM
Assembler
1
mov ax,3 ptr 2
tasm выдал сообщение invalid initial entry point address
masm выдал invalid type expression
ввел в программу переменную А
Assembler
1
mov ax,3 ptr a
, сообщения об ошибках те же
В ассемблере оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением ТИП PTR ВЫРАЖЕНИЕ Тип может принимать одно из следующих значений: byte, word, dword, qword, tbyte, near, far. Например,
Assembler
1
2
3
4
.data
d_wrd   dd      0
.code
        mov     al,byte ptr d_wrd+1 ;пересылка второго байта из двойного слова
Переменная d_wrd имеет тип двойного слова. Что делать, если возникнет необходимость обращения не ко всей переменной, а только к одному из входящих в нее байтов (например, ко второму)? Если попытаться сделать это командой mov al,d_wrd+1, то транслятор выдаст сообщение о несовпадении типов операндов. Оператор ptr позволяет непосредственно в команде переопределить тип и выполнить команду.
Видимо в Паскале это не совсем так, опытным путем ты установил, что число 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 - на результат не влияет;
если вместо второго операнда (значение/метка) указываю переменную, выдается значение в формате объявленного типа для данной переменной; отрывок кода:
Pascal
1
2
3
4
5
6
7
8
for i:=$0 to $f do
    begin
     asm
        MOV AX, 0 PTR i
        MOV j, AX
     end;
     WriteHexWord(j); Write(' '); WriteBitWord(j); WriteLn;
    end;
результат:
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, начинают вылазить интересные значения; отрывок кода:
Pascal
1
2
3
4
5
asm
   MOV AX, 0 PTR $0
   MOV j, AX
end;
WriteHexWord(j); Write(' '); WriteBitWord(j); WriteLn;
значение операнда : результат:
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, пришлось указать байт регистра; отрывок кода:
Pascal
1
2
3
4
5
6
7
asm
   MOV i, AX
   MOV Ah, byte PTR $F
   MOV j, AX
end;
WriteHexWord(i); Write(' '); WriteBitWord(i); WriteLn;
WriteHexWord(j); Write(' '); WriteBitWord(j); WriteLn;
результат:
7DF8h 0111 1101 1111 1000
31F8h 0011 0001 1111 1000

как вы видите значение 31h отразилось где надо; в предыдущем эксперименте 31h присутствовало в младшем байте - возможно это связано с тем, что второй операнд имеет емкость один байт; решил использовать вторым операндом двухбайтное значение (со всеми соответствующими изменениями в коде по регистру и типу); при этом после операции менялись оба байта аккумулятора, видимо потому что тип был WORD и/или регистр был двухбайтный; отрывок кода:
Pascal
1
2
3
4
5
6
7
asm
   MOV i, AX
   MOV AX, WORD PTR $10
   MOV j, AX
end;
WriteHexWord(i); Write(' '); WriteBitWord(i); WriteLn;
WriteHexWord(j); Write(' '); WriteBitWord(j); WriteLn;
операнд : результат:
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 минут
Цитата Сообщение от Mikl___ Посмотреть сообщение
А число $2 в выражении mov ax,$3 ptr $2 это адрес соответствующий переменной ds:[2]
действительно, прогнал пару проб типа
Assembler
1
2
3
MOV AX, word PTR DS:[1] 
и 
MOV AX, DS:[1]
и получил теже результаты, что и ранее
1
Ушел с форума
Автор FAQ
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"

Turbo Assembler provides operators that let you override or change the type of an expression. The following table list these operators.
Expression ValueMode
expr1 PTR expr2 Converts expr2 to the type determined by expr1 MASM mode only
type PTR expression Converts expression to the specified address or subtype IDEAL mode only

Type Description
unknow 0
byte 1
word 2
dword 4
pword 6
qword 8
tbyte 10
short/near 0FFFFh
far 0FFFEh
struct/union Size of a structure or union instance
table Size of a table instance
proctype Returns 0FFFFh if procedure describes a near procedure, or 0FFFEh for a far procedure
all other unknow

Видно что число перед PTR соответствует размеру byte, word, dword, pword, qword, tbyte в байтах. Для закрепления результата пишем программу на ТАСМе, в комментариях показано, КАК этот код воспринимается программой hiew32.exe и ЧТО появляется в регистре EAX и на вершине стека FPU в результате ее выполнения
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; tasm dos exe #
.model small
.code
.386
start:  mov ax,@data
    mov ds,ax
    xor eax,eax
    mov al,1 ptr a ;mov al,byte ptr a;eax=00000033
    mov ax,2 ptr a ;mov ax,word ptr a;eax=0000C233
    mov eax,4 ptr a;mov eax,dword ptr a;eax=2168C233
    finit
    fld 4 ptr a;fld dword ptr a;st(0)=7.8861678031155782540e-19
    fld 8 ptr a;fld qword ptr a;st(0)=-8.8796093704934475680e+43
    fld 10 ptr a;fld tbyte ptr a;st(0)=3.1415926535897932380
    mov 2 ptr b,cs;cs=0F6A
    add 2 ptr b,1;
    call 0FFFEh ptr b;call far 0F6C:000E
    mov ah,4Ch
    int 21h
.data
b dd 12345678h
a dt 3.1415926535897932384626433832795; 33 C2 68 21 A2 DA 0F C9 00 40
end start
Резюме: лично мне удобнее указывать тип, через byte, word и т.д. тем более, что передача типа через цифры — это "фичи" ТАСМ, а МАСМ этой порнографии не поддерживает! Но думаю, что интерес antares, этим мини-исследованием удовлетворен.
0
4 / 4 / 0
Регистрация: 31.03.2012
Сообщений: 15
12.05.2012, 15:44  [ТС] 16
Цитата Сообщение от Mikl___ Посмотреть сообщение
интерес antares, этим мини-исследованием удовлетворен.
да, пожалуй, абсолютно ))
одно огорчило, мне надлежало самому догадаться поискать ответ в описании ассемблера сборки Борланда, ну чтоже, "век живи - век учись" ) еще раз всем спасибо!
0
12.05.2012, 15:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2012, 15:44
Помогаю со студенческими работами здесь

Что означает cmp dword ptr ds:[eax+10h],0300h?
Здравствуйте, обьясните пожалуйста три команды: cmp dword ptr ds:,0300h mov , byte ptr '#' lea...

Подскажите, пожалуйста, что означает эта строка в ассемблере: 00b00DE0 add byte ptr [eax], al, как её прочитать?
Что означает 00b00DE0, 00b00DE2, 00b00DE4 и т.д.?

Что делает операция >>?
что значит знак ">>"? Например: d = zt >> 15

Что делает операция new?
spis *newl; newl=new spis(temp); что делает операция new spis(temp); П.с spis...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru