|
|
#4
自由而无用2021-10-12 12:05
//online parser: https://www.bccn.net/run/?lang=c
 程序代码: #include <stdio.h> #include <unistd.h> #include <sys/mman.h>
typedef unsigned char uint8_t; static unsigned short exp_state; static unsigned long *vint; #define MAGIC_EXCEPTION 0x9C #define post_exception(_exp) exp_state = ((_exp << 8) | MAGIC_EXCEPTION); #define chk_exception() (MAGIC_EXCEPTION == (exp_state & 0xff)) #define clr_exception() (exp_state &= 0xff00)
static inline int vdiv(int num, int den) { #define DIV_EXCEPTION 0 if (!den) { post_exception(DIV_EXCEPTION); //#define PRINT_ON #ifdef PRINT_ON printf("exp_state = 0x%x\n", exp_state); #endif return DIV_EXCEPTION; } return num / den; }
#define callback char* callback log_info(uint8_t errno) { static char *log[256] = { [DIV_EXCEPTION] = "WARNING: arithmetic exception[div zero]" }; return log[errno]; }
void register_vector_tbl(void) { vint = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_SHARED , 0 , 0); vint[DIV_EXCEPTION] = (unsigned long)log_info; #ifdef PRINT_ON printf("log_info = %p\n", log_info); printf("vint[%d] = 0x%lx\n", DIV_EXCEPTION, vint[DIV_EXCEPTION]); #endif }
void trig_int(uint8_t arg) { typedef char* (*vect_log)(unsigned char); #ifdef PRINT_ON printf("log_info = %p\n", log_info); printf("vint[%d] = 0x%lx\n", DIV_EXCEPTION, vint[DIV_EXCEPTION]); #endif puts(((vect_log)vint[DIV_EXCEPTION])(arg));
clr_exception(); #ifdef PRINT_ON printf("exp_state = 0x%x\n", exp_state); #endif }
int main(int argc, char *argv[]) { uint8_t a = 0, b = 0, c = 0, errno; int i;
register_vector_tbl(); #define TST_PROCEDURE_CNT 25 for (i = 0; i <= TST_PROCEDURE_CNT; i++) { printf("[%d]:a = %d, b = %d, c = %d\n", i, a, b, c); errno= vdiv(a, (b + c)); if (chk_exception()) trig_int(errno); a = ((uint8_t *)main)[i] % 10; b = ((uint8_t *)main)[i + 1] % 10; c = ((uint8_t *)main)[i + 2] % 10; }
return 0; }
output sample:
[0]:a = 0, b = 0, c = 0
WARNING: arithmetic exception[div zero]
[1]:a = 5, b = 2, c = 7
[2]:a = 2, b = 7, c = 9
[3]:a = 7, b = 9, c = 2
[4]:a = 9, b = 2, c = 1
[5]:a = 2, b = 1, c = 6
[6]:a = 1, b = 6, c = 2
[7]:a = 6, b = 2, c = 7
[8]:a = 2, b = 7, c = 5
[9]:a = 7, b = 5, c = 6
[10]:a = 5, b = 6, c = 2
[11]:a = 6, b = 2, c = 7
[12]:a = 2, b = 7, c = 7
[13]:a = 7, b = 7, c = 4
[14]:a = 7, b = 4, c = 8
[15]:a = 4, b = 8, c = 9
[16]:a = 8, b = 9, c = 8
[17]:a = 9, b = 8, c = 0
[18]:a = 8, b = 0, c = 8
[19]:a = 0, b = 8, c = 9
[20]:a = 8, b = 9, c = 9
[21]:a = 9, b = 9, c = 0
[22]:a = 9, b = 0, c = 8
[23]:a = 0, b = 8, c = 9
[24]:a = 8, b = 9, c = 0
[25]:a = 9, b = 0, c = 0
WARNING: arithmetic exception[div zero]
|