Возник вопрос о PTR при использовании в инструкции CALL при использовании MASM - PullRequest
0 голосов
/ 09 мая 2019

Я не видел в документации MASM информацию о регистре PTR, используемую в этом примере:

.486

.Model flat,stdcall

label1 typedef ptr proc

.data

   mydata db 20h

.code

main proc

   call label1 ptr esi

main endp

end

Где найти информацию об инструкции CALL с использованием регистра PTR?

1 Ответ

0 голосов
/ 09 мая 2019

PTR не является регистром.PTR - это синтаксический элемент MASM, сокращение от «указатель» и разновидность оператора приведения.Так, например, mov DWORD PTR [esi], 0 означает «обрабатывать адрес, на который esi указывает как DWORD (32 бита), и копировать туда ноль», так что это очищает 4 байта.Напротив, mov BYTE PTR [esi], 0 означает просто очистить 1 байт.

В вашем примере, label1 определен для представления типа «указатель на процедуру».В инструкции CALL, PTR используется, чтобы сообщить ассемблеру, что адрес, на который указывает esi, имеет тип «процедура».В CALL insttruction вызывается процедура, адрес которой хранится в ESI.

Насколько мне известно, в этом примере это приведение бесполезно, потому что нет никакой неоднозначности, которая должна быть разрешена приведением: CALL с 32-битным регистром операнд всегда является косвенным вызовом рядом, беря адрес, который должен быть вызван из 32-битного регистра.

...