Chapal jsem ten anglicky termin trosku jinak, tak mi to nedavalo smysl k ceskemu. Dekuji za upresneni.
Pridal jsem na konec kodu endmarker, validni instrukci aby to slo objdumpovat, zatim jen pro x86
#define ENDMARKER() __asm__ __volatile__ ("\n\t .byte 0x3f"); // "AAS"
tail cally to vyresilo spolehlive. Co mne ale prekvapilo, nektere snippety jsou diky tomu kratsi, nekdy i o mnoho bajtu
. Samozrejme u spousty tam ta jedna instrukce pribyla, ale je na konci, takze zkusim pripadne napsat neco co ji zlikviduje. Funguje stejne i toto:
#define ENDMARKER() __asm__ __volatile__ ("\n\t"); // jen likvidace tail callu
Co mne nyni trapi v tom, abych to generovani nejak mohl automatizoval je nefunkcnost makra, toto je prototyp pro jeden opkod (realne se pak pouzije misto FAILURE rozvoj do dalsich)
mam definovano:
opcodes.h:#define OPCODE_BYTE_1 0xnn
sem by se to melo dosadit:
opcode = instr_get_opcbyte();
toto makro funguje 100%, gcc optimalizuje podle toho define
cpuhelpers.c:#define instr_get_opcbyte() OPCODE_BYTE_1
pred instr_get_opcbyte(); volam:
cpu.c: n_opcode = 0;
toto makro
cpulelpers.c:#define instr_get_opcbyte() (++n_opcode, (n_opcode == 1) ? OPCODE_BYTE_1 : FAILURE)
vubec nefunguje. Zcela identicky ekvivalent pro arg1/arg2 jak jsem psal vyse mi chodi naprosto bez problemu. tady to makro se rozvine z nejakeho zahadneho duvodu, jako kdyby gcc neumelo uvazovat o fixni hodnote n_opcode a predpocitat to na fixni vysledek OPCODE_BYTE_1 ! Netusite nekdo kde delam chybu ? Prijde mi to uplne silene, hlavne kdyz daleko slozitejsi varianta s registrovymi argumenty chodi jak ma. Prijde mi jako kdybych nevidel nejaky preklep nebo tak neco.
Dekuji za pripadne popostrceni.