读王爽—汇编语言第二版,略有所得,写下来以便查阅
8086 的可拆分数据寄存器,
AH&AL=AX:累加寄存器,常用于运算;
BH&BL=BX:基址寄存器,常用于地址索引;如果寻址,默认段地址在DS中
CH&CL=CX:计数寄存器,常用于计数;
DH&DL=DX:数据寄存器,常用于数据传递。
地址寄存器/段地址寄存器
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
特殊功能的寄存器
IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; 段地址默认在SS中
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; 默认段地址在DS中
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针;默认段地址在DS中
只有bx,bp,si,di这四个寄存器可用来作为偏移地址寻址。且bx和bp不能同时使用,si和di不能同时使用
MOV指令有一些规则如下:
1、两个操作数尺寸必须相同
2、两个操作数不可同为内存
3、目的操作数不可为CS,EIP和IP
4、立即数不可直接传送至段寄存器
retf和ret的区别在于retf比ret多了个pop cs(从栈取一个数据覆盖到cs寄存器)
方案:调用同一个代码段的以retf返回的过程前,手动把cs入栈 push cs
offset伪指令可以计算某标示符与该标示符所在的段的偏移
movsb,movsw,movsd是串传输指令,用于复制一段连续的内存
用法:
mov ax,_源数据所在的段
mov ds,ax
mov ax,_目标数据所在的段
mov es,ax
mov si,_源数据相对于所在的段的偏移
mov di,_目标数据相对于所在的段的偏移
mov cx,_要复制的内存单元数,单元的大小应movsb,movsw,movsd而不同
cld_设置方向,cld为以ds:si,es:di中的si+1和di+1递增,std为递减
rep movsb
除法溢出中断会调用中断号为0的处理程序,且执行完该过程用iret返回中断后,下一条指令仍然是导致除法溢出的div指令,会导致除法溢出中断重复发生
方案:在中断过程中退出整个程序或改变栈中被入栈的ip指针,使中断过程执行完返回后的下一条指令不再是导致除法溢出的div指令
在设置屏蔽可屏蔽中断后到设置允许中断前,不要以任何方式调用中断或使中断发生,否则总是有些奇奇怪怪的问题