Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Ассемблерные вставки и переносимость кода   Найти похожие ветки 

 
oxffff ©   (2012-06-14 12:23) [40]


> Саш, предлагаю на MSIL написать тоже самое.


С условием того, что код должен остаться safe.


 
Rouse_ ©   (2012-06-14 12:23) [41]


> Саш, предлагаю на MSIL написать тоже самое.

А зачем, когда есть типизированные указатели? :)


 
Rouse_ ©   (2012-06-14 12:24) [42]


> С условием того, что код должен остаться safe.

см. [24]
В моих задачах это не актуально :)


 
oxffff ©   (2012-06-14 12:25) [43]


> А зачем, когда есть типизированные указатели? :)


А еще лучше когда к ним есть еще и по 50 грамм. :)))


 
Ega23 ©   (2012-06-14 12:29) [44]


> А еще лучше когда к ним есть еще и по 50 грамм. :)))


Это намёк?


 
oxffff ©   (2012-06-14 12:30) [45]


> Ega23 ©   (14.06.12 12:29) [44]


Не вопрос. :)


 
Rouse_ ©   (2012-06-14 12:34) [46]


> А еще лучше когда к ним есть еще и по 50 грамм. :)))

Да под шашлычек :)

Ладно, дабы добить тему про типизированные указатели.


> KSergey ©  


Одно из самых пестрых преимуществ типизированных указателей проявляется когда мы работаем с указателями на массив структур (record). Перемещение по массиву производится обычным инкрементом/декрементом указателя, выборка данных разыменованием типизированного указателя. В этот момент нам не надо задумываться о оффсетах на нужный нам блок данных в рекорде, этим на автомате занимается компилятор. Казалось-бы мелочь, но многие в такую мелочь абсолютно не вникают и не пользуются данной возможностью...


 
Rouse_ ©   (2012-06-14 12:39) [47]

... при чем данная возможность (ну по крайней мере под известными мне асмами) всегда была в виде assume, высокоуровневых же языках assume стал гораздо удобным :)


 
Дмитрий С ©   (2012-06-14 12:47) [48]


> многие в такую мелочь абсолютно не вникают и не пользуются
> данной возможностью...
>

А мне кажется наоборот, что многие даже не задумываются что происходит, работает и работает. Особенно учитывая, что дельфи разыменовывает указатель даже без ^.


 
Омлет ©   (2012-06-14 12:50) [49]

> Rouse_ ©   (14.06.12 12:34) [46]

Кроме inc(p), ещё удобны sizeof(p^) и with p^ do для работы со структурами.


 
Anatoly Podgoretsky ©   (2012-06-14 12:56) [50]

> oxffff  (14.06.2012 12:25:43)  [43]

А лучше по 100


 
Rouse_ ©   (2012-06-14 12:58) [51]


> Особенно учитывая, что дельфи разыменовывает указатель даже
> без ^.

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


> Омлет ©   (14.06.12 12:50) [49]

Ну в принципе да, но это уже третьестепенного плана удобство (имхо) :)


 
Дмитрий С ©   (2012-06-14 13:07) [52]


> Кроме inc(p), ещё удобны sizeof(p^) и with p^ do для работы
> со структурами.

Мне больше нравится:
var
 x: array of ...
 y: string;

...
SizeOf(x[0])
SizeOf(y[0])


 
Омлет ©   (2012-06-14 13:16) [53]

> третьестепенного плана удобство

Да точно такое же - не надо приводить/указывать типы.
Для нетипизированного:
inc(NativeInt(p), sizeof(TMyMegaSuperRec))
sizeof(TMyMegaSuperRec)
with PMyMegaSuperRec(p)^ do


Для типизированного:
inc(p)
sizeof(p^)
with p^ do


Т.е. для типизированных указателей: меньше кода, код проще и понятнее, меньше шансов на ошибку. Но приходится под каждый тип указателя заводить свою переменную, что не всегда удобно.

> Дмитрий С ©   (14.06.12 13:07) [52]
> Мне больше нравится:
> SizeOf(x[0])


И причем тут указатели?


 
Омлет ©   (2012-06-14 13:23) [54]

А ещё в D2009 появилась директива POINTERMATH.
http://blogs.embarcadero.com/abauer/2008/01/24/38852


 
Дмитрий С ©   (2012-06-14 13:23) [55]


> И причем тут указатели?

А по твоему строки и динамические массивы это не указатели?


 
Омлет ©   (2012-06-14 13:30) [56]


> А по твоему строки и динамические массивы это не указатели?

Да, по-моему, это не указатели.


 
Anatoly Podgoretsky ©   (2012-06-14 13:39) [57]

Самы что ни на есть указатели, там переменная не сам массив, а указатель на массив, в отличии от статических. Вся кузня скрыта.


 
KSergey ©   (2012-06-14 14:44) [58]

