[奇巧淫技]测试数组赋值

// 首行敬复制粘贴爬虫 [authorized by winways]

typedef unsigned char BYTE #define Assgin(a, ...) AssginArr(a, ##__VA_ARGS__)

void AssginArr(unsigned char * _des, ...)
{
    int i = 0;
    va_list apptr;

    va_start(apptr, _des);
    //int* c = _des + 1;
    //int* d = &(_des[1]);
    //auto e = sizeof(_des[0]) * (_des[0] - 1);
    //memcpy(_des + 1, apptr, sizeof(_des[0]) * (_des[0] - 1));
    while(true)
    {
        int iValue = va_arg(apptr, int);

        if (iValue == -1) break;

        _des[i++] = iValue;
    };
    va_end(apptr);
}

BYTE aaa[6] = {};

//主要意义在于 测试数据时 自动赋值 而非初始化
Assgin(aaa, 0x04,0x14,0x24,0x34,0x15,0x06,-1);

 

中间是另外一种办法只适用于4字节长的数据类型 因为可变参数默认存放空间4字节固定 即使传入的是BYTE也会被强制转换

而_des + 1 中实际的汇编码在数组内按照

基址 + 偏移量 * sizeof(type)来计算下一个地址 即使在C++中传递的只是数组的首址 但数组和指针 + 1的 结果都要被转化 即指针地址运算也是按照基址+变址来算的

基址变址寻址中有一个 系数为1 2 4 8 分别对应BYTE(unsigned char) WORD(unsigned short) int long 就是这个道理

这个系数存放在8位SIB中

7 6 5 4 3 2 1 0
指定系数 指定变址寄存器 指定基址寄存器

 

虽然memcpy的效率要高一些 但这个办法对非4字节长度类型不可行

使用起来比较方便 用于初始化数组或数组赋值 注意要指定结束符-1

是的 这就是模仿函数式的写法 当然只是写法 效率是不一样的 故只用于测试

 

posted @ 2018-01-18 09:54  winways  阅读(241)  评论(0编辑  收藏  举报