Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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

 
KSergey ©   (2012-06-14 10:00) [0]

1. С интересом прочитал бы размышления Розыча и не только относительно переносимости кода с ассемблерными вставками.

2. С интересом прочитал бы размышления участников форума относительно преимуществ типизированных указателей над нетипизированными.


 
oxffff ©   (2012-06-14 10:14) [1]


> KSergey ©   (14.06.12 10:00) 


В чем вопрос по 2?


 
Rouse_ ©   (2012-06-14 10:15) [2]

А в чем проблема с переносимостью? :)
Если требуется жесткая привязка к асму (ну например потому что некоторые асм инструкции не вызываются напрямую как-то sysenter) то пишутся два аналога, помещающиеся под директивы компилятора. EAX меняем на RAX и вся не долга, или ты думаешь там все мудренее, чем кажется? :)
Другое дело если имеем конкретный 32 битный проект, который никто не собирается переводить на 64 бита, то проблема с переносимостью вообще банально высосана из пальца :)


 
Давайте будем жрать!   (2012-06-14 10:15) [3]


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


 
Ega23 ©   (2012-06-14 10:17) [4]


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



procedure TForm44.Button1Click(Sender: TObject);
var
 p1: PByte;
 p2: PWord;
 p3: PInteger;
begin
 p1 := nil;
 p2 := nil;
 p3 := nil;

 Inc(p1);
 Inc(p2);
 Inc(p3);

 ShowMessage(IntToStr(Integer(p1)) + " " + IntToStr(Integer(p2)) + " " + IntToStr(Integer(p3)));
end;


 
Давайте будем жрать!   (2012-06-14 10:18) [5]


> Ega23 ©   (14.06.12 10:17) [4]
Результат от директив компилятора зависит начиная (кажется) с XE.


 
Ega23 ©   (2012-06-14 10:22) [6]


> Результат от директив компилятора зависит начиная (кажется) с XE.


У меня нет ХЕ, ничего по этому поводу сказать не могу.


 
KSergey ©   (2012-06-14 10:27) [7]

> Ega23 ©   (14.06.12 10:17) [4]

Это отличие, вернее, это допустимые операции.
С нетипизироваными указателями операции инкремента/декремента (ну и т.п.) просто неприменимы.
Как можно просто наличие свойства называть преимуществом?

То, что соль соленая - это ее преимущество перед сахаром? так получается.


 
KSergey ©   (2012-06-14 10:28) [8]

> Давайте будем жрать!   (14.06.12 10:18) [5]
> Результат от директив компилятора зависит начиная (кажется)  с XE.

Конкретный результат (в цифрах) не важен сейчас.


 
KSergey ©   (2012-06-14 10:29) [9]

> Давайте будем жрать!   (14.06.12 10:15) [3]
> Вообще-то в первоначальной ветке вопрос ставился иначе.

Считаете, это принципиально?


 
KSergey ©   (2012-06-14 10:30) [10]

> oxffff ©   (14.06.12 10:14) [1]
> В чем вопрос по 2?

Да кабы я знал.
Вот так он был сформулирован Розычем. (Правда тут подсказывают, что с точностью до наоборот, но я не улавниваю разницы, признаться.)


 
KSergey ©   (2012-06-14 10:31) [11]

> Rouse_ ©   (14.06.12 10:15) [2]
> А в чем проблема с переносимостью? :)
> Если требуется жесткая привязка к асму (ну например потому
> что некоторые асм инструкции не вызываются напрямую как-
> то sysenter) то пишутся два аналога, помещающиеся под директивы
> компилятора. EAX меняем на RAX и вся не долга,

Это вот называется переносимость, я правильно понял?


 
Rouse_ ©   (2012-06-14 10:32) [12]


> Это отличие, вернее, это допустимые операции.

Это все что ты видишь ?:)


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

Да ну?
 P: Pointer;
begin
 P := PAnsiChar(P) + 100;


 
Rouse_ ©   (2012-06-14 10:34) [13]


> Это вот называется переносимость, я правильно понял?

Это поддержка 64 битных компиляторов.


 
KSergey ©   (2012-06-14 10:38) [14]

> Rouse_ ©   (14.06.12 10:32) [12]

Я правильно понимаю, что  + 100 применено к нетипизированному указателю?
Розыч, зачем ты пытаешься обмануть?


 
Rouse_ ©   (2012-06-14 10:39) [15]


> Я правильно понимаю, что  + 100 применено к нетипизированному
> указателю?

Я же даже тип указателя привел :)


 
KSergey ©   (2012-06-14 10:40) [16]

> Rouse_ ©   (14.06.12 10:34) [13]
> > Это вот называется переносимость, я правильно понял?
> Это поддержка 64 битных компиляторов.

