530 likes | 656 Views
3.2 数据表示 3.2.1 数制 3.2.2 编码 3.2.3 常量表达 3.3 变量应用. 第四章 8086 指令系统. §1 概述 §2 8086 的寻址方式 §3 8086 指令系统. 语言处理程序. FORTRAN. 程序设计语言. Visual C++. 汇编语言. 机器语言. PROLOG. 类似自然语言和数学语言. 用 0 、 1 代码表示的指令。. 用助记符表示的指令。. 便于记忆. 执行速度快. 不通用. 难记忆、不通用. 例如: A=10 , B=4 ,求 A+B 的值。.
E N D
3.2 数据表示 3.2.1 数制 3.2.2 编码 3.2.3 常量表达 3.3 变量应用
第四章8086指令系统 §1 概述 §2 8086的寻址方式 §3 8086指令系统
语言处理程序 FORTRAN 程序设计语言 Visual C++ 汇编语言 机器语言 PROLOG 类似自然语言和数学语言 用0、1代码表示的指令。 用助记符表示的指令。 便于记忆 执行速度快 不通用 难记忆、不通用 例如:A=10,B=4,求A+B的值。 00111110 A=10 LD AL, 0AH ? 00001010 B=4 LD BL, 04H 00000110 C=A+B ADD AL, BL 00000100 HALT PRINT*,C 10000000 01110110 END
§1 概述 指令系统是指CPU能执行的各种指令的集合。 计算机的机器指令由若干个字节组成(一条8086的指令最多可达6字节) ,包含两部分内容: 指令操作码字段 操作数字段 指令的一般格式为: 操作码 操作数 操作数
例如:MOV AL,20H ;AL←20H ADD AL,[2000H] ;AL ← AL+(DS:2000H) SUB AL,BL ;AL ←AL-BL JMP 2000H ;指令转移到2000H处去执行 在指令中操作数可放在:指令代码中,寄存器中,也可放在存储器或I/O接口中指令中。 指令中用于说明操作数所在地址的方法——寻址方式。
§2 8086寻址方式 1. 操作数种类 立即操作数。直接书写(常用符号表示) 寄存器操作数。用寄存器名表示 存储器操作数。用[ ]表示 I/O操作数 数据操作数 立即操作数(常用符号表示) 寄存器操作数。用寄存器名表示 存储器操作数。用[ ]表示 转移地址操作数
2.有效地址EA由各种寻址方式表示的段内偏移地址称为有效地址记为EA。2.有效地址EA由各种寻址方式表示的段内偏移地址称为有效地址记为EA。 3. 段约定和段超越8086的指令系统对段地址的 基本规定。如下表
4. 数据操作数寻址方式 (1)立即寻址方式 eg:MOV AL,20H (2)寄存器寻址方式 eg:MOV AL,BL (3)直接寻址方式 eg:MOV AL,[2000H] (4)寄存器间接寻址方式 eg:MOV AL,[SI] (5)寄存器相对寻址方式 eg:MOV AL,[BX+3] (6)基址变址寻址方式 eg:MOV AL,[BP] [DI] (7)相对基址变址寻址方式 eg:MOV AL,[BX+DI+13] 存储器操作数
(1)立即寻址:操作数直接在指令中给出 (2)寄存器寻址:操作数在CPU的寄存器中 哪些寄存器可作为操作数,视指令而定。 MOV AL,67H ;AL←67H MOV AX,3478H ;AX←3478H MOV AL,COUNT ;AL←COUNT所代表的数 MOV AL,BH ;AL←BH MOV AX,CX ;AX←CX
(3)直接寻址:存储器地址直接在指令中给出,直接地址为数据段的偏移地址(3)直接寻址:存储器地址直接在指令中给出,直接地址为数据段的偏移地址 (4)寄存器间接寻址:操作数在存储器中,而存储器地址又在寄存器中。可以作为间址的寄存器: BX、SI、DI→DS段; BP→SS段。 MOV AL,[6700H] ;AL ← ( DS*16+6700H) MOV AL,ADDR ; AL ← ADDR地址中的数 MOV AL,[BX] ;AL←(DS*16+BX) MOV DL,[BP] ;DL←(SS*16+BP)
(5)寄存器相对寻址:存储器偏移地址由间址寄存器加8位或16位偏移量(补码)而成,对应的段取决于间址寄存器的约定段。(5)寄存器相对寻址:存储器偏移地址由间址寄存器加8位或16位偏移量(补码)而成,对应的段取决于间址寄存器的约定段。 MOV AL,[BX+10] ;AL←( DS*16+BX+10 ) MOV AL,[BP+0FDH ] ;AL←(SS*16+BP-3) MOV AL,[SI+67H] ;AL←( DS*16+SI+67H ) MOV AL,[DI+0FFFFH] ;AL←( DS*16+DI-1 ) 正数:高8位扩展为00H 负数:高8位扩展为FFH 8位-16位扩展:
(6)基址变址寻址:存储器偏移地址由基址寄存器加变址寄存器而成,对应的段取决于基址的约定段。(6)基址变址寻址:存储器偏移地址由基址寄存器加变址寄存器而成,对应的段取决于基址的约定段。 MOV AL,[BX+SI] ;AL←( DS*16+BX+SI ) MOV AL,[BP+DI] ;AL←(SS*16+BP+DI) MOV AL,[BX+DI ;AL←( DS*16+BX+DI ) MOV AL,[BP+SI] ;AL←( SS*16+BP+SI )
(7)基址变址寻址:存储器偏移地址由基址寄存器加变址寄存器再加8位或16位偏移量(补码)而成,对应的段取决于基址的约定段。(7)基址变址寻址:存储器偏移地址由基址寄存器加变址寄存器再加8位或16位偏移量(补码)而成,对应的段取决于基址的约定段。 MOV AL,[BX+SI+32H] ;AL←( DS*16+BX+SI+32H ) MOV AL,[BP+DI+0FDH] ;AL←(SS*16+BP+DI-3) MOV AL,[BX+DI+10 ] ;AL←( DS*16+BX+DI +0AH) MOV AL,[BP+SI+0064H] ;AL←( SS*16+BP+SI+100 )
§3 8086指令系统 传送指令 算术运算指令 逻辑运算指令 串操作指令 输入输出指令 控制转移指令 处理器指令 七类指令
约定 SRC:源操作数 DST:目的操作数 OPR:操作数 DATA:立即数 REG:通用寄存器AX、 BX 、 CX 、DX、SP、BP、SI、DI MEM:存储器[ ]:指令中存储器的表示 ( ):注释中存储器的表示
一、传送指令 CS,DS,SS,ES AX,BX CX,DX SP,BP SI,DI MOV指令不影响状态标志 DATA MEM • (一)数据传送指令 • 数据传送 • 格式:MOV DST,SRC ;DST←SRC B/W • SRC:DATA,REG,MEM,CS,DS,SS,ES • DST: REG,MEM, DS,SS,ES
2. 堆栈操作指令 … 堆栈 SP=FFFAH FFFAH FFFBH SP=FFFCH FFFCH FFFDH FFFEH SS:FFFFH 格式: PUSH SRC ;W POP DST ;W SRC:REG,MEM,CS,DS,SS,ES DST: REG,MEM, DS,SS,ES 堆栈指令不影响状态标志 栈顶 栈顶 栈顶 SP=FFFEH 栈底
3.交换指令 BX DS:2000H 0 1 …… 81 格式: XCHG OPR1,OPR2 ;OPR1 与OPR2交换 B/W OPR: REG,MEM *不影响标志位,**MEM之间不能直接交换 4. 换码指令(取表指令) 格式: XLAT或XLAT OPR ;AL←(BX+AL) B OPR: 表格首地址,可不写 *表格最大256个存储单元 eg:求0~9的平方 MOV AL,7 MOV BX,2000H XLAT
(二)地址传送指令 DS …… 1000H 00H 30H 00H 40H 格式:LEA DST,SRC ;DST←SRC的有效地址 LDS DST,SRC ;DST←(SRC),DS ← (SRC+2) LES DST,SRC ;DST← (SRC),ES ← (SRC+2) SRC:MEM, DST:REG(16位) eg: LEA BX,[1000H] ; BX ←1000H LDS SI,[1000H] ; SI ←3000H DS ←4000H
(三)标志寄存器传送指令 O D I T S Z A P C LAHF ;AH←FR的低位字节 SAHF ; FR的低位字节← AH PUSF ;堆栈←FR,并修改堆栈指针SP(即SP-2) POPF ; FR ←栈顶的一个字,并修改堆栈指针SP (即SP+2)
传送指令小结: • 只有传送指令可以对段寄存器操作以后的六类指令都不能对段寄存器操作; • 传送指令不影响标志位(标志传送指令除外)。
二、算术运算指令(一)加减指令(影响状态标志)二、算术运算指令(一)加减指令(影响状态标志) ADD DST,SRC ;DST←DWT+SRC ADC DST,SRC ;DST←DST+SRC+CF INC OPR ; OPR ← OPR+1(不影响CF) SUB DST,SRC ;DST←DST-SRC SBB DST,SRC ;DST←DST-SRC-CF DEC OPR ; OPR ← OPR-1 (不影响CF) NEG OPR ; OPR ← 0-OPR (求补,对0求补CF=0,其它CF=1,对80H求补OF=1) CMP OPR1,OPR2 ;OPR1-OPR2 加 法 B/W 减 法
对加减运算的说明 2000H FFH 01H 01,FF 00,01 02,00 FF 01 00 + + • SRC:DATA,REG,MEM; DST:REG,MEM • ADC、SBB指令常用于多字运算; • INC、DEC指令的操作数若为MEM操作数,则操作数前要加组合操作符,以说明是字操作还是字节操作; eg:INC WORD PTR [2000H] ;(2000H)=00H (2001H)=02H INC BYTE PTR [2000H] ;(2000H)=00H (2001H)=00H
CMP指令用于比较两数的大小 • 对无符号数可用ZF、CF来判断大小 • 对带符号数可用ZF和OF⊕SF来判断大小 两带符号数比较 两无符号数比较
eg: 15-(-1) 0000,1111B(A) - 1111,1111B(B) 0001,0000B CF=1,OF= 0 ,SF=0 ,OF SF=0,A>B CF=1,OF= 1 ,SF=1 ,OF SF=0, A>B 2-(-128) 0000,0010B(A) - 1000,0000B(B) 1000,0010B
(二)乘除运算 无符号数: MUL SRC ; AX←AL×SRC (B) ;DXAX←AX × SRC(W) DIV SRC ; AL← SRC÷AL的商, AH← SRC÷AL的余数(B) ; AX← SRC÷AX的商, DX← SRC÷AX的余数(W) 带符号数: IMUL SRC ; AX← AL × SRC(B) ;DXAX←AL × SRC(W) IDIV SRC ; AL← SRC÷AL的商, AH← SRC÷AL的余数(B) ; AX← SRC÷AX的商, DX← SRC÷AX的余数(W)
对乘除运算的说明 • 乘运算 AX AL SRC SRC × × DX AX AH AL • 除运算 AL AH AX DX SRC SRC AH AL DX AX • SRC:DATA,REG, MEM
(三)字扩展指令 CBW ;将AL的符号位扩展到AH的8位中 CWD ;将AX的符号位扩展到DX的16位中 (四)十进制调整指令 压缩BCD码调整 DAA ;用于加法指令后,将AL调整到压缩BCD码格式 DAS ;用于减法指令后,将AL调整到压缩BCD码格式 非压缩BCD码调整 AAA ;用于加法指令后,将AL调整到非压缩BCD码格式 AH放调整产生的进位 AAS ;用于减法指令后,将AL调整到压缩非BCD码格式 AH放调整产生的借位
N 低4位<9? AF=1? 高4位<9? CF=1? N AL+06H N N AL+60H eg:计算36+45, MOV AL,36H ; ADD AL,45H ;AL=7BH DAA ;AL调整为81H CPU内部的操作:
低4位<9? AF=1? eg:计算6+5, MOV AL,6H ; ADD AL,5H ;AL=BH DAA ;AL=1H,AH=1 N CPU内部的操作: N AL+06H AL高4位清0 AH=AH+1
SUB DRT,SRC SBB DRT,SRC DEC OPR NEG OPR CMP OPR1,OPR ADD DRT,SRC ADC DRT,SRC INC OPR 无符号数: MUL SRC DIV SRC 带符号数: IMUL SRC IDIV SRC CBW CWD DAA DA S AAA AAS 小 结 加减法指令 乘除指令 扩展指令 调整指令
举 例 • 求123456H+345678H • 求用原码表示数X的补码 • 求36-29=? • 计算45*32+36/3
三、逻辑运算(位运算)和移位指令 (一)逻辑运算 AND DST,SRC ;DST←DST∩SRC OR DST,SRC ;DST ←DST ∪SRC XOR DST,SRC ; DST ←DST ⊕SRC TEST DST,SRC ; DST∩SRC NOT OPR ;OPR,不影响标志 影响SF、ZF、PF标志,CF=OF=0,AF无定义 说明:*操作数的规定与算术运算指令相同 **常用AND指令将某位清零,OR指令将某位置1 eg:AND AL,0FH ;将AL的高四位清零,低四位保持不变 OR AL,80H ;将AL的符号位置1,其它位保持不变 XOR AX,AX ;将AX清零,同时清CF
(二)移位指令 指令 操作 说明 逻辑左移 SHL OPR,CNT CNT 可为1或CL寄存器,表示移位次数。 B/W 高位 CF 低位 0 逻辑右移 SHR OPR,CNT CF 0 算术左移 SAL OPR,CNT 0 算术右移 SAR OPR,CNT eg:MOV CL,4 SHL AL,CL;将AL的低四位移到高四位,低四位清零 SAL DL,1 ;DL← DL×2
指令 操作 说明 循环左移 ROL OPR,CNT CNT 可为1或CL寄存器,表示移位次数。 B/W CF 循环右移 ROR OPR,CNT CF 带进位循环左移 RCL OPR,CNT 带进位循环右移 RCR OPR,CNT
eg:将ASCII码的9变成压缩BCD码,做乘10的运算并表示为压缩BCD码eg:将ASCII码的9变成压缩BCD码,做乘10的运算并表示为压缩BCD码 MOV CL,4 ;置移位次数 MOV AL,39H ;输入9 的ASCII码 AND AL,0FH ;变成压缩BCD码 ROL AL,CL ;乘10后将得数90H(压缩BCD)送AL
eg:做-45*10的运算 MOV CL,3 ;置移位次数 MOV AX,-45 ; MOV BX,-45 ; SAL AX,CL ;乘8后送AL SAL BL,1 ;乘2后送BL ADD AX,BX ;乘10后送AL
四串操作指令 (一)基本串操作指令串操作指令 串传送 MOVSB ;①(DI)←(SI) ② SI、DI±1 MOVSW ;①(DI )←(SI) ② SI±2,DI ±2 串存入 STOSB ;①(DI)←AL ② DI±1 STOSW ;①(DI )←AX ② DI ±2 串装入 LODSB ;①AL←(SI) ② SI±1 LODSW ;①AX←(SI) ② SI±2 串比较 CMPSB ;①(SI)-(DI) ② SI、DI±1 CMPSW ;①(SI) -(DI) ② SI±2,DI ±2 串扫描 SCASB ;①AL - (DI) ② DI±1 SCASW ;①AX-(DI) ② DI ±2
(二)串操作指令重复前缀 REP——①如CX=0,则退出REP ②CX ←CX-1 ③执行REP后面的串操作指令一次 ④重复①~ ③ REPE/REPZ——①如CX=0或ZF=0,则退出REP ②CX ←CX-1 ③执行REP后面的串操作指令一次 ④重复①~ ③ REPNE/REPNZ——①如CX=0或ZF=1,则退出REP ②CX ←CX-1 ③执行REP后面的串操作指令一次 ④重复①~ ③ (三)DF复位/置位指令 CLD:DF ←0 STD :DF ←1
串操作指令说明: 源串SI对应DS段,可超越;DI对应ES段,可超越; REP可以与MOVS、STOS指令联用,REPZ可以与CMPS、SCAS指令联用,REPNE可以与SCAS指令联用; 执行串操作前,应先将DF复位或置位; 执行重复串操作前,应将计数器CX中置数 eg: (1)将DS:2000H开始的0~9的ASCII码传送到ES:3000H开始的数据区中。 (2)在DS:2000H~4000H中查找‘A’,找到送至DL否则DL=0。
五、控制转移指令(一)转移地址操作数的寻址五、控制转移指令(一)转移地址操作数的寻址 CS: 转移发生在段内(本代码段内),称为段内转移,转移地址操作数为偏移地址;转移发生在段间(其它代码段),称为段间转移转移地址操作数为段基址和偏移地址。 转移地址可在指令中直接给出,也可以放在寄存器或存储器中,因此就有关于转移地址的不同寻址方式。 代码段1 JMP 代码段2 转移地址操作数 (在代码段中) JMP QUEST JMP FAR PTR NESTPORT JMP BX JMP WORD PTR [2000H] JMP DWORD PTR [3000H] 段内 段间
1. 段内直接寻址 偏移量 OP OP EA + DISP8 DISP16L IP DISP16H QUEST D8H EBH JMP QUEST D8H IP 转移地址的有效地址是当前IP和8位或16位偏移量(带符号数)之和。 指令机器码为: *若为8位偏移量,转移范围在-128~+127之间,常称为短转移。 *若为16位偏移量,转移范围在-32768~+32767之间,常称为近转移。
2. 段内间接寻址 87H QUEST IP 45H 转移地址的有效地址是寄存器的内容或存储单元的内容(一个字)。 eg: MOV BX,2346H JMP BX ;IP←BX eg: JMP WORD PTR QUEST ;将QUEST和QUEST+1地址单元 的内容送至IP
OP 转移IP 转移CS OP NEXT DS:NEXT 转移IP 转移CS 段间直接寻址 指令中直接给出转移地址的段地址和偏移地址。 指令的机器码为: eg:JMP FAR PTR NEXTPORT 4. 段间间接寻址 转移地址的段地址和偏移地址放在存储器单元中(连续4个单元)。 指令的机器码为: eg:JMP DWORD PTR NEXT *段间间接寻址不能用寄存器寻址
(二)控制转移指令 1. 无条件转移指令: JMP SHORT OPR ;段内直接内短转移 JMP NEAR PTR OPR ;段内直接近短转移 JMP WORD PTR OPR ;段内间接转移 JMP REG ;段内间接转移 JMP FAR PTR OPR ;段间直接转移 JMP DWORD PTR OPR ;段间间接转移 OPR常用符号表示。对直接转移,OPR是转移地址;而对间接转移,OPR则是存放转移地址的存储单元。 REG只能是BX,SI、DI、BP
条件转移指令(只能短转移) JZ/JE OPR JNZ/JNE OPR JS OPR JNS OPR JO OPR JNO OPR JP OPR JNP OPR JCXZ OPR
JB/JNAE/JC OPR JNB/JAE/JNC OPR JBE/JNA OPR JNBE/JA OPR 用于无符号数比较判断 B表示低于,A表示高于 E表示等于 JL/JNGE OPR JNL/JGE OPR JLE/JNG OPR JNLE/JG OPR 用于带符号数比较判断 L表示小于,G表示大于 E表示等于 *以上8条指令在使用前,应先用SUB或CMP指令执行了两个数的减法运算。
3.循环转移指令(只能短循环) LOOP OPR ; ①CX←CX-1, ; ②若CX≠0则转移到OPR LOOPZ/LOOPE OPR ;①CX←CX-1, ; ②ZF=1且CX≠0则转移到OPR LOOPNZ/LOOPNE OPR ; ①CX←CX-1, ; ②ZF=0且CX≠0则转移到OPR *使用LOOP指令前,应给计数器CX预置计数值
4. 子程序调用与调用 调用: CALL DST 返回:RET 子程序 主程序 调用 ABC 将断点压入堆栈 将ABC送CS:IP …… CALL ABC (断点) IP 将断点从堆栈弹出 到CS:IP RET 返回
说明: *若是段内调用,ABC为子程序的入口偏移地址;若是段间调用, ABC为子程序的入口段地址和偏移地址 *调用指令与无条件转移指令一样,有四钟寻址方式 CALL PROC1 ;段内直接调用 CALL SI ;段内间接调用 CALL WORD PTR [BX] ;段内间接调用 CALL FAR PTR PROC2 ;段间直接调用 CALL DWORD PTR ;段间间接调用 *RET指令与调用指令配合,若为段内调用,则返回偏移地址给IP;若为段间调用,则返回段地址和偏移地址给CS:IP