Интересная фишка: защита аргумента от изменения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Интересная фишка: защита аргумента от изменения

Сообщение tyomitch » 13.08.2004 (Пт) 23:11


GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.08.2004 (Пт) 23:41

Неправда, знаем :)
И описано (правда, в документации к QBasic) :)
И даже темы есть про это у нас тут (про то, как наступали на эти грабельки, а потом догадывались, в чём дело) :)
Если, к примеру, в скобки заключить объект, то знаешь что будет? Попробуй :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2004 (Сб) 11:50

GSerg писал(а):Неправда, знаем :)
И описано (правда, в документации к QBasic) :)
И даже темы есть про это у нас тут (про то, как наступали на эти грабельки, а потом догадывались, в чём дело) :)
Если, к примеру, в скобки заключить объект, то знаешь что будет? Попробуй :)

У меня среда упала два раза подряд. Так и должно быть?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 11:58

Нет, так быть не должно...
VB будет пытаться вычислить объект перед его передачей. "Вычислить объект", с точки зрения VB, означает взять его дефолтовую проперть. Он её значение и передаст аргументом функции. А если дефолтовой проперти нет, будет ошибка. А почему рушится, не знаю :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2004 (Сб) 14:01

Ясно. На другой машине (SP6) проверил - так и есть.
В принципе, именно этого я и ожидал.

На той машине, где проверял сначала, SP0. Может быть, дело в этом?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 15:57

Ага, мы ещё и багфиксы выявляем посервиспакно :)
Сотрудничество на редкость плодотворное :wink:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.08.2004 (Вс) 15:30

А объяснение очень простое. Когда аргумент в скобках, то он считается вычисляемым выражением. А выражение всегда передается как ByVal.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.08.2004 (Вс) 16:32

alibek писал(а):А объяснение очень простое. Когда аргумент в скобках, то он считается вычисляемым выражением. А выражение всегда передается как ByVal.

Некорректно. Функция, объявившая параметр как ByRef, всегда получит его именно по ссылке, вне зависимости от того, что ей передано. Просто когда передаётся выражение, его значение копируется во временную переменную и по ссылке передаётся уже та.

Если функция объявила параметр как ByRef, она никогда не получит его по значению.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.08.2004 (Пн) 9:29

Согласен, вычисляемое значение копируется во временную переменную и функция получает ByRef именно ее. Только чем это отличается от ByVal?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2004 (Пн) 9:46

Друзья, имейте совесть :)
Это, по большому счёту, не так уж и важно. С точки зрения процедуры это будет byref, с точки зрения вызывающего - byval, на самом деле - byref :) Чем отличается?
ByVal
mov eax, [ebp+0x8]

ByRef
mov eax, [ebp+0x8]
mov eax, [eax]

Только этим :)
Но неужели это предмет детального обсуждения на нашем форуме? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2004 (Пн) 11:45

alibek писал(а):Согласен, вычисляемое значение копируется во временную переменную и функция получает ByRef именно ее. Только чем это отличается от ByVal?

Собственно, только названием. По сути всё то же самое.
Я же и сказал не "неверно", а "некорректно".
Просто у слова ByVal есть вполне конкретное значение, которое в данном случае неприменимо.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 2:33

GSerg писал(а):Друзья, имейте совесть :)
Это, по большому счёту, не так уж и важно. С точки зрения процедуры это будет byref, с точки зрения вызывающего - byval, на самом деле - byref :) Чем отличается?
ByVal
mov eax, [ebp+0x8]

ByRef
mov eax, [ebp+0x8]
mov eax, [eax]

Только этим :)
Но неужели это предмет детального обсуждения на нашем форуме? :)

Конечно, а где ж ещё? :) Кстати, VB для своих процедур предпочитает esp. И это... того... почему смещение на восемь байт? ("Почему без кепки?") :)

Но я собственно не об этом хотел спросить. Народ, скажите, есть у кого нормальная (максимально полная) дока по OpCod'ам... а то несмотря на то, что у меня их несколько, но чего не кинешься поискать, так нет этого... поделитесь.
С уважением, Approximator.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 17.08.2004 (Вт) 3:26

>Народ, скажите, есть у кого нормальная (максимально полная) дока по OpCod'ам
OpCodes.hlp из MASM32 вполне нормальная. А что ты ищешь?

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 3:48

BP писал(а):>Народ, скажите, есть у кого нормальная (максимально полная) дока по OpCod'ам
OpCodes.hlp из MASM32 вполне нормальная. А что ты ищешь?

Не шути так :)
Если этот хэлп так хорош, то найди мне в нём описание OpCodes, начинающихся с 66 (конкретно меня интересует, что за MOV сидит в этих OpCodes). Например, васиковский компилятор частенько использует для записи в mov ax,<какая-то хренотень> опкоды вроде 66 B8 C7 ...
С уважением, Approximator.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 17.08.2004 (Вт) 4:35

66 - это 16-битный расширитель 32-битной операции.
B8/1/0/0/0 mov eax,1
66/B8/1/0 mov ax,1

Для получения любой 16-битной операции (регистр - это r16, а память - WORD PTR) нужно добавить &H66 перед 32-битной.

Скачай LASM IDE из раздела проектов. Он после компиляции покажет опкоды для каждой операции.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 4:45

BP писал(а):66 - это 16-битный расширитель 32-битной операции.
B8/1/0/0/0 mov eax,1
66/B8/1/0 mov ax,1
Для получения любой 16-битной операции (регистр - это r16, а память - WORD PTR) нужно добавить &H66 перед 32-битной.

Верно! Вона как меня переклинило. :)
Скачай LASM IDE из раздела проектов. Он после компиляции покажет опкоды для каждой операции.

Да не, спасибо, вроде всё устаканилось. Просто, спать надо чаще.
Кстати, рекомендую пользоваться вот этим:
http://www.apnet.ru/download/design/mob ... 319101.PDF
С уважением, Approximator.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.08.2004 (Вт) 8:52

Во! Супер! То, что давно искал :)
Со своей стороны поделюсь quick reference card'ом :)
Вложения
pentium.zip
Intel OpCodes
(16.28 Кб) Скачиваний: 120
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 18.08.2004 (Ср) 1:23

GSerg писал(а):Во! Супер! То, что давно искал :)

Полный мануал скачал? А то я привёл ссылку только на второй том.
:) Вот ссылки на первый и третий, чтобы всё было до кучи:
http://developer.intel.ru/download/desi ... 319001.PDF
http://www.apnet.ru/download/design/mob ... 319201.pdf
А вот это, похоже (не читал подробно, так, пробежал по диагонали), то же самое, но обновлённое:
http://developer.intel.ru/download/desi ... 366515.pdf
http://developer.intel.ru/download/desi ... 366615.pdf
http://developer.intel.ru/download/desi ... 366715.pdf
http://developer.intel.ru/download/desi ... 366815.pdf
Со своей стороны поделюсь quick reference card'ом :)

Спасибо. :)
С уважением, Approximator.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 34

    TopList  
cron