美文网首页
汇编复习-寄存器

汇编复习-寄存器

作者: NoviceQAQ | 来源:发表于2018-08-09 00:13 被阅读0次

加班再晚,该看的汇编还是得看完。if you're struggling,that means you're progressing.看书时不写废话


一个典型的CUP是由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。在CUP中:

  • 运算器进行信息处理;
  • 寄存器进行信息存储;
  • 控制器控制各个器件进行工作;
  • 内部总线连接各种器件,在它们之间进行数据的传送。

8086CPU共有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。程序员通过改变各种寄存器中的内容来实现对CPU的控制。

通用寄存器(AX、BX、CX、DX)

8086CPU的所有寄存器都是16位的,和数据总线一样同为16位,可以存放两个字节AX、BX、CX、DX用于存放一般的数据,被称为通用寄存器。一个寄存器能存储的最大值为1111111111111111(二进制),65535(十进制)。
每个寄存器都能分为两个独立使用的8位寄存器来使用,例如AX可分为AH和AL。

注意16位寄存器被拆分为8位后16进制的变化

字在寄存器中的存储

8086CPU可以一次性处理以下两种尺寸的数据。1、字节(byte),一个字节由8个bit组成;2、字(word),一个字由两个字节组成。
这里说下数制,通常我们使用十六进制来表示一个数据,因为4位二进制数代表一位16进制数,这样看起问题来更为直观。比如二进制0100111000100000可表示为4(0100)、E(1110)、2(0010)、0(0000)十六进制数,如果这个数据在AX中,那么AH为4E、AL为20

几条汇编指令

汇编指令 控制CPU完成操作 用高级语言的语法描述
mov ax,18 将18送入寄存器AX AX=18
mov ah,78 将78送入寄存器AH AH=78
add ax,8 将寄存器AX中的数值加上8 AX=AX+8
mov ax,bx 将寄存器BX中的数据送入寄存器AX AX=BX
add ax,bx 将AX和BX中的数值相加 AX=AX+BX

注意:
1、当ax = 8226;bx = 8226执行指令add ax,bx把bx的数据加入ax。ax = 8226 + 8226 = 1044C,但是ax为16为寄存器,只能存放4位十六进制数据所以ax的数据位944C。如果使用的是ah、al8位寄存器,和十六位也是同理。
2、在使用汇编进行数据传送或运算时,注意指令的两个操作对象的位数应当是一致的。比如8位寄存器应该和8位寄存器或者8位寄存器最大值255的数据进行运算;16位寄存器应该和16位寄存器或者16位寄存器最大值65535的数据进行计算。

物理地址

每一个内存单元在存储空间中都有唯一的地址,我们将这个地址称为物理地址。在CPU向地址总线上发出物理地址之前,必须在内部形成这个物理地址。

16位结构的CPU

8086的CPU为16位结构的CPU,特征如下:

  • 运算器一次最多可以处理16位数据
  • 寄存器的最大宽度为16位(如AX)
  • 寄存器和运算器之间的通路为16位(数据总线16位)

8086CPU给处物理地址的方法

8086有20位地址总线,也就是达到2^20*8bit(每个内存单元的大小)=1MB的寻址能力。但是8086又是16位结构在内部一次性处理、传输、暂时存储的地址位16位地址,也就是只达到64KB的殉职能力。

8086CPU采用了地址加法器将2个16位地址合成为一个20位物理地址。

8086CPU相关部件得逻辑结构

地址加法器采用物理地址=段地址×16+偏移地址的方法合成物理地址。

打比方
从学校到图书馆的距离位2826米。

学校到图书馆的距离

当同学A用纸条告诉同学B距离时候,可以在纸条上写入2826。但是如果纸条有两张,但每张纸条只能写三个数字的时候,可以在第一张纸条写入200,第二张纸条写入826,然后约定第一张纸条×10后与第二张纸条相加,200×10+826=2826米。

段地址×16
段地址×16有个更为常用的说话是二进制左移4位,用二进制举例如下:

左移位数 二进制 十六进制 十进制
0 10 2 2
1 100 4 4
2 1000 8 8
3 10000 10 16
4 100000 20 32

