本节书摘来自异步社区《逆向工程权威指南》一书中的第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输出的汇编指令之中仍然可能存在一些(在生成汇编指令的阶段)未被修正的错误。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。