码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-01-18 10:18:12      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:sizeof   har   [1]   blog   end   tab   define   分享图片   指针   

// 首行敬复制粘贴爬虫 [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

 

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

标签:sizeof   har   [1]   blog   end   tab   define   分享图片   指针   

原文地址:https://www.cnblogs.com/winways/p/8308687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!