学习汇编的过程反反复复,好了又没好,没好似乎又懂点什么。 或许只是走了流程。告诉自己学过了。却很少问过自己是否学到了。因此想借此以文字的方式来记录和提醒自己。 接下来的随笔没章节、没体系,真的只是随手读书,随手记笔记。
(一)
1、遵循cdecl stdecl调用约定的函数(这么表达可能不太准确,但暂时没有想到更好的),在返回调用方时会将EAX中的值作为返回值返回给调用方。调用方会从EAX中取值,把它当做返回结果。
所谓返回值是高级语言中的说法,函数从被调用方转到调用方称为返回。 将 1 换种说法就是 被调用方把要传递给调用方的数据放在EAX中。根据调用约定,调用方就会到EAX中取值。现在有一个小问题,被调用方是否执行到最后才将值放入EAX.再者 retn 指令并没有设置EAX的功能。它所做的工作是将bp/ebp/rbp 和 sp/esp/rsp/ 的值恢复到被调用方执行之前的状态。
2、达成某一目的,会有多种操作方式,但最终都是殊途同归。 最简单的当函数返回0时,汇编的做法是将EAX置为0。 可通过 mov eax,0 、sub eax,eax 、xor eax,eax等。具体用哪个取决于编译器的优化选项。 xor eax,eax 比 mov eax,0 更优的原因是 前者的机器码长度更短。
3、汇编规定了立即数不能以字母开头,对于 ffffh 这类的立即数 会在前面加个0。因此对于0ffffh这类数 应保持淡定。
4、汇编中对于立即数全部是补码运算。 牢记正数的补码是它本身,负数的补码是其对应的正数的补码取反后加1。
-16的补码为 0fffffff0h
5、在x86-64架构中,在进行系统调用之前会将EAX清空。这是系统规范。
6、在IDA中类似于 s =dword ptr -1Ch 这样的反汇编语句 。其表面意思为 将长度为双字的 常量 -1Ch 赋值给s,ptr是属性操作符。 dword 指明了 -1Ch的字宽。
个人的理解:在IDA中 s代表的是偏移量,也就指向了代码中对应的变量。