汇编语言5---数据寄存器与地址寄存器以及CPU取值执行过程
AX BX CX DX
AX BX CX DX是CPU内部的四个16bit的通用寄存器,常用于存储数据,也叫数据寄存器,一般用于存放参与运算的数据或运算的结果。
为了兼容更古老的CPU,他们的16bit可以分为高八位和第八位,如AH,AL。这种灵活的使用方法给编程带来极大的方便,既可以处理16位数据,也能处理8位数据。
这四个数据寄存器除了作为通用寄存器使用外,还有各自的特殊功能:
AX 寄存器称为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的I/O指令都要使用累加器与外设接口传递数据。
BX 寄存器称为基址寄存器,常用来存放访问内存时的地址。
CX 寄存器称为计数寄存器,在循环、串操作指令中用作计数器。
DX 寄存器称为数据寄存器,在寄存器间接寻址中的I/O指令中存放I/O端口的地址。
地址寄存器以及地址形成方式
上一节提到过8086内存寻址的特殊之处,即8086有20根地址线而CPU是16位的,所以地址形成方式如下:
段地址x16(10H)(左移4位)+ 偏移地址 = 物理地址
如
段地址(0~FFFF 或 0 ~1111 1111 1111 1111) 偏移地址(0 ~ F 或 0 ~1111)
F230Hx10H C8H = F23C8H (完成这个操作的部件叫做地址加法器。)
ds es ss cs (段地址寄存器) sp bp si di ip b(偏移地址寄存器)
CPU怎么区分指令和数据
8086CPU中在任意时刻,CPU将CS:IP所指向的内容全部当做指令来执行。在内存中指令和数据是没有任何区别的,都是二进制信息,CPU只有在工作的时候,通过不同种类的寄存器才能识别是数据还是指令,将指令寄存器下的信息当做指令,数据寄存器下的信息当做数据。
CS:IP指向的内存单元中的内容当做指令
CPU取值执行的过程
指令是有长度的,不同指令的长度有所不同,一个指令可以由多个字节构成
1,CPU从CS:IP所指向的内存单元取出指令,存放到 指令缓存器中
2,IP = IP + 所读指令的长度,从而指向下一条指令
3,执行指令缓存器中的内容,回到步骤1
为何要如此设计
这就要涉及到一对指令:
call and ret
code segmentstart:mov ax,stackmov ss,axmov sp,128call cpy_Bootmov ax,1001Hmov ax,1002Hmov ax,1003Hcpy_Boot:mov bx,1001h........ret
上面这段示例代码涉及到call与ret,这俩的作用都是转移,call会将call指令这条命令的下一条指令的地址保存起来(具体保存在哪里后面说)然后跳转到后面标识符所标识的程序段所在的地址。ret会将前面保存的地址拿回,并跳转到该地址上去,这就实现了函数跳转的功能。
这里其实就对应着上面所说的CPU取值执行的过程中的第二部,IP=IP+所读指令的长度。
修改CS:IP的方式:
不可以直接通过mov去修改CS:IP,可以通过jmp或者call等跳转指令
(mov指令可以修改大部分寄存器的值,比如AX、BX、CX、DX、SS、SP、DS,但是不能修改CS、IP的值,8086没有提供这样的功能。)

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
