汇编基础知识之一

1:进制的简单介绍

  

  二进制表示的数据后面加B,

  十进制表示的数据后面什么也不加,

  16进制表示的数据后面加H,

  2个16进制可以表示一个字节(这是因为一个字节占8位,2进制一个符号占1位,16进制一个符号占4位,所以2个16进制可以表示一个8位)

例如:10进制20000,   16进制:4E20H,  二进制: 0100 1110 0010 0000B

cmd里面输入calc打开计算器,可以进行换算

 

2:PC中各类存储器的逻辑连接

 

3:cpu寄存器

寄存器是在CPU内部中的,相当于cpu中的一个临时存储的空间。

8086 cpu有14个寄存器(8个通用寄存器),且均为 16 位 ,名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.

AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器。

通用寄存器:

AX,BX,CX,DX 称作为数据寄存器:

AX (Accumulator):累加寄存器,也称之为累加器;

BX (Base):基地址寄存器;

CX (Count):计数器寄存器;

DX (Data):数据寄存器;

SP 和 BP 又称作为指针寄存器:

SP (Stack Pointer):堆栈指针寄存器;

BP (Base Pointer):基指针寄存器;

SI 和 DI 又称作为变址寄存器:

SI (Source Index):源变址寄存器;

DI (Destination Index):目的变址寄存器;

控制寄存器:

IP (Instruction Pointer):指令指针寄存器;

FLAG:标志寄存器;

段寄存器:

CS (Code Segment):代码段寄存器;

DS (Data Segment):数据段寄存器;

SS (Stack Segment):堆栈段寄存器;

ES (Extra Segment):附加段寄存器;

8086 cpu所有的寄存器都是16位的,可以存放2个字节。一个字可以存在16位寄存器中,word(字)=2B,字是16位(H)为单位的,

以AX通用寄存器为例:

 数据:18

二进制表示:10010

在寄存器AX中的存储:

 ***

 一个16位寄存器所能存储的数据最大值是(2^16)-1

最小值是0,最大值是2^16-1=65535,可以表示的总数据有2^16=65536

例如1,2,3,4,5共5个数,总个数=max-min+1   ----> max=总个数+min-1

1=2的0次方
10=2的1次方
100=2的2次方
.
1 0000 0000 0000 0000=2的16次方
   1111 1111 1111 1111就是2的16次方减一.

 

4:

8086上一代cpu的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为2个独立的8位寄存器使用

AX可以分为AH,AL;

BX可以分为BH,BL;

CX可以分为CH,CL;

DX可以分为DH,DL;

8086 CPU的8位寄存器存储逻辑

以AX为例,8086cpu的16位寄存器分为2个8位寄存器的情况:

前面AH的8位都是0,只用后面AL 8位;

AX的低8位(0--7)构成了AL寄存器,高8位(8-15位)构成了AH寄存器;AH和AL都是可以独立使用的8位寄存器。

 

例如:

 

5:    16位结构的CPU特点:

  (1):运算器一次最多可以处理16位的数据

  (2):寄存器的最大宽度为16位。

  (3):寄存器和运算器之间的通路是16位的

   8086的CPU外部有20位地址总线,传递20位地址,寻址能力为1M(2^20=1MB)

   8086内部16位地址总线,只能传送16位地址,寻址能力有64KB(2^16=64KB)

 

8086采用一种在内部用2个16位的地址合成的方法形成一个20位的物理地址

 

6:地址加法器物理地址=段地址*16+偏移地址   

  偏移地址和段地址都是16位,2^16范围:0~~FFFFH的内存单元

    一个数据的二进制形式左移一位,相当于此数据乘2,左移N位,相当数据乘2的N次方

    一个数据的10进制形式左移一位,相当于此数据乘10

    一个数据的16进制形式左移一位,相当于此数据乘16

    地址加法器对段地址*16的操作是:以二进制形式存放的段地址左移4位,16进制的话左移一位

  偏移地址位16位,16位地址的寻址能力为64K(2^16=64KB),所以一个数据段的长度最大为64K

 内存单元地址小结:

  (1)cpu访问内存单位时,必须向内存提供内存单元的物理地址

  (2)8086cpu在内部用段地址和偏移地址相加的方法形成最后 的物理地址

    

    结论:cpu可以不同的段地址和偏移地址形成同一个物理地址

  

  思考:如果给定一个段地址,仅仅通过变化偏移地址来寻址,最多可以定位多少内存单元?

    结论:偏移地址16位,变化范围是0~~FFFFH,仅用偏移地址寻址的话最多寻址64K个内存单元

  例如:给段地址1000H,用偏移地址寻址,cpu的寻址范围是:

     10000H~~1FFFFH

  (3)在8086cpu中,存储单元的地址用2个元素来描述:段地址和偏移地址

    

段(数据段)是随便定义的(前提是:地址连续,起始地址为16的倍数的一组内存单元定义为一个数据段,专门存储数据的内存空间)

比如:123B0H~123B9H ,是一个数据段,段地址为123BH,长度为10个字节

 

7: 段寄存器

  段寄存器就是提供段地址的,8086cpu有4个人段寄存器:CS(代码地址),DS(数据地址),SS(堆栈地址),ES

  当8086cpu要访问内存时,由于这4个段寄存器提供内存单元的段地址

  CS和IP是8086cpu的最关键的寄存器,他们指示了cpu当前要读取指令的地址

  CS (cpu内部的代码段寄存器),CS里面的内容当做指令的段地址

  IP(cpu内部的指令指针寄存器),IP里面的内容当做指令的偏移地址

 

 

8086cpu的工作过程:

(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器

(2)从IP=IP+所读取指令的长度,从而指向下一条指令

(3)执行指令,转到(1),重复

8:8086pc工作过程简述:

  在8086cpu加电启动或者复位后(即cpu刚开始工作),CS和IP被设置为CS=FFFFH,IP=0000H;

  即是8086pc机刚启动时,cpu从内存FFFF0H单元读取指令执行,

  FFFF0H单元的指令是8086pc开机执行的第一条指令。

   在任何时候,cpu将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址。到内存中读取指令码,执行。

 

9:  8086cpu提供转移指令修改CS,IP的内容

jmp 段地址:偏移地址

计算方法是段地址要左移一位,因为cpu内的地址设是16位的,要访问20位的地址总线要采用移位(2进制移4位,16进制移1位,就是乘以16的方法),

比如地址xxAB:XXCD代表XAB0+XXCD--->XABCD(一共20位地址)

例如: jmp 2AE3:3    --->  2AE30+0003=2AE33H

jmp:3:0B16    ---> 00030+0B16=B46H

 

(1) mov ax,6622

(2) jmp 1000:3

(3)mov ax,0000

(4)mov bx,ax

(5)jmp bx

(6)mov ax,0123H

(7)转到第3步执行

这是一个死循环

 

10: 代码段

  对于8086pc机,可以根据需要将一个内存单元定义为一个段

  可以将长度为N(N<=64KB,偏移地址不能超过16位,也就是一个段的索引不能超过2^16=64KB,也就是一个段最大存放64KB)的一组代码,

  存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存存放代码,从而定义为代码段

小结:

(1)8086cpu要访问内存时,由段寄存器提供内存单元的段地址,8086cpu有4个段寄存器其中CS用来存放指令的段地址

(2) CS存放指令的段地址,IP存放指令的偏移的地址

(3)8086机器,任意时刻,cpu将CS:IP指向的内容当做指令执行。

 

 

11:

posted @ 2016-11-15 22:26  佩喻幻  阅读(522)  评论(0编辑  收藏  举报