最近在研读经典安全书籍《天书夜读 —— 从汇编语言到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 类型。
如果有任何错误或疑问欢迎大家及时提出,笔者会尽快上线回复。
《天书夜读 —— 从汇编语言到Windows内核编程》3.3 汇编反C语言练习 参考答案
原文:https://www.cnblogs.com/dubh3/p/11784631.html