c语言反汇编分析(C反汇编系列一)

「反汇编系列主要是在linux平台下,从汇编层面分析c 的数据类型、函数调用、返回值、分支、循环等底层原理,希望对大家有帮助~」

【目录】

1-------------x64 中常用的寄存器

2-------------汇编语言中的基本寻址方式

2.1 --------数据寻址方式

要对c 程序进行反汇编分析学习,需要一定的汇编知识,所以这里就跟大家一些简单学习下我们后面序列文章所需的知识点。

  1. Intel 指令组成

intel指令主要由以下6部分组成

c语言反汇编分析(C反汇编系列一)(1)

Fig 1

  1. x86_64 中常用的寄存器

c语言反汇编分析(C反汇编系列一)(2)

Fig 1

上图中说明了各个寄存器的用途以及是否是保留它用(上面的蝌蚪文通俗易懂),这里就不再翻译赘述了。

  1. 汇编语言中的基本寻址方式

2.1 数据寻址方式

汇编语言中的指令操作的数据主要来自寄存器,立即数,内存。

立即寻址:指令所需的操作数直接包含在指令代码中,就是常说的立即数且只能出现在源操作数位置直接寻址操作数来源于(指令中直接指出的地址所指向的内存)MOV AX [2000H],这个方括号的意思是“以括号内的值作为地址,(所指向的内存)中存储的值”MOV AX,x这里的这个x是之前在数据段定义的变量,当汇编程序被汇编时,汇编器会计算出x的偏移值,然后替换掉原来的x所以在DEBUG模式下,看到的就不是变量名,而是变量名在数据段中的偏移地址寄存器寻址操作数来源于某个寄存器/是这个寄存器里存储的值比如我要把某个16位的数从BX复制到AX,那么我可以用MOV AX,BX这里的两个操作数都是寄存器寻址寄存器间接寻址这就很好理解了,现在括号里放的不是立即数了,放的是寄存器了,代表操作数在内存中,它的地址的括号内的寄存器中不过这个间接寻址有几个注意点:1. 寄存器一般使用的是基址寄存器BP\BX或变址寄存器SI\DI2. 完整的形式应该是[段地址]:[段内偏移]3. 当未显式指定段寄存器时,BX\SI\DI中是相对于DS段的偏移地址,BP是相对于SS段的偏移地址寄存器相对寻址操作数的地址 = 间址寄存器 偏移量同直接寻址一样,偏移量可以是一个常量也可以是一个符号名或变量名例如MOV AX,[SI 10H]或MOV AX,ARRAY[SI]基址变址寻址操作数地址 = 基址寄存器 变址寄存器例如MOV AX,[BX SI]

2.与转移地址有关的寻址方式

这四种寻址方式主要运用于转移指令JMP和过程调用指令CALL首先要了解这两个东西:标号,过程名(自己看,不讲了)

寻址方式讲解段内直接就是说我们现在程序运行到这里需要发生一个转跳去执行其他地方的一些代码辣么这些代码在哪里呢我们进行了一些运算,用当前IP的值加上指令中指定的偏移量,得到了一个地址然后我们就要跳到那里去比如JMP func1偏移量可以是8位或者16位,相对的我们就要使用 SHORT func1或者NEAR PTR func1段间直接这个和段内直接的区别是什么呢就是一个X86汇编程序,可能有几个代码段,当使用段间直接寻址时,需要改变段地址的值,相当于跳到了另一个代码段,开始执行新的代码比如JMP FAR PTR func1段内间接跟段内直接的区别是:要转跳的地址放在了寄存器里,而不是一个标号(参考一下2里的寄存器简介寻址吧)段间间接类似于段内间接,但是,间接寻址的地址不能直接放在寄存器里,只能放在内存单元中,而且是一个双字

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页