【学习记录】汇编基础知识的学习

因为逆向原生还是汇编,工作需要所有又揣器了汇编来看

arm汇编与x86汇编有什么不同?

主要是工作模式不同,指令集不同,寄存器不同
arm有7种用户模式和其他6中特殊模式,寄存器37个31个通用,6个状态寄存器。
x86,51,arm7以及以前的版本都属于冯·诺依曼体系结构,arm9以后的版本都属于哈佛体系结构,运行效率更高,汇编语言的原理和编程思想都是一样的,首先要掌握处理器的体系结构,了解其工作过程,然后就可以编写汇编语言直接控制处理器处理数据以及控制外围设备

主要的cpu架构有:

精简指令集:arm,mips(ps4~)
复杂指令集:x86

汇编语言编译的工作过程

汇编本质就是为了方便程序员,把二进制代码用汇编指令来表示

汇编指令—————-> 编译器 —————->机器码—————-> 计算机执行

mov ax, bx 100010001

……………. ……………

汇编语言指令的构成

汇编由下面3类指令组成

(1)汇编指令:如mov, add 等,有着对应的机器码.

(2)伪指令:没有对应的机器码,由编译器执行,计算机不执行

(3)其他符号:如+、-、*、/ 等由编译器识别,没有对应的机器码。

在汇编语言中:指令和数据的存储是一样的

比如同一段二进制1000100111011000

cpu可以把它看作指令 mov ax, bx 也可以看作数据 89D8H

位,字节、字(word)、字长、存储单元

字节byte:一字节等于8位bit
字:与cpu的位数有关如32位的一字就是4字节。
字长:就是字的长度。
存储单元:存储器被划分成若干个存储单元,大小为8位即一个字节。如内存最小单元就是一个字节,[0]中就是一个字节。

CPU总线-是PC系统中最快的总线,也是芯片组与主板的核心,用来与高速缓存、主存和北桥(或MCH)之间传送信息

CPU作为总线主控,通过控制总线,向各个部件发送控制信号,通过地址总线用地址信号指定其需要访问的部件,如存储器,数据总线上传送数据信息。

外部总线

地址总线:决定CPU的寻址能力。8086CPU有20根地址总线寻址能力是2^20即1MB。

数据总线:决定CPU与其他器件(如内存,显卡)进行数据传输的传输量。8086CPU有16根地址总线(就是字长)。数据总线是双向的。可读可写。

控制总线:决定CPU对系统中其他器件(如内存,显卡)的控制能力。

科普一波电脑独显是什么:
独立显卡是指成独立的板卡存在,需要插在主板的相应接口上的显卡。独立显卡具备单独的显存,不占用系统内存,而且技术上领先于集成显卡,能够提供更好的显示效果和运行性能独立显卡分为内置独立显卡和外置显卡。它是电脑主机里的一个重要组成部分,对于喜欢玩游戏和从事专业图形设计的人来说显得非常重要。目前民用显卡图形芯片供应商主要包括AMD(原ATI)和nVIDIA两家。
其实现在的配置电脑的显卡有集成显卡和独立显卡之分,集成显卡是集成在电脑主机主板上的,简单地说就是主板就已将带了显卡硬件,通常集成显卡性能较低,显存很低,如果你是游戏玩家或者从事专业图形设计的话,那么久强烈建议你配置主机的时候要购买独立显卡了,独立显卡通常都有较好的性能,电脑主机没有显卡的话显示器就不能显示图像

地址空间

    电脑由很多器件组成。如内存条,网卡,显卡。他们都有内存的。它们都与cpu总线相连。CPU对它们进行读或写
当作一个由若干存储单元组成的逻辑存储器,这个存储器就是内存地址空间(就是说CPU的地址空间,不仅仅是内存条的内存,而是电脑上所有的存储器)--很多器件都是要占用内存的。这就是为什么刚买的4g内
存,可用的却只有3.6左右。

如:

00000~9FFFF 主存地址空间(内存条)

9FFFF~A0000 显存地址空间

C0000~FFFFF 各类ROM地址空间(如主板BIOS,显卡BIOS)

寄存器

前面说的都是cpu的外部总线,而cpu 的运算器、控制器、寄存器都是靠内部总线相连的

运算器:进行信息的处理

存储器:进行信息存储

控制器:控制各个器件进行各种

对于汇编程序来说,CPU中主要的部件是寄存器。

如8086CPU有14个寄存器:

ax, bx, cx, dx, si, di, sp, bp, ip, cs, ss, ds, es ,psw

ax,bx,cx,dx, 用来存放一般数据。大小是16位即2个字节

cs是代码段地址寄存器

ip是指令指针寄存器,存放偏移地址

ds是数据段寄存器

1.通用寄存器

可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。
ax,bx,cx,dx, 用来存放一般数据。大小是16位即2个字节

8086CPU为了兼容上一代的8位CPU,ax,bx,cx,dx都可以分成两个独立的寄存器

AX 可分为 AH (AX的高8位)和 AL(AX低8位)

同理BX 可分为 BH 和BL 、CX 可分为CH 和 CL 、DX可分为DH和AL

状态寄存器

状态寄存器用来存放两类信息:一类是体现当前指令执行结果的各种状态信息(条件码),如有无进位(CF位)、有无溢出(OV位)、结果正负(SF位)、结果是否为零(ZF位)、奇偶标志位(P位)等;另一类是存放控制信息(PSW:程序状态字寄存器),如允许中断(IF位)、跟踪标志(TF位)等

2.几条汇编指令

mov ax, 18 ax=0018H

mov ah, 78 ah=0078H

add ax, 8 ax = ax+008H

mov ax, bx ax = bx

add ax, bx  ax = ax + bx

3. 8086CPU给出物理地址的方法

8086CPU地址总线有20根,而8086是16位的CPU,只能一次性处理传输和暂时存储16位。

8086CPU采用了用两个16位地址合成一个20位物理地址的方法就是:

物理地址 = 段地址 * 16 + 偏移地址 

寻址方式

寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。直接寻址,间接寻址等
参考如下

4. 段寄存器

8086CPU 有4个段寄存器 CS、DS、SS、ES

(1)cs和ip

cs是代码段地址寄存器

ip是指令指针寄存器,存放偏移地址

不能用 mov cs, 1000H mov ip, 0 来修改段寄存器

要用jmp指令如

jmp 2AE3:3 把cs改成2AE3H 把ip改成003H

如果只想改ip用如下指令

jmp 0 或者jmp ax

特别注意: cs=0001H ip=0000H

             与 cs=0000H  ip=00010H 是同一个地址 ,因为 物理地址 = 段地址 * 16 + 偏移地址相同。不要以为cs不同物理地址就不同。
posted @ 2016-08-09 21:25  Tesi1a  阅读(160)  评论(0编辑  收藏  举报