> Rouse_ ©   (14.06.12 12:34) [46]
> Одно из самых пестрых преимуществ типизированных указателей
> проявляется когда мы работаем с указателями на массив структур  (record).

Продолжаешь нести ахинею по поводу того, что соль лучше сахара тем, что она соленая.
Я прямо удивлен весь.

> Rouse_ ©   (14.06.12 12:09) [36]
> function IncPointer(Value: Pointer): Pointer; overload;
> asm
>  inc eax
> end;

И где здесь инкремент нетипизированного указателя?
Ну и переносимость кода опять выше всяких похвал.

Впрочем, упорное повторение фразы "мне в моих проектах..." уже мне все пояснила.
Спасибо, я понял.

Продолжайте вариться в своём котле.


 
Cobalt ©   (2012-06-14 14:57) [59]

Саш, а вот расскажи по x32 - x64
Я сам ассемблером с 1-го курса технаря не занимался, потому мне интересно:
допустим, есть asm-процедура типа
function IncValue(Value: Integer): Integer; overload;
asm
inc eax
end;

скажи, при переходе на x64 что изменится?


 
Rouse_ ©   (2012-06-14 15:17) [60]


> Продолжаешь нести ахинею по поводу того, что соль лучше
> сахара тем, что она соленая.
> Я прямо удивлен весь.

О даже как :)
Ну что ж, давай по полкам, расскажи мне где ты тут ахинею нашел? :)
Ты только не отмалчивайся с видом знатока, а по пунктикам разжуй, мол вот тут не правильно и тут, потому что...


> И где здесь инкремент нетипизированного указателя?

он прямо перед тобой. Покажи мне где тут его нет?


> Ну и переносимость кода опять выше всяких похвал.

Ты не стесняйся и расскажи мне, под что ты собрался код на дельфи переносить? А то я только и слышу про переносимость, но ничего конкретного акромя что оно не переносимо я так и не услышал.


> Продолжайте вариться в своём котле.

А вот хамить не стоит.


 
Rouse_ ©   (2012-06-14 15:20) [61]


> скажи, при переходе на x64 что изменится?

у меня нет под рукой 64 бит компилера, но в зависимости от размера, либо останется как есть, либо нужно будет переписать данный конкретный пример как
function IncValue(Value: Integer): Integer; overload;
asm
inc rax
end;


 
MBo ©   (2012-06-14 15:30) [62]

первый параметр теперь rcx, но возврат функции - rax

Calling conventions. Delphi x64 supports only single calling convention - Microsoft x64 calling convention (first 4 parameters passed on rcx/xmm0; rdx/xmm1, r8/xmm2, r9/xmm3). All other conventions, like stdcall, pascal are synonyms for this one.

The registers RCX, RDX, R8, R9 are used for integer and pointer arguments (in that order left to right), and XMM0, XMM1, XMM2, XMM3 are used for floating point arguments. Additional arguments are pushed onto the stack (right to left). Integer return values (similar to x86) are returned in RAX if 64 bits or less. Floating point return values are returned in XMM0. Parameters less than 64 bits long are not zero extended; the high bits contain garbage.


 
Rouse_ ©   (2012-06-14 15:38) [63]


> MBo ©   (14.06.12 15:30) [62]
>
> первый параметр теперь rcx, но возврат функции - rax

О, нюанс... но как я и говорил 64 бит у меня нет, поэтому спецификацию еще не изучал.
С учетом нюанса тогда:

function IncValue(Value: Integer): Integer; overload;
asm
 lea rax, [rcx + 1]
end;


 
Anatoly Podgoretsky ©   (2012-06-14 15:39) [64]

> Rouse_  (14.06.2012 15:20:01)  [61]

Не так

asm
{$ifdef} Флаг64бит
  inc rax
else
  inc eax
endif
end;


 
KSergey ©   (2012-06-14 15:41) [65]

> Rouse_ ©   (14.06.12 15:17) [60]

Как это можно объяснить человеку, который не видит разницу между регистром процессора и указателем? почему регистр увеличивается именно на 1 - тоже не понятно, кстати.
Да еще приводит нетипизированный указатель к типизированному, упорно делая вид, что этого нет.

Александр, уверен, ты все понимаешь, но зачем-то не желаешь признать специфичную трактовку тобою терминов.
Зачем ты это делаешь - мне не понять.

> Rouse_ ©   (14.06.12 15:20) [61]

Integer на x64 платформе - 32-х битное. (если честно, именно про дельфи не сумел найти инфу; вдруг возбладает разум и Integer в дельфи таки 64-х битный будет? но надежды мало).
Лично мне философия этого совершенно не ясна, тем более, что я отлично помню, как ЮЗ на этом форуме писал, что когда в микропроцессорах Integer не будет равен размеру указателя - мир перевернется. И я с ним был горячо согласен.
Как жить дальше - и не знаю.


 
KSergey ©   (2012-06-14 15:42) [66]

