x86处理器架构
架构图.jpg寄存器
- AX:通用寄存器,低8位为AL寄存器,高8位为AH寄存器。一般是累加寄存器。
- BX:通用寄存器,低8位为BL寄存器,高8位为BH寄存器。一般还是基址寄存器。
- CX:通用寄存器,低8位为CL寄存器,高8位为CH寄存器。一般作循环计数器。
- DX:通用寄存器,低8位为DL寄存器,高8位为DH寄存器。一般还用于与外设进行数据交换。
- CS:代码段寄存器。
- IP: 代码段指针寄存器。只有处理器才能改变它的内容。
- ES:附加段寄存器。
- DS:数据段寄存器。
- SS:栈段寄存器。
- SP:栈段指针寄存器。
- SI:源索引寄存器。
- DI:目标索引寄存器。
-
EFLAGS:存放CPU的2类标志的寄存器。
- 状态标志:反映处理器当前的状态。
- 控制标志:用来控制处理器的工作方式。
状态标识每次运算后自动产生,控制标志的值则有指令设置。
标志 | 意义 |
---|---|
OF | 溢出标志;OF=1表示2个有符号数运算超出可表示范围。 |
DF | 方向标志(迭代方向,类比i++或者i--);执行指令后,源或目的指 针加法还是减法。OF=1表示减法 |
IF | 中断允许标志;IF=1表示CPU响应终端信号。 属于控制标志 |
SF | 符号标志;SF=1标识运算结果最高位为1。 |
ZF | 零标志;ZF=1表示结果为0 |
AF | 辅助进位标志 |
PF | 奇偶标志;进行奇偶校验。PF=1表示低8位中有偶数个1。 |
CF | 进位/错位标志; |
TF | 单步状态标识,用于程序调试,TF=1,每次执行一条指令会暂停。 属于控制标志 |
常用指令
-
mov 指令:
mov 目的, 源。
这里注意:- mov es,0xb800。这种写法是错误的,intel不允许将一个立即数传给* 段寄存器*。必须写2条指令:mov ax ,0xb800。mov es,ax。
- mov [0x01], [0x02]。这种写法也是错误的,处理器不允许在2个内存单元之间直接进行数据传输的操作。
-
movsb 指令
movsb和movsw用于把内存中的一个地方数据批量地传送到另一个地方。原始数据串地址由【DS】:【SI】指定,目标数据串地址由【ES】:【DI】指定,个数由CX指定。传送方向EFLAGS寄存器中的DF标志指定。DF=0,表示正向传送,SI和DI加1或加2(低地址到高地址)。DF=1表示反向传送,类比。 -
inc和dec 指令:
inc表示自增,dec表示自减。
inc al。
inc byte [ax]。 -
AND 指令:
与运算,有0得0,全1为1。
AND指令会影响EFLAGS:OF和CF位被清零,SF ZF PF位状态依计算结果而定,AF状态未定义。
-
OR 指令:
或运算,有1得1,全0为0。
OR指令会影响EFLAGS寄存器:OF和CF位被清零,SF ZF PF位状态依计算结果而定,AF状态未定义。 -
XOR 指令:
异或:相异为1,相同为0。
例如:xor dx, dx。 则将dx和dx异或结果存放在dx中。这条指令可以将dx清零。同样效果的指令:mov dx,0。但是前者机器码是31 D2,后者的机器码是BA 00,00。xor指令不但更短,并且2个操作数都是通用寄存器,执行速度更快。 -
shr逻辑右移指令:
逻辑右移指令执行时,会将操作数连续地向右移动指定位数,每移动一次, “挤”出来的比特位被移到标志寄存器的CF位,左边空出来的补0。 -
shl逻辑左移指令:
和逻辑右移指令类似,会将操作数连续地向左移动指定位数,每移动一次,“挤”出来的比特位被移到标志寄存器的CF位,右边空出来的补0。 -
rol 循环右移指令:
-
rol 循环左移指令:
-
DB 等指令:
- DB的意思是声明字节(8)数据,跟在它后面的操作数都占一个字节的长度。例如:DB 0
- DW指令:用于声明字(16)数据。
- DD指令:用于声明双字(32)数据。
- DQ指令:用于声明四字(64)数据。
这一系列的指令都属于伪指令,伪指令没有对应的及其指令,仅仅在编译阶段由编译器执行。程序执行时,伪指令已经不存在。
-
DIV 指令:
8086处理器提供2种类型的除法:- 16位二进制除以8位二进制
- 被除数:AX寄存器提供。
- 除数:通用寄存器或者内存单元提供。
- 商:存在AL寄存器中。
- 余数:存在寄存器AH中。 - 32位的二进制数除以16位的二进制数
- 被除数:高16位在DX中,低16位在AX中。
- 除数:通用寄存器或者内存单元提供。
- 商:存在AX寄存器中。
- 余数:存在DX寄存器中。
- 16位二进制除以8位二进制
-
in 指令:
in指令是从端口读,只有:
in al(端口号), dx;
in ax(端口号),dx;
in al(端口号),0xf0;
也就是说in指令的目的操作数必须是寄存器AL或者AX(8位的端口就是AL,16位的端口就是AX)。同时,in指令的源操作数应该是寄存器DX或者立即数(端口号)。 -
out 指令:
out指令向通过端口向外围设备发送数据。和in指令相反源操作操作数是AL或AX,目的操作数是立即数(端口号)或者DX。
out 0x37(端口号),al
out dx(端口号), ax
寻址方式
- 寄存器寻址
- 立即数寻址
- 内存寻址
其实就是指令中提供偏移地址,加上段寄存器最后形成地址。- 直接寻址(操作数是一个偏移地址)
- 基址寻址
用基址寄存器BX或者BP来提供偏移地址。采用BX基址寄存器时,默认 段寄存器是DS,采用BP基址寄存器时,默认的寄存器是SS。
网友评论