汇编学习2:寄存器

目录

寄存器:

 字在寄存器中的存储:

16位的CPU:

CS和IP:

修改CS和IP:


寄存器:

在CPU内部也有许多器件如:运算器、控制器、寄存器。他们通过内部总线来进行传输数据,上一节中的总线称为外部总线。

8086CPU一共有16个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。他们都是16位的,也就是可以存储16位的数据(2字节)。其中AX、BX、CX、DX位通用寄存器,用来存储一般数据。

 这些寄存器为了与上一代的8位寄存器进行兼容,所以又分成了高位和低位。

 以存储数据807FH为例:80存在AH中,7F存在AL中。

 字在寄存器中的存储:

 一个字节为8位,8bit,1Byte。一个字为2字节。16位,刚好可以存在8086CPU一个通用寄存器(16位)中。

 考虑以下代码的输出结果:

mov ax, 8226H
mov bx, 8226H
add ax, bx

 此时:8226H+8226H = 1044CH,但是8086CPU寄存器只有16位,仅能存储4个十六进制的数字。因此1会被舍去,最后ax寄存器中存储的值位044CH。

另外需要注意的是:当使用低8位的al进行计算时,如果产生进位,同样也是舍弃,但不是真的舍弃(这个会在后面学到)。al只会进行8位的计算。

 例题:使用add、mov指令编写计算2的4四次方

mov ax, 2
add ax, ax
add ax, ax
add ax, ax

16位的CPU:

一次存储、处理、传输的数据只有16位。那么从8086CPU发出的地址信息只又2的16次方个存储单元,一次寻址64KB。外部地址总线宽度却为20,达到了1MB的寻址能力。所以8086CPU使用了两个16位的地址进行左移再相加的方法来提供20位的地址。

两个16位地址:一个称为段地址,一个称为偏移地址。先将段地址*16(或者称为左移4位,在2进制中左移一位相当于×16,在10进制中左移1位相当于×10,所以左移之后的数字为原来的倍数为:T = M(位数)*N(进制),左移之后再相加:如1230H+00CBH, 左移1230H-->12300H+00CB = 123CBH.这里生成的地址是内存中的物理地址(实实在在存在内存中的地址。)

可有:

物理地址 = 段地址*16(基础地址)+偏移地址

 需要注意的是:在8086CPU中,由于CPU是16位的,所以最大的偏移地址为64KB,0000H~FFFFH。段地址都是16的整数倍。同时CPU可以给出不同的地址组合成同一物理地址。8086CPU的寻址一般表示为:段地址:偏移地址。如123CBH表示为:1230H:00CBH

CS和IP:

CS为段地址寄存器,IP为指令指针寄存器。8086CPU一共有4个段寄存器,CS是其中的一个。使用CS:IP(即CS中的段地址*16+IP中的地址)来进行指令的执行。这也是为什么CPU可以将内存中的指令和数据分开的原因。(使用不同的寄存器来区分)

修改CS和IP:

不可通过mov指令来修改,原因很简单,8086就没有这么设计。现在介绍一个最简单的修改CS和IP值的汇编指令:jmp。用法:jmp 段地址:偏移地址

如:jmp 1200:3C 则CS = 1200H,IP=003CH,寄存器将读取1203CH中的指令。还可以jmp 某一合法寄存器,如: jmp ax 意味将ax中的值赋予给IP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值