> MBo ©   (14.06.12 15:30) [62]

Вау! Все еще лучше с переносимостью оказалось.


 
Rouse_ ©   (2012-06-14 15:52) [67]


> Как это можно объяснить человеку, который не видит разницу
> между регистром процессора и указателем?

В 32 битных системах? Расскажи мне разницу.


> почему регистр увеличивается именно на 1 - тоже не понятно,
>  кстати.

Ты видимо специально выдираешь слова из контекста. Я кажется даже прокоментировал данный код, а именно:


> Если бы я захотел решить инкремент самого пойнтера, то мне
> пришлось бы обойти ограничение накладываемое компилером,
>  ну что-то вроде:

И там-же два варианта инкремента, используй любой из них, почему выбрал первый и его обсуждаешь - мне не понять.


> Да еще приводит нетипизированный указатель к типизированному,
>  упорно делая вид, что этого нет.

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


> не желаешь признать специфичную трактовку тобою терминов.

Я не желаю признавать голословных утверждений.
Ты не ответил ни на один из поставленных мной вопросов, зачем то начал опять не с того, что я спросил в [60].

Все что я услышал из твоих заявлений это:
1. соль лучше сахара тем, что она соленая.
2. с нетипизироваными указателями операции инкремента/декремента просто неприменимы.
3. у полностью и категорично везде не прав.

Это все что я услышал.

Я же пример примеры и разьяснения с разжовыванием и опять оказываюсь не прав по твоей логике. Что-то тут не так...


 
KSergey ©   (2012-06-14 15:52) [68]

В общем преимуществ у нетипизированных указателей перед типизированными - нет.
Есть просто операции, которые применимы к только к одному, но не применимы к другому типу указателей. Но называть это "преимуществами" вообще - странно.

Собственно я уже выяснил для себя заботящую меня суть вопроса: она оказалась в терминологии. Результат вполне нормальный, он все объясняет. (При этом не имеет положительной или отрицательной окраски!)


 
Rouse_ ©   (2012-06-14 15:54) [69]


> Anatoly Podgoretsky ©   (14.06.12 15:39) [64]

Тогда уж лучше:
function IncValue(Value: Integer): Integer;
asm
 {$IFDEF CPUX64}
 lea rax, [rcx + 1]
 {$ELSE}
 inc eax
 {$ENDIF}
end;


 
ProgRAMmer Dimonych ©   (2012-06-14 15:56) [70]

> [68] KSergey ©   (14.06.12 15:52)
> В общем преимуществ у нетипизированных указателей перед
> типизированными - нет.

Тогда зачем они оставлены в языке? Почему не убрать Pointer насовсем?


 
Rouse_ ©   (2012-06-14 16:01) [71]


> В общем преимуществ у нетипизированных указателей перед
> типизированными - нет.

Ну блин, задаешь один вопрос, отвечаешь вообще на другой.


> KSergey ©   (14.06.12 10:00)
> 2. С интересом прочитал бы размышления участников форума
> относительно преимуществ типизированных указателей над нетипизированными


 
KSergey ©   (2012-06-14 16:01) [72]

> Rouse_ ©   (14.06.12 15:52) [67]
> > между регистром процессора и указателем?
> В 32 битных системах? Расскажи мне разницу.

Ага, уже пошли уточнения, уже хорошо.
Разница проста: у процессора - есть регистры, но нет указателей.
В Дельфи - нет регистров (хотя это спорно, вроде есть зарезервированные переменные, привязанные к регистрам процессора? или я путаюсь?), но есть указатели.
Вот и вся разница.

> Ну так ты же ничего не говорил о приведении, а теперь начинаешь
> оправдываться что мол это я виноват, как-же так я же сжульничал.

Предлагаю прекратить клоунаду, на которую, к слову, указали несколько участников.

Относительно недоговоренностей - кто бы говорил ;) Исходные вопросы кишели таковыми. Что, собственно, и выяснилось в ходе этой ветки и прояснило видение участвующих, что, как я уже писал, вполне годный результат.

2. с нетипизироваными указателями операции инкремента/декремента просто неприменимы.

Искренне надеюсь, что ты не будешь с этим спорить.
Если же снова начнешь указывать на приведенные примеры - то мне ответить нечего. Посылать учить матчасть - как бы несерьезно в данном случае, ибо, уверен, ты понимаешь, что жульничаешь. А вот упортсва в этом - мне действительно не понять.


 
KSergey ©   (2012-06-14 16:08) [73]

> ProgRAMmer Dimonych ©   (14.06.12 15:56) [70]
> Тогда зачем они оставлены в языке? Почему не убрать Pointer насовсем?

