《天书夜读 —— 从汇编语言到Windows内核编程》3.3 汇编反C语言练习 参考答案

最近在研读经典安全书籍《天书夜读 —— 从汇编语言到Windows内核编程》,发现网上参考答案甚少,且部分答案存在明显的严重错误,因而写下此文。

书本上给出的汇编代码如下:

笔者按照书本思路和自身理解还原出以下C语言代码:

int myfunction(int a[],int b[],double c[],int d)
{
    int i = 0;
    
    do
    {
        c[i] = a[i*2+1]*b[2] + a[i*2]*b[0];
        c[i+1] = a[i*2+1]*b[3] + a[i*2]*b[1];
        d += c[i] + c[i+1];
    }while(i<2);    //此处换为 for 循环同样可行
    
    d += rand();
    
    switch(d)
    {
        case 100:
            printf("cnt is 100");
        case 110:
            printf("cnt is 110");
            break;
        default:
            printf("nothing");
    }
    
    return d;
}

其中 c 数组是笔者思考较久的地方,通过分析作者书本上提供的 for 循环答案,可知第2次循环(即 i 为1时)会把 c[1] 重新赋值,而每次循环完 c 的地址都要加 8 ,如果 c 是 int 类型数组,第2次循环时就不会把 c[1] 重新赋值,因为 int 类型占用空间为 4 字节,c 的地址加 8 就 等于跳了 8/4 = 2 个索引,就为 c[2] 而不是 c[1] 赋值了。所以可以得知 c 的元素为 8 字节数据类型,即 double 类型。

如果有任何错误或疑问欢迎大家及时提出,笔者会尽快上线回复。

猜你喜欢

转载自www.cnblogs.com/dubh3/p/11784631.html