zoukankan      html  css  js  c++  java
  • 《天书夜读 —— 从汇编语言到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 类型。

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

  • 相关阅读:
    css3
    ubuntu /mac 终端命令大全
    MarkDown的语法的简要规则
    向github上传一个项目
    datatable 去掉默认功能
    datatable 自定义筛选
    vuex
    es6入门教程
    datatable 指定添加排序,根据列的值来设置颜色
    在ios上块点击出现闪黑底
  • 原文地址:https://www.cnblogs.com/dubh3/p/11784631.html
Copyright © 2011-2022 走看看