|
|
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Всем добрый день, не подскажите, как изменить код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. чтобы он не выдавал ошибки в случае x64-сборки (First chance exception at $0000000000431B82. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.) ЗС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 19:29 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
И при чем тут умножение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 19:40 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
И я бы даже спросил "и причем тут asm?" Дабы приведенный код явно не ассемблер, а скорее что-то паскале-подобное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 19:42 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Возможно, могу добавить только, что проблема в строке mov [ecx],edx , само умножение mul edx по крайней мере не выдает исключения. Директивы компилятора просто забыл удалить, извиняюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 20:06 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Я добрый: Тынц http://docwiki.embarcadero.com/RADStudio/Seattle/en/Procedures_and_Functions#Calling_Conventions Тынц http://docwiki.embarcadero.com/RADStudio/Seattle/en/Using_Inline_Assembly_Code 32-bit In general, the rules of register use in an asm statement are the same as those of an external procedure or function. An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers. On entry to an asm statement, EBP points to the current stack frame and ESP points to the top of the stack. Except for ESP and EBP, an asm statement can assume nothing about register contents on entry to the statement. 64-bit In line with the x64 Application Binary Interface (ABI), the contents of the following registers must be preserved and restored within inline assembly functions: R12, R13, R14, R15, RDI, RSI, RBX, RBP, RSP, XMM4, XMM5, XMM6, XMM7, XMM8, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, and XMM15. The first four parameters to inline assembler functions are passed via RCX, RDX, R8, and R9 respectively, except for floating-point arguments which use XMMO, XMM1, XMM2, XMM3. The math coprocessor is not normally used from x64 code. Registers used for function parameters can be modified freely. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 20:16 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
kopievВозможно, могу добавить только, что проблема в строке mov [ecx],edx , само умножение mul edx по крайней мере не выдает исключения. Директивы компилятора просто забыл удалить, извиняюсь. Правильный ответ заключается в двух словах "calling_conventions". Что это такое - ты должен знать. Выданных мною ссылок достаточно? Не понимаю, какой смысл в такой сложной конструкции. Чем просто a*b не подошло? Да и я бы сказал, писать in line assembler и явно не указать calling_conventions это на мой взгляд дурной тон. Я сильно тупил, когда такой код увидел без явного указания register calling conventions ))). Я конечно понимаю, что он по умолчанию такой, но вдруг кто умолчания в компиляторе изменит... и все... в общем, дурной тон IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 20:21 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Написал такую вещь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Конечно не гениально, но работает. Дизассемблирование не помогло, для этой же функции, например (х64): Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2015, 22:58 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Исключение происходило внутри функции, то есть возможно, что все дело в других регистрах в случае х64 после mul : Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2015, 02:04 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
kopiev, тебе же уже Leonid Kudryavtsev сказал ответ копай "calling_conventions", в win64 она всего одна должна применяться, PS: а вообще регистр адреса 64-битный, это rcx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2015, 07:06 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Я уже ссылку дал и под спойлер текст для 64 bit загнал. Адрес (третий параметр) у него должен быть в r8. Это так же и из ассемблерного кода видно. kopiev, Ну и молодец (на полном серьезе). Примерно так и оставить, мне только aux_lo := aux_lo - aux_hi shl 32; глаза режет. Т.к.: 1. Оно вообще не нужно. Приведение типа к (DWORD) само младшую часть и выделит. 2. AFAIK Обычно такие вещи общепринято делать через "двоичное И", наверное в Delph это and: lo := value and 0xFFFFFFFF; ну или как-то так Какая нафиг оптимизация, когда у тебя одна операция умножения? Что Вы там оптимизируете? Во многих случаях, компилятор значительно более эффективный код сделает, т.к. авторы компиляторов обычно лучше знают правила и рекомендации Intel по написанию кода. Случайно вставив ассемблерную инструкцию которая даст "пенальти" или "промах" можно резко затормозить процессор на десятки тактов. Т.ч. все "улучшения" окажутся просто вредны. Кроме того, если ф-цию сделать inline (наверняка Delphi это умеет), то компилятор сможет и окружающий код в точке ее вызова оптимизировать. Если так уж хочется на ассемблере (что глупо и дико), то должно выглядить как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как-то так. Понятное дело не проверял. Возможны ошибки. Скорее всего "dword ptr" вообще не нужен, т.к. размер задаст edx. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2015, 12:55 |
|
||
|
Умножение в ASM для x64-сборки
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev Если так уж хочется на ассемблере (что глупо и дико), то должно выглядить как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Как-то так. Понятное дело не проверял. Возможны ошибки. Скорее всего "dword ptr" вообще не нужен, т.к. размер задаст edx. Не правильно.Parameters less than 64 bits long are not zero extended; the high bits are not zeroed ecx = a, edx = b, при этом старшие биты rcx,rdx не определены... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2015, 15:44 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39129650&tid=1340853]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 484ms |

| 0 / 0 |
