|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
Результаты опроса: Delphi Xe2, что скажите? | |||
Супер. | 5 | 25.00% | |
Нравится. | 4 | 20.00% | |
Не нравится. | 0 | 0% | |
Ужас. | 1 | 5.00% | |
Лучше чем Delphi 7, ненайти. | 7 | 35.00% | |
Другое. | 3 | 15.00% | |
Голосовавшие: 20. Вы еще не голосовали в этом опросе |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
По сути ассемблер для х64 отличается тем, что в нем есть qword (и регистры вроде с приставкой "r" - "rax, rbx, rdx...") и еще несколько новых команд, остальное все то же самое.
http://www.wasm.ru/forum/viewtopic.php?id=22744 Последний раз редактировалось M.A.D.M.A.N., 09.06.2012 в 11:27. |
#17
|
||||
|
||||
Ассемблер - не самое главное, ИМХО, структра экзешника тож наверное отличается.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#18
|
||||
|
||||
Цитата:
Если пойдет дальше пойдет, то можно будет создавать новый раздел форума "Delphi X64". |
#19
|
||||
|
||||
Цитата:
Только что проверил - в своей х64 оси использовал х32 код: Код:
use32 mov eax, 1 mov ebx, eax cmp eax, ebx test eax, eax add ebx, ecx mov eax, 1024*1024-4 mov [eax], ebx Выполнилось без ошибок. Из того что помню разница в push и pop: push 4 байт заменен на соответствующий push 8 байт. А вот структура екзешника отличается, насколько я знаю: там указывается битность. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 09.06.2012 в 12:28. |
#20
|
||||
|
||||
Цитата:
|
#21
|
||||
|
||||
Про программные скобки.
Код:
procedure DivMod(Dividend: UInt64; Divisor: UInt64; var Result, Remainder: UInt64); overload; {$IF DEFINED(CPUX64) and NOT DEFINED(PUREPASCAL_X64)} asm MOV R10,RDX MOV RAX,RCX XOR EDX,EDX DIV R10 MOV [R8],RAX MOV [R9],RDX end; {$ELSEIF DEFINED(CPUX86) and NOT DEFINED(PUREPASCAL)} // Merged from system __lludiv and __llumod asm PUSH EBX PUSH ESI PUSH EDI PUSH EAX PUSH EDX // // Now the stack looks something like this: // // 40[esp]: Dividend(high dword) // 36[esp]: Dividend(low dword) // 32[esp]: divisor (high dword) // 28[esp]: divisor (low dword) // 24[esp]: return EIP // 20[esp]: previous EBP // 16[esp]: previous EBX // 12[esp]: previous ESI // 8[esp]: previous EDI // 4[esp]: previous EAX Result ptr // [esp]: previous EDX Remainder ptr // MOV EBX,28[ESP] // get the divisor low word MOV ECX,32[ESP] // get the divisor high word MOV EAX,36[ESP] // get the dividend low word MOV EDX,40[ESP] // get the dividend high word OR ECX,ECX JNZ @DivMod64@slow_ldiv // both high words are zero OR EDX,EDX JZ @DivMod64@quick_ldiv OR EBX,EBX JZ @DivMod64@quick_ldiv // if ecx:ebx == 0 force a zero divide // we don't expect this to actually // work @DivMod64@slow_ldiv: MOV EBP,ECX MOV ECX,64 // shift counter XOR EDI,EDI // fake a 64 bit dividend XOR ESI,ESI // @DivMod64@xloop: SHL EAX,1 // shift dividend left one bit RCL EDX,1 RCL ESI,1 RCL EDI,1 CMP EDI,EBP // dividend larger? JB @DivMod64@nosub JA @DivMod64@subtract CMP ESI,EBX // maybe JB @DivMod64@nosub @DivMod64@subtract: SUB ESI,EBX SBB EDI,EBP // subtract the divisor INC EAX // build quotient @DivMod64@nosub: LOOP @DivMod64@xloop // // When done with the loop the four registers values' look like: // // | edi | esi | edx | eax | // | remainder | quotient | // JMP @DivMod64@finish @DivMod64@quick_ldiv: DIV EBX // unsigned divide MOV ESI,EDX XOR EDX,EDX XOR EDI,EDI @DivMod64@finish: POP EBX POP ECX MOV [EBX],ESI MOV [EBX+4],EDI MOV [ECX],EAX MOV [ECX+4],EDX POP EDI POP ESI POP EBX end; {$ELSE PUREPASCAL} begin Result := Dividend div Divisor; Remainder := Dividend mod Divisor; end; {$IFEND} Можете объяснить, как этот кусочек работает? И для какой он х32 или х64 или для обоих сразу. Последний раз редактировалось ined, 09.06.2012 в 13:08. |
#22
|
||||
|
||||
Для обоих. Написано 2 кода на ассемблере, один используется при компиляции в х64 (первый), другой - для х32 (второй). Выбор делается директивами компилятору {$IF...}, {$ELSEIF...}
jmp $ ; Happy End! The Cake Is A Lie. |
#23
|
||||
|
||||
Цитата:
|
#24
|
||||
|
||||
Использую в основном FASM, VS10 и GCC. Делфи "на всякий случай" стоит седьмая. По ХЕ2 - юзал одно время, не впечатлило.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#25
|
||||
|
||||
Ну дельфи вроде как язык высоко уровня, так, что АСМ в дельфи -- это либо понты, либо крайняя необходимость.
|
#26
|
||||
|
||||
Цитата:
Феникс, а как же масм? Последний раз редактировалось M.A.D.M.A.N., 09.06.2012 в 15:13. |
#27
|
||||
|
||||
По XE2 мне в частности не понравилось то, что многие юниты стали вида System.Graphics (или как-то так), в результате чего многие старые вещи компилятся с трудом.
M.A.D.M.A.N., масм не соответствует религии. А если серьёзно - я считаю FASM на порядок удобнее и логичнее масма. Примерно наравне идет NASM, третьим я бы поставил TASM, а MASM - последним. Ну и я чуть-чуть посодействовал Фениксу в выборе асмы. А асм в делфи - не понты. Его ж очень активно используют в стандартных юнитах, чтобы самые широко юзаемые функции ускорить. jmp $ ; Happy End! The Cake Is A Lie. |
#28
|
||||
|
||||
Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#29
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#30
|
||||
|
||||
Странно. И больше никаких вопросов по Delphi Xe2 ни у кого не возникает?
|