表示指令操作数所在的方法称为寻址方式
立即寻址方式:操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段,可以是8位也可以是16位,如果立即数是16位则按“高高低低”的原则存放,例如MOV AX,1234H,这种寻址方式主要用于给寄存器或存储单元赋值的场合
寄存器寻址:操作数在CPU内部的寄存器中,指令中指定寄存器号,对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP等,对于8位操作数,寄存器可以是AL,AH,BL,BH,CL,CH,DL,DH,例如MOV SI,AX和MOV AL,DH,由于操作数在寄存器中,不需要通过访问存储器来取得操作数,所以采用这种方式寻址指令执行速度较快
直接寻址:操作数在存储器中,指令直接包含有操作数的有效地址,操作数一般存放在数据段,所以操作数的地址由DS加上指令中直接给出的16位偏移值得到,如果采用短跨越前缀,则操作数也可在数据段外的其他段中,例如MOV AX,[1234H],MOV ES:[5678H],BL,这种寻址方式常用于单个存储器变量的情况,可以实现64K字节的段内寻找操作数,直接寻址的操作数通常是程序使用的变量
寄存器间接寻址:操作数在寄存器中,操作数的有效地址EA在SI,BX,DI,BP这4个寄存器之一种,在一般情况(即不使用段跨越前缀声明指定的寄存器)下,如果有效地址在SI,DI,BX中,则以DS段寄存器之内容为段值,如果有效地址在BP中,则以SS段寄存器之内容为段值,例如MOV AX,[SI] 或 MOV DL,CS:[BX],这种寻址方式可以用于表格处理,在处理完表中的一项后,只要修改指针寄存器的内容就可以方便的处理表中的另一项
寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(DI,SI)内容加上指令中给出的8或16位偏移量之和,在一般情况下(即不使用段跨越前缀明确指定寄存器)下,如果SI,DI,BX之内容作为有效地址的一部分,那么引用的段寄存器为DS,如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS,在指令中给定的8或16位位移量采用补码表示,在计算有效地址时,如果位移量为8位,则该带符号被带符号扩展成16位,当所得到的有效地址超越FFFFH,则取其64K的模,例如MOV AX,[DI + 1234H]和MOV BX,[BP - 4]和MOV ES:[BX + 5],A,这种寻址方式同样可以用于表格处理,表格的所有地址可以设置为指令中的偏移,这种方式很有利于实现高级语言对结构或记录等数据类型实施操作,书写基址变址寄存器寄存器名一定要放在括号中,而位移可不写在方括号中,例如MOV AX,[SI + 3]和MOV AX,3[SI]
基址变址寻址:操作数在存储器中,操作数的有效地址是由基址寄存器之一的内容与变址寄存器之一的内容相加得到的,在一般情况(即不使用段跨越前缀)下,如果BP之内容作为有效地址的一部分,则SS为段值,否则为DS寄存器,例如MOV AX,[BX + DI],这种方式适用于数组或表格处理,用基址寄存器存放数组首地址,而变址寄存器来定位数组各元素,MOV AX, [BX + DI]与MOV AX,[DI][BX]
基址变址相对寻址:操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器的和8或16位偏移量相加得到,在一般情况(即不使用段跨越前缀)下,如果BP之内容作为有效地址的一部分,则SS为段值,否则为DS寄存器,指令中给出偏移量采用补码表示,如果位移量为8位,则该带符号被带符号扩展成16位,当所得到的有效地址超越FFFFH,则取其64K的模,例如:MOV AX,[BX + DI + 2]
传送指令MOV
举例:
MOV DST,SRC
指令功能:
把一个字节或一个字从SRC送至操作数DST
指令寻址方式:
源操作数可以是累加器、寄存器、存储单元、立即数,目的操作数可以是累加器、寄存器和存储单元,传送不改变原操作数
对标志位的影响:
无
指令长度和执行时间:
相关约束:
源操作数和目的操作数不能同时是段寄存器,代码段寄存器不能作为目的,指令指针IP即不能做源,也不能做目的,立即数不能直接传送到段寄存器,也不能做目的操作数,源操作数和目的操作数类型要一致,除了串操作指令外,源操作数和目的操作数不能同时是存储器操作数
交换指令XCHG
举例:
XCHG OPRD1,OPRD2
指令功能:
把OPRD1,OPRD2内容交换
指令寻址方式:
OPRD1,OPRD2可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有利技术
对标志位的影响:
指令长度和执行时间:
相关约束:
地址传送指令LEA:
举例:
LEA REG,OPRD
指令功能:
吧OPRD的有效地址送到REG
指令寻址方式:
操作数OPRD必须是一个存储器操作数,REG必须是一个16位通用寄存器
对标志位的影响:
指令长度和执行时间:
相关约束:
指令LDS:
举例:
LDS REG,OPRD
指令功能:
把操作数OPRD中所含的一个32位地址指针的段值部分送到段寄存器DS,把偏移部分送到REG
指令寻址方式:
操作数OPRD必须是一个32位的存储器操作数,操作数REG可以是一个16位通用寄存器,但实际使用往往是变址寄存器或指针寄存器,32位地址指针的偏移部分存储在双字变量的地字中,段值在高字中
对标志位的影响:
指令长度和执行时间:
相关约束:
指令LES
举例:
LES REG,OPRD
指令功能:
吧操作数OPRD中所含的32位地址的段值送ES,偏移送REG,详细说明见LDS
指令寻址方式:
对标志位的影响:
指令长度和执行时间:
相关约束:
堆栈:堆栈是一段RAM区域,成为栈底的一段地址大,栈顶地址小,堆栈的段值在SS中,SP始终指向栈顶,进出栈操作都是以字为单位的
堆栈主要用途:
1. 现场和返回地址保护
2. 寄存器内容保护
3. 传递参数
4. 存储局部变量
进栈指令PUSH
举例:
PUSH SRC
指令功能:
SP减2,然后把SRC送入由SP所指向的栈顶
指令寻址方式:
SRC可以是通用寄存器,段寄存器和字存储单元
对标志位的影响:
指令长度和执行时间:
相关约束:
出栈指令POP
举例:
POP DST
指令功能:
从栈顶弹出一个字数据到DST,先弹出数据然后SP加2
指令寻址方式:
DST可以是通用寄存器,段寄存器但不包括CS,也可以是字存储单元
对标志位的影响:
指令长度和执行时间:
相关约束: