逆向汇编基础

本文介绍了计算机系统中CPU的基本功能,包括执行机器指令、暂存少量数据和访问存储器等内容,并详细阐述了汇编语言的概念及其优缺点,以及数据在内存中的表示和存储方式。

第一章基础知识

 

1.1 CPU基本功能

 

1.1.1         目标代码

计算机系统中的CPU只能执行机器指令

由机器指令组成的程序,被称为目标程序,也被称为目标代码

计算机系统最终运行的是目标程序

 

int  cf11( void )

{

     int  sum,  i;

     sum = 0;

     for ( i = 1;  i <= 10; i += 1 )

         sum += i*i;

     return sum;

}

 

等价于:

        xor   ecx, ecx

        xor   eax, eax

        inc   ecx

$LL3@cf11:

        mov   edx, ecx

        imul  edx, ecx

        add   eax, edx

        inc   ecx

        cmp   ecx, 10

        jle   $LL3@cf11

        ret

 

 

1.1.2         基本功能

1.执行机器指令

ü  CPU能够直接识别并遵照执行的指令被称为机器指令

ü  CPU一条接一条地依次执行存放在存储器中的机器指令

ü  每一条机器指令的功能通常很有限

ü  CPU能够执行的全部机器指令,被称为该CPU的指令集

ü  CPU决定机器指令。不同种类CPU,其指令集往往不相同

ü  按指令的功能来划分,通常机器指令可分为以下几大类:

数据传送指令、算术逻辑运算指令、转移指令

处理器控制指令、其他指令等

 

 

2.暂存少量数据

ü   一个目标程序中的绝大部分指令是对数据进行各种运算或者处理

ü   CPU有若干个寄存器,可以用于存放运算数据和运算结果,还可以给出存储单元地址

ü   利用寄存器存放运算数据和运算结果,效率最高

ü   大部分指令的操作数据至少有一个在寄存器中

ü   CPU内可以用于存放运算数据和运算结果的寄存器数量很有限

 

3.访问存储器

ü   CPU要执行目标程序,就要访问存储器。目标程序在存储器中,待处理              的数据也在存储器中。这里存储器是指CPU能够直接访问的计算机系统的物理内存

ü   存储器(内存)由一系列存储单元线性地组成,最基本的存储单元为一个字节。为了标识和存取每一个存储单元,给每一个存储单元规定一个编号,也就是存储单元地址

ü   CPU支持以多种形式表示存储单元的地址。一些功能较强的CPU还支持以多种方式组织管理存储器

 

 

int x = 1;

int y = 2;

void cf12( void )

{

   y = x * x + 3;

   return;

}

 

等价于:

int x = 1;

int y = 2;

void cf12( void )

{

   y = x * x + 3;

   return;

}

 

 

1.2      汇编语言概念

1.2.1         机器指令

ü   把CPU能够直接识别并遵照执行的指令称为机器指令

ü   机器指令一般由操作码和操作数两部分构成

ü   操作码指出要进行的操作或运算

   例如,加、减、传送等

ü   操作数指出参与操作或运算的对象,也指出操作或运算结果存放的位置

   例如,寄存器、存储单元和数据等

 

 

          xor  ecx, ecx

          xor  eax, eax

          inc   ecx

lab1:  mov edx, ecx

          imul edx, ecx

          add   eax, edx

          inc   ecx

         cmp ecx, 10

          jle    lab1

          ret

等价于:

33 C9

    33 C0

    41

    8B D1

    0F AF D1

    03 C2

    41             

    83 F9 0A

    7E F3

    C3

 

1.2.2         汇编格式指令

1.人们采用便于记忆、并能描述指令功能的符号来表示指令的操作码。这些符号被称为指令助记符

2.用符号表示操作数,如寄存器、存储单元地址等

3.由指令助记符、操作符号和常量等表示的指令被称为汇编格式指令

 

ü   汇编格式指令的一般格式 

    [ 标号:]   指令助记符  [ 操作数表]

 

 

1.2.3         汇编语言及其优缺点

汇编语言

ü   汇编语言是一种程序设计语言,是机器语言的符号化

ü   汇编语言的语句主要是汇编格式指令和伪指令

ü   由于汇编语言的主体是汇编格式指令,而汇编格式指令又与机器密切相关,且功能有限,所以常把汇编语言称为低级语言

 

汇编和汇编程序

ü   把用汇编语言编写的程序称为汇编语言源程序,或称为汇编源程序,或简称为源程序。

ü   把汇编源程序翻译成目标程序的过程称为汇编。

ü   把完成汇编工作的工具或程序叫做汇编程序(汇编器)。

 

汇编语言的优缺点

ü   汇编语言与机器关系密切

ü   汇编语言程序效率高

ü   编写汇编语言源程序繁琐

ü   汇编语言程序调试困难

 

 

 

 

1.3      数据的表示和存储

 

1.3.4 数据的存储

 

ü  以二进制形式表示的数据和代码存放在存储器(内存)之中。

ü  内存由一系列基本存储单元线性地组成,每一个基本存储单元有一个唯一的地址。通常,基本存储单元由8个连续的位构成,可用于存储一个字节的数据。所以,基本存储单元也被称为字节存储单元。

ü  可以把内存看作为一个很大的一维字符数组,把地址看作为标识数组元素的下标。

ü  字节存储单元是基本的存储单元。

ü  一个字节存储单元中8位数据的意义,根据需要可以有不同的解释。

ü   两个连续的字节存储单元构成一个字存储单元。字存储单元的地址是较低的字节存储单元的地址。“高高低低”规则

ü  四个连续的字节存储单元构成一个双字存储单元。

 

#include <stdio.h>

   char  buff[] = { 3, 2, 1, 0, 130};          // 130=0x82

   int  a, b;

   int  main( )

   {

       char  *p = buff;

       a = *( int* ) p;                                    //L1

       b = *( int* ) ( p+1 );                          //L2

       printf( "a = %x, b=%x\n", a, b );     //L3

       printf( "a = %d, b=%d\n", a, b );     //L4

       return  0;

   }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值