Pointer удобно использовать для передачи указателя на "универсальный контент" (во всяких call-back функциях, к примеру), т.к. его можно присваивать любому типизированному указателю. Ну и случайно не заинкрементируешь по дороге, опять же удобно.


 
Rouse_ ©   (2012-06-14 16:09) [74]


> Вот и вся разница.

А в чем разница?


> Предлагаю прекратить клоунаду, на которую, к слову, указали
> несколько участников.

Если ты про Серегу, то он правильно сказал, только с учетом того что мы пишем переносимый код, о которым ты говоришь. На что я и попросил уточнить, о какой переносимости идет речь, если ее на данный момент в Дельфи, до ХЕ включительно, нет? Т.е. весь разговор свелся к некой мифической необходимости, возможности для осуществения которой отсутствуют.


> Исходные вопросы кишели таковыми. Что, собственно, и выяснилось
> в ходе этой ветки и прояснило видение участвующих, что,
> как я уже писал, вполне годный результат.

Щас еще раз специально перечитал ту ветки - чей-то не нашел, уточни...


> Искренне надеюсь, что ты не будешь с этим спорить.

Спорить с чем? Если бы ты сказал что компилятор не позволяет проводить операции инкремента/декремента над нетипизированными указателями, то конечно бы не спорил, ибо это так.
Ты же сказал что такие операции не применимы, т.е. не делаются, нельзя, табу, не заработает. С этим конечно стоит спорить, а почему-бы и нет?


 
KSergey ©   (2012-06-14 16:11) [75]

> Rouse_ ©   (14.06.12 16:01) [71]
>
> > В общем преимуществ у нетипизированных указателей перед
>
> > типизированными - нет.
>
> Ну блин, задаешь один вопрос, отвечаешь вообще на другой.
>  
> > KSergey ©   (14.06.12 10:00)
> > 2. С интересом прочитал бы размышления участников форума
>
> > относительно преимуществ типизированных указателей над нетипизированными

Родной, ты понимать умеешь написанное?
Специально для тебя:

В общем преимуществ у [b]типизированных[/b] указателей перед [b]ytтипизированными[/b] - нет.
Есть просто операции, которые применимы к только к одному, но не применимы к другому типу указателей. Но называть это "преимуществами" вообще - странно.


 
Anatoly Podgoretsky ©   (2012-06-14 16:14) [76]

> Rouse_  (14.06.2012 15:54:09)  [69]

Конечно, я не стал поправляться после твоего код и не видел еще модели
вызова, у меня ведь тоже нет XE2,
но суть то в том, что бы обвешать Ифами


 
ProgRAMmer Dimonych ©   (2012-06-14 16:15) [77]

> [73] KSergey ©   (14.06.12 16:08)
> > ProgRAMmer Dimonych ©   (14.06.12 15:56) [70]
> > Тогда зачем они оставлены в языке? Почему не убрать Pointer
> насовсем?
>
> Pointer удобно использовать для передачи указателя на "универсальный
> контент" (во всяких call-back функциях, к примеру), т.к.
> его можно присваивать любому типизированному указателю.
> Ну и случайно не заинкрементируешь по дороге, опять же удобно.

Т.е. для определённых ситуаций преимущества всё же есть? Компромиссный вариант: есть свойства, которые в той или иной ситуации становятся преимуществами ил недостатками.


 
Rouse_ ©   (2012-06-14 16:17) [78]


> Родной, ты понимать умеешь написанное?
> Специально для тебя:

Я же тебе сказал - не хами, не стоит...


> В общем преимуществ у [b]типизированных[/b] указателей перед
> [b]ytтипизированными[/b] - нет.

Печально что ты так все видишь.
Типизированный указатель в отличие от типизированного имеет размер на который опирается new/dispose, инкрементируем, предоставляет возможность автоматического рассчета оффсетоф. Но это как я понял в твоем понимании соль, которая соленая. А так-то в принципе да - разницы нет...


 
Rouse_ ©   (2012-06-14 16:18) [79]


> в отличие от нетипизированного


 
Дмитрий С ©   (2012-06-14 16:19) [80]

Вот интересно:

asm
 mov ebx, [eax]
end;

Регистр, в данном случае, указатель или нет? :)



Страницы: 1 2 3 4 5 6 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.092 c
15-1352320203
Юрий
2012-11-08 00:30
2013.03.22
С днем рождения ! 8 ноября 2012 четверг


15-1342010746
alexdn
2012-07-11 16:45
2013.03.22
java скрипт


2-1346605328
ankazh
2012-09-02 21:02
2013.03.22
DBGrid и UNION


15-1332459005
Юрий
2012-03-23 03:30
2013.03.22
С днем рождения ! 23 марта 2012 пятница


15-1352816598
mfender
2012-11-13 18:23
2013.03.22
Fatal error. Не создаётся .dcu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский