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 类型。

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

  • 相关阅读:
    【转载】面试70问 经典回答
    USB基础知识
    TCPDUMP 使用教程
    linux网络性能测试工具ipref安装与使用
    linux查看主板型号、CPU、显卡、硬盘等信息
    Curl请求慢
    mac与windows共享键盘鼠标(synergy)
    Tomcat 配置文件 server.xml
    jumpserver win终端无法添加
    进程占用情况记录
  • 原文地址:https://www.cnblogs.com/dubh3/p/11784631.html
Copyright © 2011-2022 走看看