bloggerads

2013年11月29日 星期五

C 巨集用法經驗談

1. 可用來設定Memory address的value。 巨集的參數記得括弧,整個巨集也要括弧以免別人引用時因為C priority問題產生bug

#include <stdio.h>

typedef unsigned int DWORD;

#define SET_MEM_32( addr, val) \
( *(DWORD* )(addr) = (val) )

#define GET_MEM_32( addr)    (*(DWORD* )(addr))

#define MODIFY_MEM_32( addr, mask, val) \
( *(DWORD* )(addr) = GET_MEM_32(addr) & ~(mask) | (val) & (mask) ) 

int 
main()
{
    unsigned char arr[10]={0,1,2,3,4,5,6,7,8,9};

    SET_MEM_32(arr, 0x22334455);
    printf("%x\n",GET_MEM_32(arr));

    MODIFY_MEM_32(arr, 0xff0000, 0x770000);
    printf("%x\n",GET_MEM_32(arr));
    
    return 0;
}

--------------執行結果--------------
22334455
22774455

沒有留言:

張貼留言