《逆向工程权威指南》—第3章3.7节练习题

简介:

本节书摘来自异步社区《逆向工程权威指南》一书中的第3章3.7节练习题,作者【乌克兰】Dennis Yurichev(丹尼斯),更多章节内容可以访问云栖社区“异步社区”公众号查看。

**3.7 练习题
3.7.1 题目1 **
请描述下述32位函数的功能。

main:
     push 0xFFFFFFFF
     call MessageBeep
     xor  eax,eax
     retn

3.7.2 题目2
请描述Linux函数的功能,这里使用了AT&T汇编语言语法。

main:
     pushq   %rbp
     movq    %rsp, %rbp
     mov1    %2, %edi
     call    sleep
     popq    %rbp
     ret

[1] Brian W. Kernighan. The C Programming Language. Ed. by Dennis M. Ritchie. 2nd. Prentice Hall Professional Tech- nical Reference, 1988. ISBN: 0131103709。

[2] 但是CPU 标志位会发生变化。

[3] 参见http://en.wikipedia.org/wiki/Exclusive_or

[4] C runtime library:sec:CRT,参见本书68.1节。

[5] 参考Wikipedia:Data structure alignment http://en.wikipedia.org/wiki/Data_structure_ alignment。

[6] 参考Mit13。

[7] 参考Int13。

[8] 可通过菜单“Options Number of opcode bytes”启用有关选项。

[9] 请参考Mit13。

[10] Apple公司的Xcode 4.6.3使用的前段编译器是开源的GCC程序,代码生成程序(code generator)使用的是LLVM。

[11] 例如,ARM模式的指令集里没有PUSH/POP指令。

[12] STMFD是Storage Multiple Full Descending 的缩写。

[13] stack pointer,栈指针。x86/x64框架中的SP是SP/ESP/RSP,而ARM框架的SP就是SP。

[14] Program Counter,中文叫做指令指针或程序计数器。x86/x64里的PC叫作IP/EIP/RIP,ARM里它就叫PC。

[15] 本书介绍操作系统的部分有更详细的说明。在不同框架的汇编语言中,PC很少会是当前指令的指针地址+1,这和CPU的流水/pipeline模式有关。如需完整的官方介绍,请参阅http://www.arm. com/pdfs/comparison-arm7-arm9-v1.pdf。

[16] BL是Branch with Link的缩写,相当于x86的call指令。

[17] 这是二进制里26位有符号整型数据(26 bits signed int)的数值范围。

[18] LDMFD是Load Multiple Full Descending的缩写。

[19] 参照参考文献App10。

[20] Xcode 4.6.3是基于GCC的编译器。

[21] 请参考http://www.ciselant.de/projects/gcc_printf/gcc_printf.html

[22] 请参考前文介绍的分支延迟槽(Branch delay slot)效应。

[23] 有关MIPS各寄存器的用途,请参见附录C.1。

[24] 很明显,对于GCC的用户来说,查看汇编指令的功能不是那么重要。所以,GCC输出的汇编指令之中仍然可能存在一些(在生成汇编指令的阶段)未被修正的错误。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
8月前
|
存储 算法 NoSQL
[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(章节题库+答案解析)
[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(章节题库+答案解析)
|
Java
java编程思想第四版第五章习题
创建一个类, 它包含一个未初始化的String引用。验证该引用被Java初始化成了null.
164 0
|
Java
java编程思想第四版第三章要点习题
输出结果: 这个结果需要特别说明一下, String是特殊的引用类型, 当他被直接赋值时,就是把这个值对应的引用位置赋值给String变量了, 所以, 两次结果都是true。 如果你用new String()赋值, 结果就不同了.
103 0
|
Java 程序员
java编程思想第四版第二章要点总结
boolean类型所占的存储空间大小没有明确指定, 仅定义为能够取字面量值true和false
90 0
|
设计模式 Java
java编程思想第四版第九章习题
输出结果: 调用基类构造方法的时候, 只是给子类的成员变量分配了一块内存空间, 并将内存空间的值设置为默认值0.
80 0
|
Java 程序员
java编程思想第四版第六章习题
创建两个包:debug和debugoff,他们都包含一个相同的类,该类有一个debug()方法,第一个版本显示发送给控制台的String参数,而第二版本什么也不做,使用静态import语句将该类导入到一个测试程序中,并示范条件编译效果。
163 0
|
存储 Java 程序员
java编程思想第四版第五章总结
构造器的一个重要的作用: 保证对象被使用之前初始化了.
120 0
|
Java
java编程思想第四版第七章习题
创建两个带有默认构造器(空参数列表)的类A和类B。从A中继承产生一个名为C的新,并在C内创建一个B类的成员。不要给C编写构造器。创建一个C类的对象并观察其结果。
89 0
|
Java
java编程思想第四版第八章习题
第一题 package net.mindview.polymorphism; //基类-自行车 class Cycle{ } //子类-单轮车 class Unicycle extends Cycle{ } //子类-双轮车 class Bicycle extends Cycle{ } //子类-三轮车 class Tricycle extends Cycl...
106 0
|
存储 Java
java编程思想第四版第三章要点总结
静态导入 使用import static方式导入一个类的所有方法. 例如: import static net.mindview.util.Print.*;
111 0