Loading... # 基本指令系统 ## 传送类指令 把数据、地址或立即数从一个存储位置搬运到另一个存储位置(相对于高级语言里的赋值语句) * 通用数据传送:MOV、PUSH、POP * 地址传送:LEA、LDS、LES ### 1. 数据传送类指令(MOVE) 格式:MOV DSET, SRC 可以使用各种寻址方式,但两个操作数中**只允许有一个为存储器寻址**,因此若要实现两个内存单元间的数据传送,必须通过两条数据传送指令实现,使用寄存器作为数据传送的中转站 eg:把DA_WORD1字单元的内容传送到DA_WORD2字单元中 ~~~assembly MOV AX, DA_WORD1 MOV DA_WORD2, AX ~~~ #### 立即数传送 ~~~assembly MOV AL, 4 // 字节传送 MOV CX, 0ffh // 字传送 MOV byte ptr [si], 0ah // byte ptr说明是字节操作 MOV word ptr [si+2], 0bh // word ptr说明是字操作 ~~~ 没有使用寄存器寻址的指令中,必须指明内存单元的类型(字or字节),否则数据类型会出现二义性,汇编出现警告错误! #### 寄存器之间数据传送 ~~~assembly MOV AX, BX // 字传送 MOV AH, AL // 字节传送 ~~~ #### 寄存器与存储器之间数据传送 ~~~assembly MOV DX, [BP] MOV DL, [SI] ~~~ **MOV数据传送方向** ![image-20220328110941302.png](http://xherlock.top/usr/uploads/2022/04/675978542.png) **TIP**: * 两个操作数数据类型要相同,8或16位 * 立即数不能作为目的操作数 * 指令指针IP不能作为MOV指令的操作数 * 两个操作数不能同时为存储单元,eg:MOV VAR1, [1000H]错误 ### 2. 交换指令(Exchange) 格式:XCHG DEST, SRC(不能使用立即数) #### 寄存器间交换 ~~~assembly XCHG AX, BX XCHG AL, AH ~~~ #### 寄存器与存储器交换 ~~~assembly XCHG AX, [2000H] // 字交换 XCHG AL, [2000H] // 字节交换 ~~~ 同数据传送指令一样,两个操作数不能均在内存中,要想交换可以这样 eg:将字节存储单元DAB1,DAB2内容交换 ~~~assembly MOV AL, DAB1 XCHG AL, DAB2 MOV DAB1, AL ~~~ ### 堆栈操作指令 #### 8086/8088堆栈的组织 * **SP所指向地址称为堆栈的栈顶,存放栈顶偏移量** * 堆栈存放的是**字数据**,16位数据的低8位存放在低地址单元,高8位存放在高地址单元 * 完成初始化后,栈顶地址高于栈底地址,因为堆栈中无数据,为一个空栈 ![image-20220411082539079.png](http://xherlock.top/usr/uploads/2022/04/3509079657.png) * 每次入栈。SP-2(32位时-4) * 为避免堆栈溢出,要设置最大堆栈空间 * 存取原则:**后进先出** #### 入栈指令 格式:PUSH SRC(通用寄存器或字存储单元的内容) 把源操作数压入堆栈,是单操作数指令(其实使用了一个隐含操作数,在堆栈中) 1. SP-2→SP:先修改栈顶指针,使它向低地址移动一个字单元 2. (SRC)→(SP):把数据保存至SP指向的字存储单元 ![image-20220411083859838.png](http://xherlock.top/usr/uploads/2022/04/432725950.png) #### 出栈指令 格式:POP DEST 把栈顶数据取出,保存到目的地址中,是单操作指令,同PUSH 1. (SP)→DEST:把SP当前指向的栈顶数据送到指定地址保存 2. SP+2→SP:修改栈顶指针,使它向高地址移动一个字单元 ![image-20220411090550124.png](http://xherlock.top/usr/uploads/2022/04/3657962827.png) ### 标志位传送指令 #### 取标志指令 格式:LAHF 功能:AH←(FR) 7-0,是无操作数指令,使用了两个隐含操作数,由机器指令的OPCODE指定 ![image-20220411090908996.png](http://xherlock.top/usr/uploads/2022/04/4229783894.png) #### 存标志指令 格式:SAHF 功能:FR 7-0←(AH),无操作数指令,影响标志位:SF、ZF、AF、PF、CF ![image-20220411091047698.png](http://xherlock.top/usr/uploads/2022/04/2926680524.png) ### 地址传送指令 #### 装入有效地址指令 格式:LEA DEST, SRC 功能:DEST←SRC的有效地址,即将源操作数的有效地址送到目的地址保存 **LEA指令的源操作数必须是内存操作数**,只有内存操作数的寻址方式中才有有效地址(偏移量) **目的操作数只能是16为的通用寄存器**,因为有效地址是一个16位的无符号二进制编码 ## 算术运算类指令 ### 加法指令 格式:ADD DEST, SRC 功能:DEST←(DEST)+(SRC),影响标志位 * 两个操作数单位必须一致(字或字节) * 源操作数可以为通用寄存器、内存单元、立即数 * 目的操作数可以为通用寄存器、内存单元 * 最多一个内存操作数 ### 加1指令 格式:INC DEST 功能:DEST←(DEST)+1,影响标志位 目的操作数可为通用寄存器、内存单元 ### 减法指令 格式:SUB DEST, SRC 功能:DEST←(DEST)-(SRC),影响标志位 ### 减1指令 格式:DEC DEST 功能:DEST←(DEST)-1,影响标志位 ### 求相反数指令 格式:NEG DEST 功能:DEST←0-(DEST),影响标志位,相当于求补操作 ### 比较指令 格式:CMP DEST, SRC 功能:(DEST) - (SRC),影响标志位 CMP指令的执行过程、对操作数的要求、对标志位的影响与SUB指令完全一致,但是不保存运算结果,只关心两个数的关系(标志位状态) **通常用来和条件转移指令配合使用**,实现程序的分支或循环结构 最后修改:2022 年 05 月 07 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