故地址加法器的工作过程如下图所示:

地址加法器工作过程

段的概念

CPU使用将内存分段的方式来管理内存。例如:10000~100FF内存单元组成一个段,该段的段地址为1000H(根据公式段地址左移4位与偏移地址相加得到的物理地址)大小为100H(0~FF,为FF+1=100)

分段

因为数据可以通过不同的段地址和偏移地址指向同一物理地址(段地址2000H,偏移地址1F60H 或者 段地址2100H,偏移地址0F60H),故在描述中可以写为:

  • 数据存在内存2000:1F60单元中。
  • 数据存在内存的2000H段中的1F60H单元中。

段寄存器(CS、SS、DS、ES)

如要访问内存时需要提供段地址和偏移地址。段地址在段寄存器中存放。8086CPU有4个寄存器(CS、SS、DS、ES)

CS和IP

CS和IP时8086CPU中最关键的寄存器,CS为代码段寄存器,IP为指令指针寄存器,在任意时刻,CPU将CS:IP(CS×16+IP)指向的内容当作指令执行。
运算时运行过程如下:

1 2 3 4 5 6 7 8

在8086CPU加电启动或复位后,CS和IP被设置为CS=FFFFH, IP=0000H,即在开机启动时,CPU从内存FFFF0H单元中读取第一条指令开始执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

修改CS、IP的指令

我们通常使用mov指令来修改通用寄存器的值,但是不能用该指令修改CS、IP的值。能够改变CS、IP的内容的指令统称为转移指令。
jmp指令

  • jmp 2AE3:3,执行后,CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
  • 若只想修改IP的值,可以“jump 某一合法寄存器”
jmp ax AX CS IP
执行前 1000H 2000H 0003H
执行后 1000H 2000H 1000H

代码段

将若干地址连续的内存单元看作一个段,根据公式“物理地址=段地址×16+偏移地址”那么:

  • 段的起始地址一定是16的倍数。
  • 偏移地址为16位,16位地址的寻址能力为2^16=64KB,所以一个段的最大长度为64KB。

将一段内存当作代码段,仅是我们在编程时的一种安排,若要让CPU执行我们放在代码段中的指令,必须将CS:IP指向我们定义代码段的首地址。

相关文章

  • 汇编复习-寄存器

    加班再晚,该看的汇编还是得看完。if you're struggling,that means you're pr...

  • 有关汇编相关参考博客

    汇编之常识(一)汇编基础 CPU等硬件结构 数据总线 地址总线 控制总线 汇编之寄存器(二)寄存器 数据地址寄存器...

  • IOS arm64常用的汇编

    导论 生成汇编文件 寄存器 arm64 汇编条件域 arm64 汇编指令 总结 1. 生成汇编文件 2. 寄存器 ...

  • ARM64 学习

    iOS汇编 真机 arm64汇编,GNU 模拟器 x86, AT&T 汇编 寄存器 指令 堆栈 通用寄存器 64b...

  • 汇编复习-寄存器(内存访问)

    看书时不写废话 内存中字的存储 16位寄存器可以储存一个字,一个字为2个字节,而内存一个单元只能存储一个字节(8b...

  • Windows汇编(2)Win64汇编

    Win64汇编 - 寄存器

  • 00-汇编语言

    程序的本质 寄存器与内存 编程语言的发展 汇编语言的种类 常见的汇编指令 寄存器 有16个常用寄存器rax、rbx...

  • 认识ARM64汇编

    [TOC] 之前说过学习汇编就是学习寄存器和指令,查看代码请连接真机。 寄存器 在arm64汇编中寄存器是64bi...

  • 汇编基础

    汇编指令速查 汇编中各寄存器的作用4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和E...

  • 汇编简介

    学习汇编两大知识点:1.汇编指令2.寄存器 64bit:RAX \RBX\RCX\RDX :通用寄存器32bit:...

网友评论

      本文标题:汇编复习-寄存器

      本文链接:https://www.haomeiwen.com/subject/bqrzvftx.html