Т.е. переписывание кода (а его придется внимательно переписать, т.к., очевидно, реальный код не ограничивается одной операцией сложения 2-х регистров) - это и называется "переносимость"?

Ну тогда речь о различном толковании терминов.

Это, кстати, одна из проблем собеседований бывает. Впрочем, любых так сказать "коммуникаций".


 
Давайте будем жрать!   (2012-06-14 10:42) [17]


> Считаете, это принципиально?
Ну, "там" было что-то вроде "преимущества т.у. над  н.т.у и наоборот", а в данной ветке получается, что преимущества нетипизированных над типизированными не обсуждаются — не то ввиду очевидности, не то ввиду отсутствия... По-моему, это довольно сильно меняет вопрос.


 
KSergey ©   (2012-06-14 10:42) [18]

> Rouse_ ©   (14.06.12 10:39) [15]
> Я же даже тип указателя привел

...к типу PAnsiChar

Розыч, я не понимаю зачем обманывать и выкручиваться?

Впрочем, пример про сложение на асме - это уже показательно было очень относительно, в частности, стиля собеседования в вашей компании. Да еще называние это "переносимым" кодом.


 
Rouse_ ©   (2012-06-14 10:44) [19]


>
> Т.е. переписывание кода (а его придется внимательно переписать,
>  т.к., очевидно, реальный код не ограничивается одной операцией
> сложения 2-х регистров) - это и называется "переносимость"?
>

Нет ты видимо не допонял. В рамках переносимости, код с асм вставками будет скомпилирован на любой дельфи начиная от двойки до хе2(в 32 битах) и FP. Тут проблем не будет. Если требуется поддержка другой разрядности, код естетсвенно должен дописыватся, по примеру того как это сделано в system.pas от этого никуда не уйти, а что ты хотел, тут ничего универсального но оптимизированного не придумать.


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

> Давайте будем жрать!   (14.06.12 10:42) [17]
> Ну, "там" было что-то вроде "преимущества т.у. над  н.т.
> у и наоборот", а в данной ветке получается, что преимущества
> нетипизированных над типизированными не обсуждаются

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


 
Rouse_ ©   (2012-06-14 10:46) [21]


> ...к типу PAnsiChar
>
> Розыч, я не понимаю зачем обманывать и выкручиваться?

Кто выкручивается? :) Ты сказал что к типизированным операция декремента не применяется - я показал что это не так :) То что инкремент был сделан через приедение,это значит я выкручиваюсь? Ты слишком большого мнения о бо мне :) Тем более данный пример можно написать и по другому, P := Pointer(DWORD(P) + 100) сути этого не поменяет. А вот то что ты до сих пор не сказал одно из явных достоинств типизированных указателей, меня мягко говоря смущает :)

По поводу асма не понял - что там и чего тебе показывает? Разжуй


 
KSergey ©   (2012-06-14 10:47) [22]

> Rouse_ ©   (14.06.12 10:44) [19]

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

Так что, надеюсь, настаивать на переносимости кода с асм. вставками - надеюсь настаивать ты не будешь больше.


 
KSergey ©   (2012-06-14 10:47) [23]

> Rouse_ ©   (14.06.12 10:46) [21]
> Кто выкручивается? :) Ты сказал что к типизированным операция
> декремента не применяется - я показал что это не так :)

Ты как раз показал, что это  - именно так.


 
Rouse_ ©   (2012-06-14 10:52) [24]


> Так что, надеюсь, настаивать на переносимости кода с асм.
>  вставками - надеюсь настаивать ты не будешь больше.

Что значит не буду? :) Ты кажется не улавливаешь мою специфику. Я в той ветке четко обозначил позицию, есть проект - под него пишется код. Есть блоки асм кода (очень много). Данный проект пережил миграцию с шестой дельфи по 2009-ую без правок асма. Ты же говоришь за некую универсальный код, который портируется куда угодно. Так вот это нам мало того что не нужно, так еще и экономически не выгодно, стало быть с какого перепуга я должен отказываться. Я же речь вел о приеме к нам на работу, где все я сно и понятно а не в некое непонятное сообщество любителей портируемого кода? :)


 
Rouse_ ©   (2012-06-14 10:55) [25]

Поэтому соответственно и при приеме на работу свободное владение асмом только приветствуется.


 
KSergey ©   (2012-06-14 11:18) [26]

> Rouse_ ©   (14.06.12 10:52) [24]
> Данный проект пережил миграцию с шестой дельфи по 2009-ую без правок  асма.

Т.е. "переносимый код" - это переносимый между версиями дельфи, причем снизу-вверх?!!

Н-да...

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


 
KSergey ©   (2012-06-14 11:18) [27]

