64-битный привет Крис Касперски ака мыщъх Хакер, номер #083, стр. 083-118-8 .data mytit db 'PENUMBRA is awesome!', 0 mymsg db 'Hello World!', 0 ; секция кода с атрибутами по умолчанию (чтение и исполнение) .code Main: mov r9d, 0 ; uType = MB_OK lea r8, mytit ; LPCSTR lpCaption lea rdx, mymsg ; LPCSTR lpText mov rcx, 0 ; hWnd = HWND_DESKTOP call MessageBoxA mov ecx, eax ; uExitCode = MessageBox(...) call ExitProcess End Main Ассемблирование и линковка проходит так: ml64 XXX.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:main в результате чего образуется готовый к употреблению exe-файл с румяной поджаренной корочкой нашего ЦП (FASM ассемблирует намного быстрее). Примеры более сложных программ легко найти в Сети. Как показывает практика, запросы типа x86-64 [AMD64] assembler example катастрофически неэффективны и гораздо лучше использовать что-нибудь вроде mov rax. [заключение] Вот мы и познакомились с архитектурой x86-64! Здесь действительно есть место, где развернутся и чему поучиться! Насколько эти знания окажутся востребованы на практике - так сразу и не скажешь. У AMD есть хорошие шансы пошатнуть рынок, но ведь и Intel не дремлет, активно продвигая собственные 64-разрядные платформы, известные под общем именем IA64, но о них как-нибудь в другой раз. [переход в 64-разрдяный режим] В исходниках FreeBSD можно найти файл amd64_tramp.S, быстро и грязно переводящий процессор в 64-режим. Откомпилировав, его можно записать в boot-сектор, загружающий нашу собственную операционную систему (вы ведь пишите ее, правда?) или слинковать com-файл, запускаемый из реального x86-режима (для этого потребуется чистая MS-DOS безо всяких экстендеров). В общем, вариантов много. [перевод процессора в 64-разрядный режим] //$FreeBSD: /repoman/r/ncvs/src/sys/boot/i386/libi386/amd64_tramp.S,v 1.4 2004/05/14 /* * Quick and dirty trampoline to get into 64 bit (long) mode and running * with paging enabled so that we enter the kernel at its linked address. */ #define MSR_EFER 0xc0000080 #define EFER_LME 0x00000100 #define CR4_PAE 0x00000020 #define CR4_PSE 0x00000010 #define CR0_PG 0x80000000 /* GRRR. Deal with BTX that links us for a non-zero location */ #define VPBASE 0xa000 #define VTOP(x) ((x) + VPBASE) .data .p2align 12,0x40 .globl PT4 PT4: .space 0x1000 .globl PT3 PT3: .space 0x1000 .globl PT2 PT2: .space 0x1000 gdtdesc: .word gdtend - gdt .long VTOP(gdt) # low .long 0 # high gdt: .long 0 # null descriptor .long 0 .long 0x00000000 # %cs .long 0x00209800 .long 0x00000000 # %ds .long 0x00008000 gdtend: .text .code32 .globl amd64_tramp amd64_tramp: /* Be sure that interrupts are disabled */ cli /* Turn on EFER.LME */ movl $MSR_EFER, %ecx rdmsr orl $EFER_LME, %eax wrmsr /* Turn on PAE */ movl %cr4, %eax orl $(CR4_PAE | CR4_PSE), %eax movl %eax, %cr4 /* Set %cr3 for PT4 */ movl $VTOP(PT4), %eax movl %eax, %cr3 /* Turn on paging (implicitly sets EFER.LMA) */ movl %cr0, %eax orl $CR0_PG, %eax movl %eax, %cr0 /* Now we're in compatability mode. set %cs for long mode */ movl $VTOP(gdtdesc), %eax |