|
|
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Существуют ли программисты, помнящие ASM? )) Столкнулись с проблемой: в Delphi нет подобной функции, есть IntToStr, но на выходе string. В большом проекте нужен именно PChar. На С++ это itoa, atoi. Сделал костыль из стандартной IntToStr путём комментирования функции задела строки и дёргаю в наглую после выхода из неё по указателю шмат памяти: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Тоже самое для int64 и overlode. Если кому пригодиться, могу скинуть для int64. Функцию __CvtInt тоже пришлось перетянуть из сорцов делфи). Мне не понравилось это решение. Нашёл 2 исходника на асм по такой же задаче для int и int64, единственное - использовались регистры ax,bx,cx... и т д. и генерился 16 битный код. Могу скинуть также оба исходника и ссыль на них. Так вот суть вопроса: найденая вставочка int в дельфе отрабатывает на ура, быстрее чем костыльный вариант. Но с int64 возникли трудности. я не мастер asmа, но чую не так я записываю в стек или перемещаю указатель. Вот исходник со статьи: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. Моя переделка заключалась в замене всех основных регистров на 32х битные, то есть ax на eax, bx на ebx и т д. так как 16 битный дельфа строить отказывается. Если надо скину переделку. Дельфа зацикливается при делении числа на 10 и записи остатка. Пока стек не кончится)) где я косячу? Данный код работает в asm - проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 18:36 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
компилятор дельфи такой страшный код генерит, что на асме писать нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 18:53 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Нет) Можно и обойтись средствами Делфи. Важна скорость, это ключевой момент. большие объёмы данных, много расчётов. Поэтому прибегли к АСМ. Для примера нагрузочных тестов 100 000 000 преобразований на каждом ядре: Функциями дельфи - профит -0,38, процент скорости - 30% Костыльный вариант - профит +0,75, процент скорости - 81% Самодел из взятых исходников - профит -0,95, процент скорости - 90% Это если чисто int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 19:02 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Midgard90Но с int64 возникли трудности. я не мастер asmа, но чую не так я записываю в стек или перемещаю указатель. Дельфи x64 использует Microsoft's Win64 calling convention соответственно первые 4 параметра - RCX,RDX,R8,R9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 19:29 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Спасибо за инфу, но немного не то. Речь идёт о Delphi x32 (Delphi 7). Судя по их исходникам с asm в те года 64е регистры были мечтой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 20:08 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Midgard90, так где лыжи не едут - в x86 ? что надо то - int64 в pchar? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 20:20 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Да, всё верно. Лыжи не ежут в старой Delphi 7, в асмовой вставке int64ToPChar. IntToPChar сработала на ура, сложностей не было - число ложится в регистр как есть. int64ToPChar - не как есть, как я понял это указатель в стеке, или не указатель, инфы не нарыл. видать из за этого я не правильно кладу старшую и младшую части, и из за этого соответственно кривит сам цикл деления на 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 20:44 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Midgard90int64ToPChar - не как есть, как я понял это указатель в стеке, или не указатель, инфы не нарыл. видать из за этого я не правильно кладу старшую и младшую части, и из за этого соответственно кривит сам цикл деления на 10 какой бы мусор на регистры не попал - зацикливаться ничего не должно, на выходе максимум 19 цифр. а команда div у интела изрядно косая. ничего хорошего из лобового деления edx:eax на 10 не получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 21:40 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
сколь неприятна процедура деления int64 на x86 - можно увидеть - http://www.jbox.dk/sanos/source/lib/lldiv.asm.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2017, 21:52 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Мысль понял, спасибо за совет!) Буду курить данный пример. Ещё раз благодарю за отзывчивость! Но вот кстати!) В исходных сорцах Делфи 7 похожий алгоритм на тот, что я нарыл. За исключением что я в стек кидаю остатки, а там как я понял в память сразу пишут. Но тоже div)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 00:20 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Midgard90, 1. Вместо деления но 10 можно умножать на обратный. 2. Вместо деления на 10 можно делить на 100 и брать из таблицы сразу 2 цифры. 3. Можно длинное число разбить на 2 куска и разбираться с каждым отдельно. 4. Можно срисовать код с современной Delphi и не мучиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 00:27 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Midgard90, может сначала попробовать Pascal-код? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. Если скорость не устроит, тогда уже переписывать на ассемблере. Изопропилкомпилятор дельфи такой страшный код генерит, что на асме писать нужно?Если Delphi-йский компилятор для кода типа «n mod 10 ... n div 10» генерирует 2 инструкции div, то да :). Aleksandr Sharahov3. Можно длинное число разбить на 2 куска и разбираться с каждым отдельно.Мне удалось разбить только на 3 части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 07:52 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЕсли Delphi-йский компилятор для кода типа «n mod 10 ... n div 10» генерирует 2 инструкции div, то да :). если немного подумать, а не переводить стрелки на компилятор, то легко понять, что есть алгоритм с одним делением: d:=n div 10; r:=n - d * 10; Пётр СедовМне удалось разбить только на 3 части. если проявить смекалку, например, перейти к беззнаковым числам и поработать со старшими битами и с обратными числами, то удается получить 2 части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 09:10 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Пётр Седов Код: pascal 1. 2. этого можно избежать изначально заполнив весь буфер нулями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 11:15 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovесли проявить смекалку многое можно сделать - без делений в цикле обойтись, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 11:48 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
ИзопропилAleksandr Sharahovесли проявить смекалку многое можно сделать - без делений в цикле обойтись, например. Можно пример как обойтись вообще без делений в цикле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 12:25 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, Благодарю! Примерно тоже самое и было сперва на дельфях писано, медленно) Но идея разбить на 2 куска и вызвать процедурку для простого уже intа - мне кажется будет выигрышной. Главное не запутаться с переходящим, дёрнуть заранее знак и склеить в конце 2 массива и их длины. сегодня попробую, вечером кину код) Всех благодарю за советы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 12:26 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Dima TИзопропилпропущено... многое можно сделать - без делений в цикле обойтись, например. Можно пример как обойтись вообще без делений в цикле? поделить можно один раз, а затем умножать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. дальше - переход к фиксированной точке, разделение на группы и т д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 13:27 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Не работает, погрешности преобразования double мешают Код: sql 1. Тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 13:42 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Если погрешность добавить, то вроде работает Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 13:51 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Преобразования double-int тоже не легкая операция. Затестил время, деление целых почти вдвое быстрее. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 14:13 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Ребята не гоните коней))) вещественные не нужны) и есть функция в дельфях вроде FloatToPChar если не ошибаюсь)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 14:27 |
|
||
|
IntToPChar на ASM для DELPHI
|
|||
|---|---|---|---|
|
#18+
Dima T, я же сразу сказал, что это только направление, реально нужно на фиксированную точку перевести придётся сделать )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2017, 14:29 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39380060&tid=1340523]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 383ms |

| 0 / 0 |