Так что там с преимуществами?


 
oxffff ©   (2012-06-14 11:23) [28]


> Rouse_ ©   (14.06.12 10:32) [12]
>
> > Это отличие, вернее, это допустимые операции.
>
> Это все что ты видишь ?:)
>
>
> > С нетипизироваными указателями операции инкремента/декремента
>
> > (ну и т.п.) просто неприменимы.
>
> Да ну?
>  P: Pointer;
> begin
>  P := PAnsiChar(P) + 100;


Саша, не лукавь. Операция производится над типизированным указателем.


 
Rouse_ ©   (2012-06-14 11:33) [29]


> Т.е. "переносимый код" - это переносимый между версиями
> дельфи, причем снизу-вверх?!!

Нет, в моем понятии это код компилирующийся под любой процессор и любую операционную систему.
До XE включительно в дельфи такого кода нет. По поводу переносимости между процессорами я озвучил в первом-же посте, по поводу остального ты уперся рогом, причем не понятно что ты имеешь ввиду.


> Саша, не лукавь. Операция производится над типизированным
> указателем.

Ну хорошо я там пример привел второй, без типизированного указателя.


> Так что там с преимуществами?

Ну так это ты мне и скажи.


 
Anatoly Podgoretsky ©   (2012-06-14 11:39) [30]

> Rouse_  (14.06.2012 11:33:29)  [29]

Там тоже приведение, но уже к целому, а народ хочет без приведения


 
Rouse_ ©   (2012-06-14 11:42) [31]


> а народ хочет без приведения

Когда народ утверждал что инкрементить/декрементить нельзя он ничего не говорил о приведении :)


 
oxffff ©   (2012-06-14 11:57) [32]


> Ну хорошо я там пример привел второй, без типизированного
> указателя.


P := Pointer(DWORD(P) + 100)?

Где здесь применяется оператор + к типу pointer?


 
Rouse_ ©   (2012-06-14 12:01) [33]


> Где здесь применяется оператор + к типу pointer?

Здесь производится инкремент пойнтера через приведение, я разве где-то говорил что сам пойнтер можно инкрементировать?


 
oxffff ©   (2012-06-14 12:04) [34]


> Rouse_ ©   (14.06.12 12:01) [33]


В Rouse_ ©   (14.06.12 10:32) [12].


 
oxffff ©   (2012-06-14 12:09) [35]


> Здесь производится инкремент пойнтера через приведение,


Здесь приводится приведение к unsigned int, который увеличивается на 100, далее результат приводится к pointer. Это разные вещи.

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

В GC куче такие операции запрещены.


 
Rouse_ ©   (2012-06-14 12:09) [36]


>  oxffff ©   (14.06.12 12:04) [34]
> В Rouse_ ©   (14.06.12 10:32) [12].

А где я тут сказал? Процитируй.

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

function IncPointer(Value: Pointer): Pointer; overload;
asm
 inc eax
end;

function IncPointer(Value: Pointer; Size: Integer): Pointer; overload;
asm
 add eax, edx
end;


 
Rouse_ ©   (2012-06-14 12:11) [37]


> Здесь приводится приведение к unsigned int, который увеличивается
> на 100, далее результат приводится к pointer.

Не Серег, там производится именно инкремент нетипизированного указателя, пойнтера :) Т.е. решается вполне конкретная задача :) Все остальное риторика...


 
oxffff ©   (2012-06-14 12:17) [38]


> Rouse_ ©   (14.06.12 12:09) [36]
>
> >  oxffff ©   (14.06.12 12:04) [34]
> > В Rouse_ ©   (14.06.12 10:32) [12].
>
> А где я тут сказал? Процитируй.

Да ну, Саша.
Но тем не менее, понимаю тебя, поскольку ты человек который смотрит сквозь абстракции, но все же [35].


 
oxffff ©   (2012-06-14 12:21) [39]


> Rouse_ ©   (14.06.12 12:11) [37]
>
> > Здесь приводится приведение к unsigned int, который увеличивается
>
> > на 100, далее результат приводится к pointer.
>
> Не Серег, там производится именно инкремент нетипизированного
> указателя, пойнтера :) Т.е. решается вполне конкретная задача
> :) Все остальное риторика...


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


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


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


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



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.059 c
15-1343963444
Павиа
2012-08-03 07:10
2013.03.22
Калькулятор


15-1341492118
Unknown user
2012-07-05 16:41
2013.03.22
Определить или открыто главное меню


15-1344801222
Jeer
2012-08-12 23:53
2013.03.22
Как молоды мы были...


2-1340260017
StudyMySQL
2012-06-21 10:26
2013.03.22
Вопрос по MySQL


2-1329719235
Andrewtitoff
2012-02-20 10:27
2013.03.22
Путь к БД ADOConnection