Code:
#include <stdio.h>
#define ADDR_START 0x400000
#define ADDR_END 0x401000
#define _TRY \
asm( \
"pushl $_catch;" \
"pushl %fs:(0);" \
"movl %esp, %fs:(0);" \
"_try:" \
"pusha;" \
);
#define _CATCH \
asm( \
"jmp _endtry;" \
"_catch:;" \
"pusha;" \
);
#define _ENDTRY \
asm( \
"popa;" \
"movl 12(%esp), %eax;" \
"movl $_endtry, 0xB8(%eax);" \
"xorl %eax, %eax;" \
"ret;" \
"_endtry:;" \
"popl %fs:(0);" \
"addl $4, %esp;" \
);
int main(void)
{
unsigned char chr;
int addr;
for(addr = ADDR_START; addr < ADDR_END; addr++)
{
_TRY
{
chr = *((unsigned char *) addr);
printf("%.02X ", chr);
}
_CATCH
{
printf("-- ");
}
_ENDTRY
}
getc(stdin);
return 0;
}
Klappt doch.
Syntaktisch: Ansi-C.
Inhaltlich: W32 gebunden.