8086汇编的一些知识点的备忘

来源:互联网 发布:php soapheader详解 编辑:程序博客网 时间:2024/05/14 19:06

读王爽—汇编语言第二版,略有所得,写下来以便查阅


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指令


在设置屏蔽可屏蔽中断后到设置允许中断前,不要以任何方式调用中断或使中断发生,否则总是有些奇奇怪怪的问题



0 0