逆向-还原代码之bank (Interl 32)

该代码段展示了C语言中使用typedef和enum定义内存银行管理的数据结构和枚举类型,包括宏定义进行内存银行状态转换。示例中定义了内存地址数组和状态变量,并提供了状态转换函数。在main函数中,进行了内存地址的赋值和状态切换操作。
摘要由CSDN通过智能技术生成

 

// source code

#include <stdio.h>

typedef unsigned long ULONG;
typedef unsigned char UCHAR;

#define D_PIPE_MEM_BANK_RAW        (3)
#define D_PIPE_MEM_BANK_Y        (6)
#define D_PIPE_MEM_BANK_C        (6)
#define D_PIPE_MEM_BANK_AEAWB    (3)
#define D_PIPE_MEM_BANK_MAP        (3)
#define D_PIPE_MEM_BANK_MAP_RGB    (3)
#define D_PIPE_MEM_BANK_RGB        (3)
#define D_PIPE_MEM_BANK_CUSTOM_RAW (8)
#define D_PIPE_MEM_BANK_MAX     (8)

typedef enum {
    E_MEM_BANK_SET = 0,
    E_MEM_BANK_ING,
    E_MEM_BANK_RCV,
    E_MEM_BANK_MAX,
} E_BANK;

// 以下宏就是对E_BANK类型赋值
#define BANK_SET_TO_ING_AND_INCREMENT(a, b, mem, lock) a[E_MEM_BANK_ING] = a[E_MEM_BANK_SET];\
                                            a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
                                            if( mem[ a[E_MEM_BANK_SET] ] == lock ){\
                                                a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
                                            }

#define BANK_ING_TO_RCV(a) a[E_MEM_BANK_RCV] = a[E_MEM_BANK_ING]

#define BANK_SET_TO_ING_AND_INCREMENT_SPEC(a, b, mem) a[E_MEM_BANK_ING] = a[E_MEM_BANK_SET];\
                                            a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
                                            int i=b; \
                                            while(i--) { \
                                                if( mem[ a[E_MEM_BANK_SET] ].lock == 1 ){\
                                                    printf("index %d, mem %#x, lock %d, addr %#x\n", a[E_MEM_BANK_SET], &mem[ a[E_MEM_BANK_SET] ], mem[ a[E_MEM_BANK_SET] ].lock, mem[ a[E_MEM_BANK_SET] ].addr); \
                                                    a[E_MEM_BANK_SET] = ( a[E_MEM_BANK_SET] + 1) % b;\
                                                } else { \
                                                    break; \
                                                } \
                                            }

typedef struct {
    
    ULONG               mem_addr_raw[D_PIPE_MEM_BANK_RAW];
    ULONG               mem_addr_raw1[D_PIPE_MEM_BANK_RAW];
    ULONG               mem_addr_y[D_PIPE_MEM_BANK_Y];
    ULONG               mem_addr_c[D_PIPE_MEM_BANK_C];
    ULONG               mem_addr_y_ch1[D_PIPE_MEM_BANK_Y];
    ULONG               mem_addr_c_ch1[D_PIPE_MEM_BANK_C];
    ULONG               mem_addr_aeawb[D_PIPE_MEM_BANK_AEAWB];
    ULONG                mem_addr_map_yp[D_PIPE_MEM_BANK_MAP];
    ULONG                mem_addr_map_yn[D_PIPE_MEM_BANK_MAP];
    ULONG                mem_addr_map_rgb[D_PIPE_MEM_BANK_MAP_RGB];


    UCHAR               mem_bank_raw[E_MEM_BANK_MAX];
    UCHAR               mem_bank_raw1[E_MEM_BANK_MAX];
    UCHAR               mem_bank_y[E_MEM_BANK_MAX];
    UCHAR               mem_bank_c[E_MEM_BANK_MAX];
    UCHAR               mem_bank_y_ch1[E_MEM_BANK_MAX];
    UCHAR               mem_bank_c_ch1[E_MEM_BANK_MAX];
    UCHAR               mem_bank_aeawb[E_MEM_BANK_MAX];
    UCHAR               mem_bank_map[E_MEM_BANK_MAX];
    UCHAR               mem_bank_map_rgb[E_MEM_BANK_MAX];
    
    UCHAR                mem_bank_raw_num;
    UCHAR                mem_bank_yc_num;
    UCHAR               mem_bank_yc_ch1_num;
    UCHAR                mem_bank_map_num;
    UCHAR                mem_bank_map_rgb_num;

    ULONG               addr_custom_raw_ch;     //last addr
    UCHAR               mem_bank_custom_raw_ch[E_MEM_BANK_MAX]; //mem addr index
    UCHAR                mem_bank_custom_raw_num;
    ULONG               mem_addr_custom_addr_c;
} T_SENSOR2YUV_MNG;


static T_SENSOR2YUV_MNG             g_s2y_mng;

int main(int argc, char *argv[])
{
    int temp = -1;

    printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_SET]);    // 0
    printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_ING]);    // 0
    printf("%d\n", g_s2y_mng.mem_bank_y[E_MEM_BANK_RCV]);    // 0
    printf("%d\n", BANK_ING_TO_RCV(g_s2y_mng.mem_bank_y));    // 0
    
    g_s2y_mng.mem_addr_y[0] = 0xaaaaaaaa;
    g_s2y_mng.mem_addr_y[1] = 0xbbbbbbbb;
    g_s2y_mng.mem_addr_y[2] = 0xcccccccc;
    g_s2y_mng.mem_addr_y[3] = 0xdddddddd;

    temp = g_s2y_mng.mem_addr_y[g_s2y_mng.mem_bank_y[E_MEM_BANK_RCV]];
    printf("%#x\n", temp);    // 0xaaaaaaaa

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值