寄存器
众所周知 一个CPU的构成是由运算器 控制器 寄存器等器件构成的,比如静待你的8086CPU中,有14个寄存器,每个寄存器都有一个名称:AX,BX,CX,DX,SI,DI,SP,BP,IP,CSSS,DS,ES,PSW
2.1通用寄存器
8086CPU的寄存器都是16位的可以存放两个字节,每一位都可以是0和1,比较常用的,用来存放一般数据的寄存器叫做通用寄存器,如8086CPU里面的AX,BX.CX.DX.
以AX为例,如图所示,其逻辑结构如图所示:
每一位都可以存放两个数字,所以其表示的最大值是16位全1,也就是2的16次方 64k
但是在8086的上一代CPU的寄存器都是8位的,所以8086的一个通用寄存器可以拆成两部分来用,第8位,也就是第0-第7位 叫做AL ,高8位:也就是第8位-第15位叫做AH;
根据上面所计算的一个8位的通用寄存器可以存放的最大数值为2的八次方 也就是 256bit
举个例子:在一个16位的寄存器里面存放的数字是:
100111000100000
将其拆解为 8位的 从低8位开始拆解:00100000 这就是AL表示的值:32 (20H)
其高8位的值位 01001110 这就是AH表示的值:78 (4EH)
16位总的表示为:20000(4E20H)
2.2 几条汇编指令
汇编指令 | 控制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=AX+BX |
2.2.1 简单的计算:
假设AX中初始值为:0000H,BX:0000H
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov ax,4E20H | 4E20H | 0000H |
add ax,1406H | 6226H | 0000H |
mov bx,2000H | 6226H | 2000H |
add ax,bx | 8226H | 2000H |
mov bx,ax | 8226H | 8226H |
add ax,bx | ? | 8226H |
来让我们计算一下 ?应该填多少?
1044BH
是不是很简单?简单的16进制加分!
2.2.2进阶简单的计算:
还是以AX:0000H BX:0000H
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
---|---|---|
mov ax,001AH | 001AH | 0000H |
mov bx,0026H | 001AH | 0026H |
add al,bl | 0040H | 0026H |
add ah,bl | 2640H | 0026H |
add bh,al | 2640H | 4026H |
mov ah,0 | 0040H | 4026H |
add al,85H | 00C5H | 4026H |
add al,93H | ? | 4026H |
来求一下?吧
00158H 错咯~
由于这里的寄存器只有16位 也就是说 158(AL与93H相加之后的低位)只能容纳第2位,所以1被舍去,所以这里保留58H 所以答案是 0058H ! 这里的1其实并没有被CPU丢弃哦(这里以后再讲)
注: 在进行汇编指令的编写时,要注意操作对象的位数要一致:
如: mov ax,bl mov ax,bh mov ah,bx mov al 2000,mov al,100H等都是错误的
下一篇讲解8086的寻址方法以及其他寄存器~!