А то чтот у меня ошибки и не пойму чтото да и синтаксис какой то странный void gbz80_inc(byte* reg) { asm volatile ( "movl $0, %1\n" // load 0 to NFLAG "incb %2\n" "lahf\n" // get flags "andb $1,%%bh\n" // carry not affected "andb $0xFE,%%ah\n" "orb %%ah, %%bh \n" : "=b" (flags), "=g" (NFLAG), "=q" (*reg) : "2" (*reg), "0" (flags) : "cc", "ah"); } Вот, студия ругается так c:\documents and settings\администратор\мои документы\visual studio 2005\projects\gest\gest\opcodes.h(22) : error C2059: syntax error : '<cv-qualifer>' : "=b" (flags), "=g" (NFLAG), "=q" (*reg) : "2" (*reg), "0" (flags) : "cc", "ah"); и ещё двоеточия какие то странные
Тю, точно я только ща понял что это такой синтаксис. ФАк. Скажи а что за двоетоция. Это тоже присуще этому синтаксису?
нужны для... как бы сказать.. передачи параматров inline-ассемблеру. Код (Text): void gbz80_inc(byte* reg) { asm volatile ( "movl $0, %1\n" // load 0 to NFLAG "incb %2\n" "lahf\n" // get flags "andb $1,%%bh\n" // carry not affected "andb $0xFE,%%ah\n" "orb %%ah, %%bh \n" : "=b" (flags), "=g" (NFLAG), "=q" (*reg) : "2" (*reg), "0" (flags) : "cc", "ah"); } после первого двоеточия - выходные параметры после второго - входные параметры после третьего - список регистров, которые будут использованы (т.е. затерты). вот ссылка по gcc inline-ассемблеру. http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
ajak 1. Делаешь файл, например, t.c Код (Text): typedef unsigned char byte; extern int NFLAG; extern unsigned short flags; void gbz80_inc(byte* reg) { asm volatile ( "movl $0, %1\n" // load 0 to NFLAG "incb %2\n" "lahf\n" // get flags "andb $1,%%bh\n" // carry not affected "andb $0xFE,%%ah\n" "orb %%ah, %%bh \n" : "=b" (flags), "=g" (NFLAG), "=q" (*reg) : "2" (*reg), "0" (flags) : "cc", "ah"); } 2. Скармливаешь его какому-нибудь gcc, например gcc-g++-3.4.5-20060117-1.tar.gz (4’710’429 байт), Код (Text): c++.exe -S t.c 3. Получаешь t.s Код (Text): .file "t.c" .text .align 2 .globl __Z9gbz80_incPh .def __Z9gbz80_incPh; .scl 2; .type 32; .endef __Z9gbz80_incPh: pushl %ebp movl %esp, %ebp pushl %ebx movl 8(%ebp), %eax movzbl (%eax), %edx movzwl _flags, %ebx /APP movl $0, _NFLAG incb %dl lahf andb $1,%bh andb $0xFE,%ah orb %ah, %bh /NO_APP movw %bx, _flags movl 8(%ebp), %eax movb %dl, (%eax) popl %ebx popl %ebp ret 4. Внимательно изучаешь его и делаешь вариант для VC Код (Text): typedef unsigned char byte; extern int NFLAG; extern unsigned short flags; void gbz80_inc(byte* reg) { NFLAG = 0; __asm mov eax,reg __asm mov dl,[eax] __asm mov bx,flags __asm inc dl __asm lahf __asm and bh,1 __asm and ah,0xFE __asm or bh,ah __asm mov flags,bx __asm mov eax,reg __asm mov [eax],dl }