




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 汇编语言与汇编程序符号指令(symbolic instruction)与机器指令(machine instruction)用符号指令书写程序的语言称为汇编语言(Assembly language)汇编:把汇编语言写成的源程序翻译成机器指令(目标程序)基本汇编:分配存储区、进制转换、计算表达式的值、语法检查等。宏汇编:含宏指令宏汇编的三种基本指令:符号指令、伪指令、宏指令17.1 符号指令中的表达式符号指令:指令中使用助记符和用符号表示的操作数。符号用来表示指令的功能、某个存储单元、数据注意:以字母开始的十六进制数,要在其前面添加一个前导0. 例如:-1的补码应写为0FFH27.1.1
2、常量1、常量数值常量:如2345D,0FFH,A,BCD符号常量:由伪指令“EQU”定义,或由“=”号定义 P EQU 314 或 P=1汇编程序不给符号常量分配存储单元。注意:符号常量名后面没有冒号数值表达式允许对常量进行算术、逻辑和关系运算。如:COUNT EQU $-10037.1.2 标号标号是指令地址的符号表示,也可以是过程名标号的定义用“:”定义 CYCLE: MOV AL, SI 注意:使用符号(汇编)指令时,标号后面有冒号用于PROC 和ENDP伪指令定义过程时 MAIN PROC FAR MAIN ENDP标号的属性:段基址、偏移地址、类型(FAR/NEAR)47.1.3 变
3、量 变量是代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。 为了便于对变量的访问,它常常以变量名的形式出现在程序中。 (1)变量的定义与预置:定义变量就是给变量分配存储单元,且对这个存储单元赋于一个符号名一变量名,同时将这些存储单元预置初值。 定义变量使用数据定义伪指令DB(定义字节),DW(定义字),DD(定义双字)。 变量定义格式: 变量名 数据定义伪指令 表达式,5 data segment BUFF DW 2301H,6745H,0AB89H,0EFCDH BINA DB A data ends经过定义的变量,每个变量均有3个属性: 段属性(SEG):表示变量存放在哪
4、一个逻辑段中(即变量所在段的段基值。)偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节数。类型属性(TYPE):表示变量占用存储单元的字节数。偏移地址存储器BUFF00000123456789ABCDEF6表达式可以有如下几种情况:数值表达式。 DA-BYTE DB 50H,51HASCII码字符串 B1 DB AB$地址表达式 W1 DW B2 B2 DB 13,1,3?表达式 不带引号的?表示可预置任何内容。 DA-B DB ?,? n DUP表达式 DUP (duplicate)是定义重复数据操作符。 B2 DB 2 DUP(-5,-1) 7地址表达式类型的变更使用类型PT
5、R 地址表达式BYTE PTR W1WORD PTR B2BXBYTE PTR BX+587.2 符号指令的寻址方式由指令字节给出的信息求出操作数的地址称为有效地址EA。寻找(得到)操作数有效地址的方法称为操作数的寻址方法寻找(得到)操作数有效地址和存取操作数的过程称为指令的寻址操作 符号指令与伪指令语句的格式是类似的。一般情况下,汇编语言的语句可以由部分构成: 标号: 助记符 目的操作数 源操作数 ;注释 其中带方括号的部分表示任选项,可以有,也可以没有。例: LOOPER: MOV AL,DATA2SI;取一个字节加数 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数
6、9(一)操作数寻址方式 共七种寻址方式1. 立即寻址2. 寄存器寻址3. 直接寻址4. 间接寻址 5种与存储单元 5. 基址寻址 有关的寻址6. 变址寻址 (存储器操作数)7. 基址变址寻址7种10以数据传送指令MOV为例介绍寻址方式。指令 MOV dst, src 执行 (dst) (src)即: 源操作数的内容不变, 目的操作数 源操作数11立即寻址方式 操作数直接存放在指令中,紧跟在操作码之后,作为指令的一部分,存放在代码段里,这种操作数称为立即数。 操作数在指令中,取来指令立即可得到操作数。称该操作数为立即数。 立即数可以是8位或16位(16位的立即数是高位字节放在高地址,低位字节放在
7、低地址)。应用场合: 立即数常用来给寄存器或内存单元赋初值。例1 MOV AX , 2056H 结果 ( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 结果 ( AL ) = 78H注意:只能用于源操作数字段,不能用于目的操作数字段。低地址高地址122. 寄存器寻址方式操作数在寄存器中,指令中指定寄存器名 8 位操作数, 用 8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16 位操作数,用 16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DI ( CS、DS、SS、ES仅用在部分传送指令中) 这种寻址方式因为操作数在寄存器中不需
8、要访问存储器因此运算速度较高。13例1 MOV AX , 2056H 执行后:(AX)=2056H例2 MOV BL , AH 执行前:(BL) = 12H, (AH) = 78H 执行后:(BL) = 78H , (AH) = 78H 立即数寻址、寄存器寻址的操作数, 不用在取完指令后再到内存中取数。14存储器寻址指令中用 给出存储单元的偏移地址。 操作数的偏移地址又称有效地址EA ( Efficient Address)按给出偏移地址方式的不同,存储器寻址分为以下5种:直接寻址 MOV AL, 1000H 间接寻址 MOV AL, BX 基址寻址 MOV AL, SS: BP + 10H
9、变址寻址 MOV AL, BX + SI 基址变址寻址 MOV AL, BX + SI + 10H 指令中用 给出偏移地址,或有效地址EA。153直接寻址方式(Direct addressing):操作数地址的位偏移量,直接包含在指令中,存放在代码段中指令操作码之后, 但操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。直接寻址方式要点: 存储器操作数的有效地址EA在指令中直接给出。 例 MOV AL, 1000H 默认段寄存器为DS。 操作数所在内存单元的物理地址为: PA = ( DS )10H + EA 直接寻址方式默认段寄存器为DS16例:MOV
10、 AX , 1000 H 若 ( DS ) = 2000H 内存操作数的物理地址为: PA = ( DS )10H +EA = 2000H 10H + 1000H = 21000H 执行后 (AX)= 3040H 思考: 指令 MOV AX,1000H 与指令MOV AX, 1000H有什么不同?17在汇编语言程序中,允许不直接用数值表示偏移地址时,而用符号代替数值表示地址,称符号地址(变量名)。例 符号buffer表示一个地址。 MOV AX , buffer或写成 MOV AX , buffer 源操作数为buffer指向的内存单元的内容符号地址( 变量名)经汇编连接后,与一个确定的数值地
11、址相对应,可用操作符Offset 获取变量的偏移地址。故 PA = ( DS )10H + Offset buffer 指令执行结果 ( AX ) = 0B0A H如:buffer在附加段中, 则应指定段跨越。(段跨越也可以是CS 、SS段寄存器) MOV AX,ES:buffer 或MOV AX,ES:buffer184. 间接寻址(又称寄存器间接寻址 Register indirect addressing) 操作数放在存储器里,操作数的有效地址EA由寄存器给出,寄存器的内容为操作数的有效地址。 可用的寄存器有 BX、SI、DI、BP 如: MOV AL, BX MOV AH, SI MO
12、V DL, DI MOV DH, BP 19 默认段寄存器的关系: 使用BX、SI、DI,默认段寄存器为DS (BX) PA = ( DS )10H + (SI) (DI) 使用BP,默认段寄存器为SSPA = ( SS )10H + ( BP ) 20例: MOV AX , DI 若 ( DS ) = 3000H ( DI ) = 2000H 则内存操作数的物理地址为: PA = ( DS )10H + ( DI ) = 32000H 执行后 (AX) = (32000H) = 400BH 思考: 指令 MOV AX, DI 与指令MOV AX, DI有什么不同?21例: MOV AX ,
13、BP 若 ( SS ) = 4000H ( BP ) = 3000H 则内存操作数的物理地址为: PA = ( SS )10H + ( BP ) = 43000H 指令执行后 (AX) = (43000H) = 0102H225. 基址寻址(Base Mode,寄存器相对寻址) 操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。 可 用的寄存器有 BX、DI、SI、BP , 与寄存器间接寻址相同 如: MOV AL, BX +10HMOV AH, DI+20H MOV DL, 30H SI MOV DH, 40H BP 23 默认段寄
14、存器的关系与寄存器间接寻址相同,允许段跨越。 使用BX、SI、DI,默认段寄存器为DS (BX) PA = ( DS )10H + (SI) + 偏移量 (DI) 使用BP,默认段寄存器为SSPA = ( SS )10H + ( BP ) + 偏移量 24例: MOV AX , BX+30H 若 ( DS ) = 2000H ( BX ) = 1000H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + 30H = 21030H 指令执行后: (AX) = (21030H) = 8976H 25例: MOV AX ,60H BP 若 ( SS ) = 3000H
15、( BP ) = 200H 则内存操作数的物理地址为: PA = ( SS )10H + ( BP ) + 60H = 30260H 指令执行后: (AX) = (30260H) = 0ABCH 266. 变址寻址 (Based-Indexed Mode, 基址加变址寻址) 操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出。 可用的基址寄存器为 BX 、BP ,变址寄存器为 SI 、DI。 如 MOV AL, BX+SI MOV AX, BXDI MOV DL, BP+SI MOV DX, BPDI 27 默认段寄存器由基址寄存器决定,允许段跨越。 基址寄存器为BX,默认段寄存器为DS
16、 (SI)PA = ( DS )10H + ( BX ) + (DI) 基址寄存器为BP,默认段寄存器为SS (SI)PA = ( SS )10H + ( BP ) + (DI)28使用BX的基址加变址寻址,默认段寄存器为DSCPU 总线 内存DSESSSCSIP数据暂存器PSW标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、指令1指令2指令3指令4、数据1数据2数据3、地址总线AB数据总线DB控制总线CB地址译码器29使用BP的基址加变址寻址,默认段寄存器为SSCPU 总线 内存DSESSS
17、CSIP数据暂存器FR标志寄存器执行部件控制电路指令译码器AXBXCXDXAHBHCHDHSIDIBPSPALBLCLDL寄存器组指令队列总线接口控制电路运算器地址加法器、指令1指令2指令3指令4、数据1数据2数据3、地址总线AB数据总线DB控制总线CB地址译码器30例: MOV AX , BX + SI 若 ( DS ) = 4000H ( BX ) = 2000H ( SI ) = 100H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + ( SI ) = 42100H 指令执行后 (AX) = (42100H) = 2345H 317. 基址变址寻址(相对
18、的基址加变址寻址 Relative based indexed addressing) 操作数的有效地址由基址寄存器、变址寄存器、偏移量( 8位或16位)三者之和给出。 可用的寄存器与基址加变址寻址方式相同 基址寄存器有 BX、BP 变址寄存器有 SI、DI如 MOV AL, BX+SI +10H MOV AX,20H BXDI MOV DL, BP+SI+30H MOV DX,40H BPDI 32 默认段寄存器由基址寄存器决定, 与基址加变址寻址相同. 允许段跨越。 基址寄存器为BX,默认段寄存器为DS (SI)PA = ( DS )10H + ( BX ) + + 偏移量 (DI) 基址
19、寄存器为BP,默认段寄存器为SS (SI)PA = ( SS )10H + ( BP ) + + 偏移量 (DI)33例: MOV AX , BX + SI + 10H 若 ( DS ) = 4000H ( BX ) = 3000H ( SI ) = 200H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + ( SI ) + 10H = 43210H 指令执行后 (AX) = (43210H) = 8877H 34五种内存寻址: 寻址方式 形成EA EA计算式 直接寻址 位移量 EA=位移量 间接寻址 基址或变址 BX 或BP (寄存器间接寻址) EA= SI
20、DI基址寻址 基址或变址 BX (寄存器相对寻址 ) +位移量 EA = BP + 8位 SI 或16位位移量 DI 变址寻址 基址+变址 BX+SI(基址变址寻址) BP+DI EA= BP+SI BX+DI相对基址变址寻址 基址+变址+位移量 EA =EA +位移量 35指令机器码与操作数及寻址方式的简要说明368086/8088的指令系统中共有92种基本指令。可以分成6个功能组:1数据传送(Data transfer)类指令2算术运算(Arithmetic)类指令3逻辑运算和移位(Logic& Shift)类指令4串操作(String manipulation)类指令5控制转移(Cont
21、rol Transfer)类指令6处理器控制(Processor Control)类指令7.3 常用指令37介绍指令系统使用的符号:八位寄存器: AH,AL,BH,H,BL,CH,CL,DH,DL 十六位通用寄存器: AX,BX,CX,DX,SP,BP,SI,DI 堆栈指针 SP 指令指针 IP(或PC)标志位Flags目的和源变址寄存器DI, SI段寄存器CS, DS, ES, SS38src , dest源,目的操作数(下列寻址方式都可以用) BX+SI+n,BX+DI+n,BP+SI+n,BP+DI+nSI+n,DI+n, BP+n, BX+nN,r 存储器单元的内容(正常在数据段)ES
22、: 附加存储器段的内容 OPRD 操作数Seg 段寄存器(CS,DS,ES,SS)i m 立即数 (n 8位, nn 16位, nnnn 32位 )DISP 位移量(displacement)398086/8088指令助记符表 (自学) 自学40自学41(一)通用传送指令(General Purpose Transfer)(二)数据交换类指令(三)换码指令(Translate)(四)输入输出指令(Input and Output)(五)堆栈操作类指令(五)目的地址传送指令(Address-object transfer)(六)标志传送指令(Flag register transfer)一、数据
23、传送类指令428088提供方便灵活的通用的传送操作,适用于大多数操作数。通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数指令。通用传送指令包括:1、MOV (Movement)2、PUSH (Push word onto stack) POP (Pop word off stack)3、XCHG (Exchange)4、XLAT (Translate)(一)通用传送类指令431MOVdest,src ; (dest) (src) 目的源目的 源功能: 把一个字节(B)或一个字(W)操作数由源传送至目的。 实现:寄存器 寄存器/存储器之间;立即数寄存器/存储器寄存器/存储器段寄存器之
24、间的数据传送。44 具体说,通用数据传送指令能实现: CPU内部寄存器之间的数据的任意传送(除了码段寄存器CS和指令指针IP以外)。段寄存器之间不能传送。例: MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS ;段寄存器 通用寄存器45立即数传送至CPU内部通用寄存器组 (AX、BX、CX、DX、BP、SP、SI、DI)。 用于给寄存器赋初值。 不能直接给段寄存器赋值例: MOV CL,04H;立即数8位寄存器 MOV AX,03FFH;立即数16位寄存器
25、PTR :属性定义符号,符号后面的变量(或地址单元)有符号前面的属性 MOV WORD PTR SI ,057BH ;立即数存储器MOV BYTE PTR MEM, 5 ;立即数存储器46CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送。可以实现一字节或一个字的传送。 存储单元之间不能直接传送 例:MOV MEM , AX; 累加器存储器,直接寻址MOV MEM ,DS;段寄存器存储器,直接寻址MOV DISPBX ,CX;寄存器存储器,变址寻址MOV AX , DISP SI;存储器累加器,变址寻址MOV DS , MEM;存储器段寄存器,直接寻址MOV CX , DI
26、SP BX SI ;存储器累加器,相对基址加变址47 注意:(1)不能用一条MOV指令实现以下传送。 存储单元之间的传送MOV MEM2 , MEM1 错。MOV AX , MEM1MOV MEM2 , AX 对。 立即数送段寄存器 例 : MOV DS,2000H 错。MOV AX, 2000HMOV DS , AX 对。 48 段寄存器之间的传送MOV ES , DS ; 错MOV AX , DSMOV ES , AX ; 对 。 注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。例:MOV CS,AX ; 错 MOV AX,CS ;对 。 MOV IP, AX ;
27、错 MOV AX, IP ;错。49 注意操作数的范围对字节操作指令 0 FFH 0 255 对字操作指令 0 FFFFH 0 65535 MOV AL , 260 MOV AX ,70000 MOV AL, 1FFH MOV AL, 2ABCDH 50注意如下指令: 不能两个同为存储器操作数 MOV DI , SI 目的操作数不能是立即数 ADD 3 , AL 两个操作数的类型应相同 SUB AX , BL 若 value 定义为字类型存储器变量: MOV CL, value BX 51(后面跟立即数时)内存操作数的属性应明确。 MOV BX ,0MOV byte ptr BX , 0MOV
28、 word ptr BX , 0MOV BX , ALMOV BX , AX52 A、B、C、D、E、F开头的十六进制数前面加0, 与H结尾的标识符区别。如 寄存器名: AH、BH、CH、DH 变量名 : abcdH 等例 mov AL, 0AH mov AL, AH mov BX, 0abcdH53 CS 和 IP的值只在控制转移指令中修改。 对非控制转移指令,取完指令后IP值自动+1 ,指向下条指令。 段寄存器CS的值,只在MOV、PUSH中可作操作数, 且这两条指令执行结果不改变CS值。MOV AX, CSPUSH CS IP、FR两个寄存器不能作为操作数在指令中出现。mov IP ,
29、1234Hmov FR , 0F0FH FR状态寄存器的值由指令执行后确定, 不同的指令对各标志的影响不同。54(2)段地址的默认BX、SI、DI间址默认段地址为DS,BP间址默认段地址SS。(3)凡是遇到给SS赋值指令,系统自动禁止外部中断,执行本条指令和下条指令,恢复对SS寄存器赋值前的中断开放情况。这样做为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。*在修改SS和SP的指令之间不要插入其他指令。(4)所有通用传送指令不影响标志位(除SAHF、POPF以外)。55 MOV指令可以传送8位数据,也可传送16位数据,具体取决于指令中涉及的寄存器是8
30、位还是16位,也取决于立即数的形式。 MOV指令中包括源操作数和目的操作数,两者之中应至少有一个是用寄存器指出的,这可减少指令长度。 不能在两个内存单元之间直接传送数据。 寄存器可以是源操作数,也可以是目的操作数,但CS寄存器不能用作目的操作数,可以用作源操作数。MOV CS,AX 错 MOV AX,CS 对MOV指令使用注意(总结)56 立即数不能做目的操作数。 立即数不能直接送入段寄存器。 MOV DS,1234H 源操作数与目的操作数数据类型必须相同。 段寄存器之间不能互相传送。57 IP寄存器不能作为操作数;MOV AX,IP 错 用BX、SI、DI间接寻址时,默认的段寄存器为DS,而
31、用BP时,默认为SS。 8086系统规定,当遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等本指令和下条指令执行之后,自动恢复对SS寄存器赋值前的中断开放情况,以利于程序员用连续的两条指令改变堆栈空间。写程序时要注意在修改SS和SP的指令之间不要插入其他指令。58格式:XCHG dest , src;(dest) (src)执行操作: 把一个字节或一个字的源操作数与目的操作数相交换。 可以 实现: 寄存器之间 寄存器和存储器之间注意: 存储器之间不能交换,两个操作数中必须有一个在寄存器; 段寄存器不能作为一个操作数; 允许字或字节操作,不影响标志位。(二) 数据交换指令59应用举例
32、:XCHG BL,DLXCHG AX,SIXCHG COUNTDI, AXXCHG BX,DI(错)XCHG DS, AX (错)60该指令不影响标志位。格式: XLAT str_table;(AL)(BX +AL) 或 XLAT str_table表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。 (三)换码指令61XLAT指令使用方法: 先建立一个字节表格; 表格首偏移地址存入BX; 需要转换代码的序号(相对与表格首地址位移量)存入AL; (表中第一个元素的序号为0) 执行XLAT指令后,表中指定序号的元素存于AL中。 (AL)为转换的代码。62XLAT指令应用: 若把字
33、符的键盘扫描码转换成ASCII码,或根据数据查平方表, 或把数字09转换成7段数码管显示所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。首地址为:Hex_table ,欲查出表中第10个元素(A)63执行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT Hex_table假设:(DS)=F000H, Hex_table=0040H(AL)=0AH执行XLAT以后: (AL)=41H=(F004AH),即“A”的ASCII码。30H31H32H.39H41H42H.46H.Hex_tableHex_tab
34、le+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FHFBA912016进制数的ASCII码表64输入输出指令共两条: 1、IN (Input byte or word) 2 、OUT (Output byte or word) 输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。 无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令 。 输入、输出指令不影响标志位。(四)输入/输出指令65每个外设要占几个端口:数据口,状态口和控制口。66信息交换要通过端口,在IBMPC机里,可以配
35、接许多外部设备,每个外设与CPU之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有65536个I/O端口。 A0A15译码形成。端口号:端口号(即外设端口地址)为0000HFFFFH。PC机仅使用A0A9译码形成I/O口地址,即1024H个口地址 端口号:0000H03FFH其中: A9=1,表示扩充槽上的口地址。67长格式:端口号中前256个端口(0FFH),可以直接写在指令中,这就是长格式。端口号代替指令中的PORT,机器指令用二字节表示,第二字节就是端口号。短格式:当端口号256时,只能使用短格式,必须先把端口号放到DX寄存器中。不需要用任何段
36、寄存器来修改它的值。681、IN (Input byte or word) 输入指令格式:IN acc, port ;(acc) (port)具体形式有四种:IN AL, data8 ; 端口地址8位,输入一个字节IN AX, data8 ;端口地址8位,输入一个字IN AL, DX ;端口地址16位,输入一个字节IN AX, DX ;端口地址16位,输入一个字 必须通过累加器AX(字)或AL(节)输入数据。692 、OUT(Output byte or word) 输出指令格式: OUT port, acc ;(port) (acc)具体形式有四种: OUT data8 , AL ; 端口地
37、址8位,输出一个字节OUT data8, AX ;端口地址8位,输出一个字OUT DX , AL ;端口地址16位,输出一个字节 OUT DX , AX ;端口地址16位,输出一个字 必须通过累加器AX(字)或AL(节)输出数据。70例1:实现(29H)(28H)(DATA_WORD) IN AX,28H MOV DATA_WORD,AX例2:从端口3FCH 送一个字到AX寄存器MOV DX,3FCH IN AX,DX ; (AL)(3FCH), (AH)(3FDH) 例3:实现将(AL) (05H) OUT 5,AL;(05H)(AL)71 1. 只能用累加器AX作为执行输入输出过程的机构,
38、不能用其它寄存器代替; 2. 输入输出指令可分为两大类:一类是直接的输入输出指令,寻址范围为0255H,即16进制数FFH是直接输入输出指令中允许使用的最大端口号;另一类是间接的输入输出指令,寻址范围为065535H,要在DX寄存器中设置好端口号,且只能用DX寄存器,而不能用别的寄存器。注意问题:72 PUSH 进栈指令 指令格式: PUSH OPRD 执行操作: SP SP-2, (SP + 1): (SP) OPRD 指令功能:该指令把一个字操作数从源传送到堆栈的顶部。常用于在调用过程前把参数入栈,16位寄存器(包括段寄存器)、存储器单元的内容都可入栈。 不影响标志位 (五)堆栈操作指令7
39、3 假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是:PUSH AXPUSH BX指令举例74PUSH指令举例2000:00FBH2000:00FCH2000:00FDH2000:00FEH2000:00FFH2000:0100HSP(1) 起始状态75 POP 出栈指令 指令格式: POP OPRD 执行操作: (OPRD) (SP + 1): (SP), SP SP+2 指令功能:该指令把SP所指向的堆栈顶部的一个字 传送到指定目的操作数,同时修改堆栈 指针,即SP SP+2。76假定在执行指令:POP CX POP DX之前,堆栈的
40、状态如图所示。指令执行后,CX,DX的内容及堆栈的状态?77PUSH指令的目标地址一定在当前堆栈中。SS内容为段基值, 偏移量由堆栈指针SP指出。8086的堆栈操作总是按字进行的,即操作数一定是16位的寄存器或存储器操作数; 每执行一条推入(弹出)堆栈指令,堆栈地址指针SP减2(加2),推入堆栈的数据放在栈顶,低位字节放在较低地址单元,高位字节放在较高地址单元;堆栈中的内容是按后进先出的次序进行传送的。注意问题:78(六)目标地址传送指令功能:传送操作数的段地址或偏移地址。1、取有效地址指令 LEA LEA可将存储器地址送到一个寄存器。 要求:源操作数必须为内存单元地址,目的操作数必须为一个1
41、6位通用寄存器。 这条指令常用来使一个寄存器作为地址指针。例: LEA AX,2728H;(AX) 2728H LEA BX, BP+SI ;(BX) BP+SI LEA SP, 0428H ;(SP) 0428H792、将地址指针装到DS和另一个寄存器的指令:LDS功能:把一个段地址和一个偏移量分别装入DS和另一个指定的寄存器。例如:设2130H21333H这4个单元存放着一个地址,2130H、2131H中为地址的偏移量,2132H、2133H中为段地址,执行指令: LDS DI, 2130H 而后,使偏移量送到DI,段地址送到DS。803、将地址指针装到ES和另一个寄存器的指令:LES例如
42、:LES SI,2134H81(七)标志位传送指令共4条指令读取标志指令 LAHF LAHF指令将标志寄存 器F的低8位传送到AH中。设置标志指令 SAHF SAHF指令将AH的内容送到标志寄存器F的低8位。对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF、POPF PUSHF、POPF指令一般用在子程序或中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。82算数运算指令涉及的一些问题加法指令减法指令乘法指令除法指令BCD码运算指令二、算术运算类指令83算术运算指令涉及的一些问题指令对标志位的影响操作数类型:无符号二进制整数、带符号二进制整数 无符号压缩十进制BCD码、无符号非压
43、缩十进制BCD码关于指令的运算结果乘除法指令中操作数的存放位置84需要注意问题 8086指令系统提供了加、减、乘、除四种基本运算指令,可以处理无符号数或带符号的8位或16位二进制的算术运算,还提供了各种调整操作指令,故可进行压缩的或非压缩的十进制数的算术运算。 大多数算术运算指令都影响状态标志位。对于加法和减法运算指令,带符号数和无符号数的运算的操作过程是一样的;而对于乘法和除法运算,带符号数和无符号数的运算过程完全不同。85当无符号数运算产生溢出时,CF为1(编程关注);当有符号数运算产生溢出时,OF为1(编程关注) ;如果运算结果为0,则ZF1;如果运算结果的最高位为1,则SF1;如果运算
44、结果的低8位有偶数个1,则PF1;如果第3位向第4位借位或者进位,AF1。关于标志位的说明861. 加法指令(1)ADD 不带进位标志位的加法指令(2)ADC 带进位标志位的加法指令(3)INC 增量指令(4)DAA 加法的ASCII调整指令87(1) ADD 不带进位位的加法指令指令汇编格式: ADD dest, src 操作: 两个操作数求和, 结果存目标操作数中。 dest(dest)+(src)受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明: dest和src不能同时为存储器操作数或段寄存器。ADC、SUB、SBB、CMP、AND、OR、XOR等指令对寻址方式的要求相同。
45、例:ADD AL, 50 ADD CX, 50H ADD BPDI, BX 88(2) ADC 带进位位的加法指令指令汇编格式: ADC dest, src操作: 两个操作数相加的同时,再加上CF。结果存入目标操作数中,可实现多字节的加法运算。 dest(dest)+(src)+CF受影响的状态标志位: OF,SF,ZF,AF,PF,CF例:ADC AL, 3 ADC DX, BX+1089指令汇编格式: INC dest操作:将指定的操作数加1,并将结果送回到目标操作数中。 dest(dest)+1受影响的状态标志位: OF,SF,ZF,AF,PF说明: INC 指令不影响标志位CF例: I
46、NC AL INC BX INC BYTE PTR BI+DI(3) INC 增量指令90指令汇编格式: DAA指令功能:在用ADD或ADC指令对两个压缩BCD数,且运算结果已存在AL的情况下,用此指令将AL寄存器中的运算结果调整正确的压缩BCD数。(4) DAA 加法的十进制调整指令91指令汇编格式: AAA指令功能:在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后,运算结果已存在AL的情况下,用此指令将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL中,如果AF1,表示向高位进位,则进到AH寄存器中。(5) AAA 加法的ASCII调整指令922.
47、 减法指令(1) SUB 不考虑借位标志位的减法指令(2) SBB考虑借位标志位的减法指令(3) DEC减量指令(4) NEG求补指令(5) CMP比较指令93(1) SUB 不考虑借位的减法指令指令汇编格式: SUB dest, src操作: 从目标操作数减去源操作数,结果存入目标操作数中。 dest(dest)-(src)受影响的状态标志位: OF,SF,ZF,AF,PF,CF例:SUB AL,10H SUB BX, BX+10H SUB AL, AL94(2) SBB 考虑借位的减法指令指令汇编格式: SBB dest, src操作:从目标操作数中减去源操作数和CF,结果存入目标操作数中
48、。 dest(dest)-(src)-CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明: SBB 指令主要用于多字节数据减法。例: SBB AL,0 SBB DL,CL SBB WORD PTR DI+2,1000H95(3) DEC减量指令指令汇编格式: DEC dest操作:将指定的操作数减1,并将结果送回到目标操作数中。dest(dest)-1受影响的状态标志位:OF,SF,ZF,AF,PF说明: DEC指令不影响CF例: DEC BX DEC BYTE PTR BX+SI+1000H DEC SP96(4) NEG 求补指令(取负指令)指令汇编格式: NEG dest操作
49、:从0中减去指令中给定的操作数, 最后将结果送回到给定的操作数中。 dest0-(dest)受影响的状态标志位: OF,SF,ZF,AF,PF,CF特殊情况:0,80H,8000H说明: NEG 指令对于带符号的数来说是取负,即改变操作数的符号。例: NEG AX NEG BYTE PTR BX+1097(5) CMP比较指令指令汇编格式: CMP dest,src操作: 从目标操作数中减去源操作数,但不送回相减的结果。 (dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明: CMP 将两个操作数相减, 两个操作数保持原值不变, 但与SUB指令一样影响标志位,主要
50、用在希望比较两个数的大小,而又不破坏原操作数。例: CMP AL, BL CMP DX, 10H 983. 乘法指令(1) MUL 无符号数的乘法指令(2) IMUL 有符号数的乘法指令99(1) MUL 无符号数的乘法指令指令汇编格式: MUL src操作: 源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数据相乘,乘积为字,存放在AX中。如果源操作数是字数据,就与AX中的数相乘,乘积为双字,存放在DX和AX中。 两个字节数相乘: AXAL*(src)两个字数据相乘: DX,AXAX*(src)受影响的状态标志位: OF,CF说明: 源操作数src不能是立即数。如果乘积的高半
51、部不为零时,CF和OF被置位,否则将被清零。100ALsrcAXAXsrc AXDX例: MUL BL MUL DX MUL BYTE PTR SI+BX+1000H101(2) IMUL 有符号数的乘法指令指令汇编格式: IMUL src操作: 将源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数相乘,乘积为字,存放在AX中。如果源操作数是字数据,那么就与AX数相乘,乘积为双字,存放在DX和AX中。两个字节数相乘: AXAL*(src)两个字数据相乘: DX,AXAX*(src)受影响的状态标志位: OF,CF。说明: src不能是立即数。IMUL指令视操作数为带符号的数。如
52、果乘积的高半部不是低半部分的符号位扩展时,CF和OF被置位,否则将被清零。1025. 除法指令(1) DIV 无符号数的除法指令(2) IDIV 有符号数的除法指令(3) CBW 有符号数除法时符号扩展命令,字节字(4) CWD 有符号数除法时符号扩展命令,字双字103(1) DIV 无符号数的除法指令指令汇编格式: DIV src操作: AX(或DX,AX)的内容除以src的内容。商存放在AL(字节时)或AX(字时),并将余数存放在AH(字节时)或DX(字时) 中。 字除以字节: AX/(src);AL商,AH余数 双字除以字: DX,AX/(src);AX商,DX余数受影响的状态标志位:
53、不产生有效的状态标志。说明: src不能是立即数; 如果商数超过了允许的最大值 (字节时为0FFH,字时为0FFFFH) 时就产生一个方式0 的中断,并且商和余数都不确定。104DX:AX16位除AX(商)DX(余)AX8位除数AL(商)AH(余)105 (2)IDIV 有符号数的除法指令指令汇编格式: IDIV src操作: AX(或DX,AX)的内容除以src的内容。商存放在AL( 字节时) 或AX (字时),并将余数存放在AH (字节时) 或DX (字时) 中。字除以字节: AX/(src) ;AL商,AH余数双字除以字: DX,AX/(src);AX商,DX余数受影响的状态标志位: 不
54、产生有效的状态标志。说明: src不能是立即数; 如果商数超过了允许的最大值 (字节时为-128127,字时为-3276832767)时就产生一个方式0的中断,并且商和余数都不确定。1061. NOT 取反2. AND 逻辑与3. OR 逻辑或4. XOR 异或5. TEST 测试三、逻辑运算与移位类指令 (一) 逻辑运算类指令107(1) NOT 取反指令汇编格式: NOT dest操作: 将操作数的每一位求反,然后将结果回送到对应位中。可以是8位、16位寄存器或存储器操作数。 destdest 受影响的状态标志位: 没有说明: NOT指令常用来将某个数据取成反码,再加上1得到补码。例: N
55、OT AX NOT WORD PTR BX+SI+1000HNOT BYTE PTR BX+SI+1000H108(2)AND 逻辑与指令汇编格式: AND dest, src操作: 两个操作数进行逻辑 “与”,即如果两个操作数的对应位都为1时,结果的对应位才为1, 否则结果的对应位为0。 dest(dest)(src), CF0,OF0受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明: AND指令可借助某个给定的操作数将另一个操作数中的某些位清零(这种操作也称设置屏蔽),或者令某些位保持不变,这个数通常称为掩码。例如,将一个源操作数与00001111B 相“与”,可将这个源操作数
56、的高半字节变为0, 而低半字节保持不变。例:AND AL, 0FH AND AX,BX109(3) OR 逻辑或指令汇编格式: OR dest, src操作: 两个操作数进行逻辑“或”操作,即当两个操作数的对应位都为0时结果的对应位为0,否则结果的对应位为1,结果存入目标操作数中,CF和OF位置0。dest(dest)(src), CF0,OF0受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明: OR指令可用来使操作数中的某些位置位,某些位保持不变。例如,用10000000B与一个 字节操作数相“或”,可使这个字节操作数的最高有效位为1。例: OR AL,0FH OR AX,BX+
57、DI+10110(4) XOR 异或指令汇编格式: XOR dest, src操作: 两个操作数执行逻辑“异或”操作,即当两个操作数的对应位相同时,结果的对应位为0; 否则结果的对应位为1。结果存入目标操作数中,CF和OF位置0。 dest(dest)(src), CF0,OF0受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明:XOR指令可用来使操作数中的某些位取反,某些位不变。例: XOR AL,0FH XOR AX, AX111(5) TEST 测试指令汇编格式: TEST dest, src操作: 将两个操作数进行逻辑“与”, 根据结果设置状态标志位, 但不改变两个操作数的原
58、始值,并将CF和OF清除。(dest)(src), CF0,OF0受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明: TEST指令通过 “与” 的方式对两个源操作数进行比较,但不保留 “与” 的结果。112逻辑运算指令的妙用1. AND指令可用于对一个数据的指定位清零(屏蔽)。 例如, AND AL, 0FH2. OR指令可用于对一个数据的指定位置1。 例如,OR AL, 02H3. XOR指令通常用在一些程序的开头使某个寄存器清零,以配合初始化工作的完成。例如, XOR AX, AX4. NOT指令常用来将某个数据取反码,再加1得到补码5. TEST指令一般用来检测某个指定位是1
59、还是0,而这个指定位往往对应一个物理量。例如, TEST AL, 01H113(二)移位类指令指令类型指令格式指令功能状态标志位备注O S Z A P C移位SHL dst, cnt逻辑左移*dst(目标):通用寄存器、存储器cnt (计数值):1或CL,移位次数SAL dst, cnt算术左移*SHR dst, cnt逻辑右移*SAR dst, cnt算术右移*循环移位ROL dst, cnt循环左移 - - * -ROR dst, cnt循环右移 - - * -RCL dst, cnt带进位循环左移 - - * -RCR dst, cnt带进位循环右移 - - * -114CF0最高位最低
60、位算术左移指令SAL 及逻辑左移指令SHLCF最高位最低位(b) 算术右移指令SARCF最高位最低位0(c) 逻辑右移指令SHR非循环移位指令的功能SAL DX, 4SAL AX,CL115不带CF的循环左移指令ROL(b) 带CF的循环左移指令RCL(c) 不带CF的循环右移循环指令ROR循环移位指令的功能ROL BX, 1CF最高位最低位CF最高位最低位CF最高位最低位CF最高位最低位(d) 带CF的循环右移指令RCR116例:阅读下面的程序,指出它实现的具体功能 SAL AL, 1 MOV BL, AL MOV CL, 2 SAL AL, CL ADD AL, BL 答案:上述程序将AL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲方发三方协议合同模板
- 空调用工兼职合同协议书
- 煤油购销合同协议书模板
- 物业公司聘用协议书模板
- 离婚协议算不算一种合同
- 电厂脱硫塔采购合同范本
- 门窗修缮合同协议书范本
- 移动机器人采购合同范本
- 消防维保合同协议书模板
- 网签版技术服务合同范本
- 2025年北京市中考招生考试数学真题试卷(真题+答案)
- 2025年放射工作人员放射防护培训考试题及答案
- 2024南阳农业职业学院辅导员招聘笔试真题
- 2024年发展对象培训结业考试真题
- 肺结节中医课件
- 医院安全生产包括哪些方面
- 小型灌区渠道管理办法
- 护理核心制度考试试卷(附答案)
- 汽车之夜活动方案
- 护理质量管理与院感感染控制
- (完整版)形式发票模版(国际件通用)
评论
0/150
提交评论