![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 байт. А вот структура екзешника отличается, насколько я знаю: там указывается битность. Последний раз редактировалось 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...}
|
|
#23
|
||||
|
||||
|
Цитата:
|
|
#24
|
||||
|
||||
|
Использую в основном FASM, VS10 и GCC. Делфи "на всякий случай" стоит седьмая. По ХЕ2 - юзал одно время, не впечатлило.
|
|
#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 - последним. Ну и я чуть-чуть посодействовал Фениксу в выборе асмы. ![]() А асм в делфи - не понты. Его ж очень активно используют в стандартных юнитах, чтобы самые широко юзаемые функции ускорить. |
|
#28
|
||||
|
||||
|
Цитата:
|
|
#29
|
||||
|
||||
|
Цитата:
|
|
#30
|
||||
|
||||
|
Странно. И больше никаких вопросов по Delphi Xe2 ни у кого не возникает?
|