汇编指令手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8086/8088指令系统
8086/8088的指令系统丰富,而且指令的功能也强。
大多数指令既能处理字数据,又能处理字节数据;
算术运算和逻辑运算不局限于累加器,
存储器操作数也可直接参加算术逻辑运算。
8086/8088的指令系统可分为如下六个功能组:
(1)数据传送
(2)算术运算
(3)逻辑运算
(4)串操作
(5)程序控制
(6)处理器控制
汇编语言语句的一般格式。指令语句可由四部分组成,一般格式如下:[标号:] 指令助记符[操作数1] [操作数2] [;注释]
指令是否带有操作数,完全取决于指令本身标号的使用取决于程序的需要,
标号只被汇编程序识别,它与指令本身无关。
(一)数据传送指令
数据传送指令组又可分为:传送指令,交换指令,地址传送指令,堆栈操作指令,标志传送指令,查表指令,输入输出指令在有关章节介绍。
除了SAHF和POPF指令外,这组指令对各标志没有影响。
1,传送指令
其格式如下:MOV DST,SRC
目的,源
源操作数可以是累加器,寄存器,存储单元以及立即数,
而目的操作数可以是累加器,寄存器和存储单元。传送不改变源操作数。
传送指令能实现下列传送功能:
(1)CPU内部寄存器之间的数据传送。例如:
MOV AH,AL
MOV DL,DH
MOV BP,SP
MOV AX,CS
注意:源和目的操作数不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP即不能作为源,也不能作为目的。注意,这种例外永远存在。
(二)交换指令
利用交换指令可方便地实现通用寄存器与通用寄存器或存储单间的数据交换,交换指令的格式如下:
XCHG OPRD1,OPRD2
此指令把操作数OPRD1R的内容与操作数OPRD2的内容交换。操作数同时是字节或字。
例如:
XCHG AL,AH;XCHG SI,BX
OPRD1和OPRD2可是通用寄存器和存储单元。但不包括段寄存器,也不能同时是存储单元,还不能有立即数,可采用各种存储器寻址方式来指定存储单元。例如:XCHG BX,[BP+SI] 如指令执行前:
(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246)=4154H 物理地址=2F000+0200+0046=2F246H
指令执行后:(BX)=4154H (2F246H)=6F36H
此指令不影响标志位
(三)地址传送指令
80686/8088有如下三条地址传送指令。
(1)指令LEA (Load Effective Address)
指令LEA称为传送有效地址指令,其格式如下:
LEA REG,OPRD
该指令把操作数OPRD的有效地址传送到操作数REG
操作数OPRD必须是一个存储器操作数,
操作数REG必须是一个16位的通用寄存器。
例如:
LEA AX,BUFFER ;BUFFER是变量名
LEA DS,[BS+S]
LEA SL,[BP+DI+4]
例如:LEA BX,[BX+SI+0F62H]
如指令执行前(BX)=0400H,(SI)=003CH
指令执行后(BX)=0040+003C+0F62=139EH
(2)指令LDS (Load pointer into DS)
段值和段内偏移构成32位的地址指针。
该指令传送32位地址指针,其格式如下:
LDS REG,OPRD
执行的操作:(REG)←(SRC)
(DS)←(SRC+2)
该指令把操作数OPRD中所含的一个32位地址指针的段值部分送到数据段寄存器DS,把偏移部分送到指令给出的通用寄存器REG。
操作数OPRD必须是一个32位的存储器操作数,
操作数REG可以是一个16的通用寄存器,但实际使用的往往是变址寄存器或指针寄存器。
LDS SL,POINTER ;POINTER是一个双字变量
假设双字变量POINTER包含的32位地址指令的段值为5678H,偏移为1234H,那么在执行指令后:
(DS)=5678H,(SI)=1234H
32位地址指针的偏移部分存储在双字变量的低地址字中,段值部分存储在高地址中。
例如:LDS SI,[10H]
如指令执行前:(DS)=C000H,(C0010H)=0180,(C0012H)=2000H
指令执行后:(SI)=0180H,(DS)=2000H
(3)指令LES(Load pointer into ES)
LES 指令也传送32位地址指针,其格式如下:
LES REG,OPRD
该指令把操作数OPRD中包含的32位地址指针的段值送到附加段寄存器ES,
把偏移部分送到指令给出的通用寄存器REG。
执行的操作:(REG)←(SRC)
(ES)←(SRC+2)
例如: LES DI, [BX]
如指令执行前: (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B080CH)=4000H 执令执行后(DI)=05AEH, (ES)=4000H
(四)堆栈操作指令
在80686/8088系统中,堆栈是一段RAM区域.
称为栈底的一端地址比较大,称为栈顶的一端比较小.
(高地址) (低地址)
堆栈的段值在堆栈段寄存器SS中,
堆栈指针寄存器SP始终指向栈顶.
堆栈是以”后进先出”的方式工作的一个存储区.
堆栈的存取必须以字为单位.
堆栈操作指令分为两种:
(1)进栈指令
格式如下: PUSH SRC
执行的操作: (SP)←(SP)-2
该指令把源操作数SRC压入堆栈.它先把堆栈指针寄存器SP的值减2,然后把源操作数SRC送入由SP所指指的栈顶.
源操作数SRC可以是通用寄存器和段寄存器,可以是字存储单元.
例如: PUSH AX
假设AX=2107H
(2)出栈指令POP
格式如下: POP DST
执行的操作: (SP)←(SP)+2