代汇编语言程序设计-2.ppt_第1页
代汇编语言程序设计-2.ppt_第2页
代汇编语言程序设计-2.ppt_第3页
代汇编语言程序设计-2.ppt_第4页
代汇编语言程序设计-2.ppt_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计, 第三章,第三章 寻址方式与指令系统,本章要点,基本寻址方式,指令系统,字符设备I/O功能调用,1,2,3,4,32位指令寻址,指令系统 :,计算机提供给用户使用的指令集。,目的操作数,,源操作数,替代目的操作数,不影响源操作数,操作结果,操作码,3.1.1指令的基本格式,操作数,操作码,例如:,MOV AX,100,MOV AX,BX,MOV AX,BX,要访问操作数,首先必须确定如何形成操作数的地址。,寻址方式:形成操作数地址的方法。,寻址方式选择得正确与否,直接影响程序的执行效率。,3.1.2 寻址方式,与数据有关的寻址方式 确定内存单元的地址,与转移地址有关的寻址方式 确定转移地址,寻址方式 分类,目的操作数,,源操作数,MOV,有 7 种 与数据有关的寻址方式,以MOV指令为例:,3.1.2 数据的寻址方式,对源操作数分别使用7 种寻址方式如下:,(1)立即寻址方式 (Immediate Addressing ),(2)寄存器寻址方式(Register Addressing ),(3)直接寻址方式 (Direct Addressing ),(4)寄存器间接寻址方式(Register Indirect Addressing ),(5)变址寻址方式 ( Indexed Addressing ),(6)基址变址寻址方式( Based Index Addressing ),(7)相对基址变址寻址方式 ( Relative Based Index Addressing ),掌握寻址方式的要点: 特点(区别于其他寻址方式); 使用方法(语法形式); 用途(什么情况下使用)。,(1)立即寻址方式 (Immediate Addressing ),特点:操作数包含在指令中。,操作数是指令的组成部分(可以是8位或16位),取出指令就立即获得操作数立即数,例1: MOV AL, 5,执行指令后: (AL) = 05H,05,例2: MOV AX, 3045H,执行指令后: (AX) = 3045H,用途:给变量或寄存器赋常量值,限制:只能用于源操作数,AX,低地址,高地址,45,30,(2)寄存器寻址方式(Register Addressing ),特点:操作数存在寄存器中。,例: MOV AX, BX,执行指令前: (AX) = 3045H (BX) = 4000H,执行指令后: (AX) = 4000H (BX) = 4000H,用途:用寄存器提供操作数时存取速度快。,(3)直接寻址方式 (Direct Addressing ),特点:操作数的偏移地址包含在指令中。,例:设 ( DS ) = 3000H MOV AX, 2000H,要访问的存储单元物理地址为:,30000H+2000H=32000H,设: (32000H)=3050H,执行指令后: (AX)=3050H,指令 MOV AX, 2000H,2000H,AX,30,50,如果2000H单元在附加段 MOV AX, ES:2000H,段跨越前缀: “ 段寄存器名: ” 用于改变默认使用的段寄存器,用途: 用于存取单变量中的操作数。,(4)寄存器间接寻址方式(Register Indirect Addressing ),特点: (寄存器) = 操作数的偏移地址,例:设 ( DS ) = 2000H ( BX ) = 1000H 指令为: MOV AX, BX ,20000H+1000H = 21000H,计算操作数物理地址的公式:,(BX) (SI) (DI), 操作数物理地址=(DS)16+ 操作数物理地址=(SS)16+(BP),要访问的存储单元物理地址为:,1000H,AX,50,A0,数组起始地址,用途: 可用于处理数组,设: (21000H)=50A0H,执行指令后: (AX)=50A0H,(5)变址寻址方式 ( Indexed Addressing ),(寄存器相对寻址方式),特点: (变址或基址寄存器) +指令中的位移量 = 操作数的偏移地址,+,例:设 ( DS ) = 3000H, ARRAY=4000H, ( SI ) = 2000H,指令为: MOV AX, ARRAY SI ,计算操作数物理地址的公式:,(SI) (DI) + (BX), 操作数物理地址=(DS)16+ 操作数物理地址=(SS)16+(BP)+,8位位移量 16位位移量,8位位移量 16位位移量,指令 MOV AX, ARRAY SI ,4000H,30000H,AX,12,34,2000H,数组起始地址 ARRAY,用途:,30000H+4000H +2000H= 36000H,要访问的存储单元 物理地址为:,设: (36000H)=1234H,执行指令后: (AX)=1234H,可用于处理数组,(6)基址变址寻址方式 ( Based Index Addressing ),特点:(基址寄存器) + (变址寄存器) = 操作数的偏移地址,例:设 ( DS ) = 2100H, ( BX ) = 0158H, ( DI ) = 1000H 指令为: MOV AX, BXDI,+,计算操作数物理地址的公式:,(SI) (DI),(SI) (DI), 操作数物理地址=(DS)16+ (BX)+ 操作数物理地址=(SS)16+(BP)+,21000H+0158H +1000H= 22158H,要访问的存储单元物理地址为:,0158H,AX,12,34,1000H,数组起始地址,设: (22158H)=1234H,执行指令后: (AX)=1234H,用途: 可用于处理数组,21000H+0158H +1000H = 22158H,指令:MOV AX, BXDI,2. MOV AX,BX,三种可处理数组的寻址方式的比较, 寄存器间接寻址方式 特点:适用于要处理的数组需要在程序运行中动态确定,且形式简单。,1. MOV AX,ARRAY SI, 变址寻址方式 特点:可读性好,指令明确指出要处理的数组。 限制:写程序时必须清楚要处理什么数组。, 基址变址寻址方式 特点:适用于要处理的数组需要在程序运行中动态确定,并且修改BX就可以处理不同的数组。,指令3的BX寄存器是否可被其他寄存器替换?,指令1 的替换寄存器为:DI BX BP (加段跨越前缀 DS: 或 ES),指令2的替换寄存器为: DI SI BP (加段跨越前缀 DS: 或 ES),指令1和指令2 的寄存器还可被哪些寄存器替换?,2. MOV AX,BX,1. MOV AX,ARRAY SI,next,例:设 ( SS ) = 3000H ( BP ) = 2000H ARRAY = 0250H ( SI ) = 1000H MOV AX, ARRAYBPSI,(7)相对基址变址寻址方式( Relative Based Index Addressing ),特点:(基址寄存器) + (变址寄存器)+位移量 = 操作数的偏移地址,要访问的存储单元物理地址为:,30000H+2000H +0250H+1000H=33250H,指令,2000H,AX,12,34,1000H,30000H,33250H,0250H,栈顶,数组首址,用途:,便于访问堆栈中的数组 二维数组,1.简单变量寻址 前三种:立即寻址方式,寄存器寻址方式,直接寻址方式 2.数组或表格数据的寻址 后四种:寄存器间接,寄存器相对,基址变址,相对基址变址,数据寻址与数据结构的关系,2.数组或表格数据的寻址,(1)存取基本数组 数组基本地址:BX 某个元素到数组基本地址的距离:SI DI 则EA=BX+SIDI 或者位移量DISP=数组开始地址 数组元素到数组开始地址的距离:BX SI DI 则EA=DISP+BX SI DI,基址变址寻址,寄存器相对寻址,2.数组或表格数据的寻址,(2)赋值语句ai=bj 用两个变址寄存器用DI表示ai的偏移地址,DISP表示a0数组的基地址。 则EA=DSIP+DI 相同的,bi的相对地址可以表示为 EA=DSIP+SI,寄存器相对寻址,2.数组或表格数据的寻址,(3)二维数组A(i,j),aij EA=BX +SIDI EA=DISP+BX +SIDI,基址变址寻址和相对基址变址寻址,3.记录型数组的寻址,F=f(M,I,J) 有点像结构体 F数据记录项的地址 M数组的基本地址 I数组的元素(记录) J元素的数据项 偏移地址=f(基址,变址,位移) EA=BX+SI+DISP,4.堆栈数据结构的寻址,堆栈采用以BP为基址指针的寻址,方便数据结构相同而参数不同的数据存取。 当存取堆栈中简单变量时 EA=BP+DISP 若存取堆栈中的数据和记录 见下图,指令,2000H,AX,12,34,1000H,30000H,33250H,0250H,栈顶,数组首址,寻址方式的综合应用,关于DEC公司的一条记录(1982年): 公司名称:DEC 总裁姓名:Ken Olsen 排 名:137 收 入:40 著名产品:PDP 1988年DEC公司的信息有了变化: 、Ken Olsen 在富翁榜上的排名已升至38位; 、DEC的收入增加了70亿美元; 、该公司的著名产品已变为VAX系列计算机。 任务:编程修改内存中的过时数据。,存储器各种寻址方式的综合性例子,例:设DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H,位移量DISP1618H,试判断下列指令的寻址方式,并求出在各种寻址方式下,这些寄存器与位移量所产生的有效地址EA和物理地址 (实际地址)PA。说明指令执行的结果。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,0618H 这是一条直接寻址方式的指令。 EA0618H PA12000H+0618H12618H 该指令执行的结果是将数据段的实际地址为12618H和12619H两单元中的内容取出送AX。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,BX 这是一条以数据段基址寄存器BX间接寻址的指令。 EA05A6H PA12000H+05A6H125A6H 该指令执行的结果是将数据段的125A6H和125A7H两单元的字内容取出送AX。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,BP 这是一条以堆栈段基址寄存器BP间接寻址的指令。由于寻址时用上了BP寄存器,则操作数所默认的段寄存器就是SS。 EA40A0H PA50000H+40A0H540A0H 该指令执行的结果是将堆栈段的540A0H和540A1H两单元的字内容取出送AX。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,DI 这是一条变址寻址的指令。 EA3000H PA12000H+3000H15000H 该指令执行的结果是将数据段的15000H和15001H两单元的字内容取出送AX。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,BX+DI 这是一条基址加变址寻址的指令。 EA05A6H+3000H35A6HPA12000H+35A6H155A6H 该指令执行的结果是将数据段的155A6H和155A7H两单元的字内容取出送AX。,DS1200H,BX05A6H,SS5000H,BP40A0H,SI2000H,DI3000H, MOV AX,BP+SI+DISP 这是一条带位移量的基址加变址寻址的指令,又叫相对基址加变址寻址的指令,且操作数的默认段为SS。 EA40A0H+2000H+1618H76B8H PA50000H+76B8H576B8H 该指令执行的结果是将堆栈段的576B8H和576B9H两单元的字内容取出送AX。,EA=DISP+BX BP+SIDI PA=相应的段地址*16+EA BP寻址,默认用SS BX,SI,DI寻址默认用DS 越段:DS可被CS,SS,ES越段 SS可被DS,CS,ES越段 不能越段情况:CS:IP, SS:SP, ES总是用来作为目的操作数的段寄存器。,程序存储器寻址方式也就是转移类指令(转移指令JMP和调用指令CALL)的寻址方式。 在8086/8088系统中,由于存储器采用分段结构,所以转移类指令有段内转移和段间转移之分。 所有的条件转移指令只允许实现段内转移,而且是段内短转移。 对于无条件转移和调用指令又可分为段内短转移、段内直接转移、段内间接转移、段间直接转移和段间间接转移等5种不同的寻址方式。,程序转移寻址,寻址方式 计算出操作数的地址 形成程序转移地址 段内转移:改变IP值,不改变CS值 段间转移:改变IP值,改变CS值 无论段内段间都有直接和间接形式,因此程序转移有四种寻址。 段内直接寻址 段内间接寻址 段间直接寻址 段间间接寻址,段内直接寻址,转移偏移地址EA是指令中8位或16位位移量(DISP8.16)与指令IP当前内容相加之后,然后送入IP。即 EA= IP+DISP8.16 IP 当DISP8.16是8位长时,EA形成一个转移范围在-123+127字节之间的短距离转移,则称为短跳转,例如短运算符SHORT的JMP指令、条件转移指令JE等。 注意: DISP8.16是相对IP来计算的。,段内直接寻址,当DISP8.16是16位长时,EA形成一个转移范围在64KB之内的近距离转移,称为近跳转,如JMP指令等。近跳转和短跳转DISP8.16是相对IP计算的,又称相对转移寻址。 例如: JMP NLAB ;近跳转 JMP SHORT SLAB ;短跳转 JE SLAB ;短跳转 . . . NLAB:ADD AX ,BX SLAB:MOV DX ,CX SLAB :INC SI,段内间接寻址,转移偏移地址 EA 如果指定的是16位的寄存器,则将寄存器的内容IP。例如: JMP BX ;EA=BX,EA IP 如果EA指定的是存储器中的一个字,则将该存储单元的内容IP。即:使用存储器的数据寻址方式获得EA,再将EA单元的内容作为转移偏移地址IP ,与CS的内容相加,获得实际的指令转移地址。,段内间接寻址,这种寻址方式仅用于JMP指令和CALL指令中。 例如: JMP NLAB BX ;EA=NLAB+BX, (EA)IP JMP WORD PTR NLABBX,(EA)IP, WORD PTR 操作符说明其后的地址单元是一个字。,段间直接寻址,用指令只直接提供的转移偏移地址EA IP,指令同时直接提供的转移段地址CS,实现从一个代码转移到另一代码段。 例如:CALL FAR PTR NEXTLAB ; FAR PTR 表示段间转移操作符,段间直接寻址,指令 指令,偏移地址,段地址,IP,CS,寻址方式,按数据寻,址方式,计算EA,EA,EA+2,转移偏移地址,段地址,CS,IP,存储器中两个 连续字单元,( a)段间直接寻址,(b)段间间接寻址,图3.9 程序段间的直接或间接转移,段间间接寻址,根据存储器的数据寻址方式获得EA,再将EA双字单元第一个字的内容作为转移偏移地址IP,EA双字单元第二个字的内容作为转移段地址CS,然后CS+IP形成指令的实际转移地址。它和段内间接寻址比较,利用第二个16位数修改了CS的内容,实现段间转移。 例如: JMP FAR PTRBX ;EA=BX,(EA)IP,(EA+2)CS CALL DWORD PTR BX; DWORD PTR 说明其后的地址单元是一个双字,其余同上,段间间接寻址,注意:段内、段间的存储器的数据寻址获得EA后,还要加上合适段寄存器的内容,形成存储器的地址。转移地址PA=CS与IP的新内容之和。程序转移的四种寻址均适用指令JMP与CALL。 为了说明间接转移怎样同一些数据寻址方式结合操作,假设BX=1256H,SI=528FH,DISP=20A1H,DS的内容已知,则 用寄存器相对寻址(BX寄存器),转移偏移地址IP=(1256H+20A1H+DS24); 用BX和SI作为基址变址寻址,转移偏移地址IP=(1256H+528FH+DS24)。,3.2 实方式32位指令寻址,3.2.1 数据与地址类型 32位CPU可处理:字节,字,双字,可访问字节地址,字地址,双字地址。 位域 最长达32位 位串 232 -1位,3.2 实方式32位指令寻址,3.2.2 32位的指令寻址方式 EA=基址+变址*比例因子+位移量 基址寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP 变址寄存器: EAX,EBX,ECX,EDX,ESI,EDI,EBP 比例因子:1,2,4,8分别用于字节,字,双字,四字的变量变址。,3.2.3 实地址32位指令寻址,与16位7种寻址方式相同 前缀代码67H和66H,3.3 指令系统,8086/8088指令系统中的指令按功能可分为六类:,数据传送指令,算术运算指令,逻辑运算 与移位指令,串操作指令,控制转移指令,处理机 控制指令,约定,OPD表示目的操作数 (。)表示。里面的内容 OPS表示源操作数 表示传送 R表示通用寄存器 Sr表示段寄存器:SS,CS,DS,ES M表示主存储器 XXXX表示组合号 - 表示其前后组成一个数 L表示操作数的长度 d表示立即数 B/W/D表示字节、字、双字,数据传送指令,(1) 通用传送指令,1)传送指令MOV,指令格式:MOV OPD,OPS,执行操作:(OPD)(OPS),功能:在CPU与存储器之间或CPU内部传送数据。,标志位:不受影响,例: MOV AL,E,指令执行后:,(AL)= 45H,(1) 通用传送指令,注意:,例: 判断下列指令是否合法:,MOV DS,AX,不允许两个操作数都是存储器单元,MOV CS,AX,MOV CH,4050H,MOV DL,5BH,MOV DX,5BH,MOV DX,AL,MOV VA1,VA2,MOV 45,DL,目的操作数不允许是CS段寄存器,目的操作数不允许是立即数,数据类型不匹配,数据类型不匹配,小结MOV指令的正确格式,mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 寄存器,段寄存器 同学们自己用DEBUG验证。然后写出总结,例如: mov 寄存器,数据/寄存器/内存单元/段寄存器 mov 内存单元,?/?/?/? mov 段寄存器(除了CS),?/?/?/?,2)MOVSX,MOVZX指令,指令格式:MOVSX OPD,OPS,执行操作:(OPD)=(OPS)的符号全延伸 -(OPS),指令格式:MOVZX OPD,OPS,执行操作:(OPD)=0全延伸 -(OPS) 注意: (1)OPD为R,OPS为R/M,OPS的长度必须小于OPD长度 (2)指令执行后,不影响标志位,(OPS)不变,3)交换指令 XCHG,指令格式:XCHG OPD,OPS,执行操作:(OPD)(OPS),功能:两个操作数互换,例: XCHG AX,BX,设(AX)=1024H (BX)=2048H,指令执行后: (AX)=2048H (BX)=1024H,等效三条MOV指令: MOV CX,AX MOV AX,BX MOV BX,CX,4)入栈指令 PUSH 和出栈指令 POP,指令格式:PUSH OPS,执行操作:(SP)(SP)-2 ((SP)+1,(SP))(OPS),功能:将指定的字数据压入栈顶,指令格式:POP OPD,执行操作: (OPD) ((SP)+1,(SP)) (SP)(SP)+2,功能:将栈顶字数据弹出堆栈,例: PUSH AX POP BX,执行指令前后状态:,31,04,堆栈段,栈顶,SP,3001H 3002H 3003H 3004H,1. PUSH AX,2. POP BX,3104,执行指令前:,执行指令后:,设:(AX)= 3104H (BX)= 1000H,前者8个字 16个字节 000FH 后者8个双字 32个字节 001FH,5)PUSHA 和POPA PUSHAD和POPAD,6) 地址传送指令,LEA指令,指令格式: LEA OPD,OPS,执行操作:(OPD)OPS的偏移地址 OPD是16/32位的R,OPS是M,功能:将源操作数的偏移地址送指定寄存器 操作对标志位无影响。,例: LEA DX,BUFFER,设: BUFFER单元的地址 = F000H : 4300H,指令执行后:,如果指令 改为: MOV DX,BUFFER,指令执行后:,(BUFFER) = 5000H,(DX)= 4300H,(DX)= 5000H,这条指令通常用来建立串操作指令所须的寄存器指针。,STRING DB Hello World!,13,10,$ LEA DX,STRING ;意思是将STRING所在的偏移地址送入DX。 MOV AX,9 INT 21H ;这两句的功能为显示字符串。显示DS:DX指向的内存并以“$”结束的字符串。 假如STRING所在偏移地址为0770H,那么即是将0770HDX,LDS/LES/LFS/LGS/LSS指令 取段地址和偏移地址指令 格式: LDS/LES/LFS/LGS/LSS OPD,OPS EA=OPS OPD为R(16位),OPS为M(32位) 操作对标志位没影响 执行后结果为: (EA)R 偏移地址中的值送到寄存器中(OPD中) (EA+2) DS/ES/FS/GS/SS 偏移地址+2单元里面的值送入相应段寄存器中。,例:,mov word ptr 3060h,0100h mov word ptr 3062h,1450h LES di,3060h LDS si,3060h LSS sp, 3060h,M指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:R或ES:R或SS:R,不影响标志位,影响标志位,PUSHF指令,flags中的标志字,堆栈,栈顶 字数据 出栈,POPF指令,设置TF标志位: ( flags中的 TF=1 ) PUSHF POP AX OR AX, 0100H PUSH AX POPF,flags,(7)标志传送指令,传送标志寄存器flags中的标志位(16位),PUSHFD/POPFD 和上两个一样,除了是对双字操作。(32位) 格式书上有。,(7)标志传送指令,(7)标志传送指令,LAHF / SAHF指令 格式:LAHF ;取标志,FLAGS低8位依次AH SAHF ;存标志, AH依次 FLAGS低8位 MSBLSB 70 SF ZF 空 AF 空 PF 空 CF 取标志位不影响标志位 存有可能会影响,(7)标志传送指令,例如: LAHF OR AH,85H SAHF 请问符号位发生什么变化?,3.3.3 逻辑运算和移位指令,位操作指令可以体现汇编语言对硬件的控制能力。,1 逻辑运算指令,按位进行逻辑与、或、异或、非运算、测试位的操作。,1) 逻辑与指令AND,AND OPD,OPS,(OPD)(OPD)(OPS),2) 逻辑或指令OR,OR OPD,OPS,(OPD)(OPD)(OPS),(OPD)(OPD) (OPS),3)异或指令XOR,XOR OPD,OPS,4)逻辑非指令NOT,NOT OPD,(OPD)(OPD)求反,5)位测试指令TEST,TEST OPD,OPS,(OPD)(OPS),源操作数,1 保留原值,0 置0,特点:,1010 0 011,目的操作数 源操作数,(1)逻辑与操作,0010, 何时该用何种逻辑操作?,源操作数,1 置1,0 保留原值,特点:,1010 0 011,目的操作数 源操作数,(2)逻辑或操作,1011,源操作数,1 取反,0 保留原值,特点:,1010 0011,目的操作数 源操作数,(3)异或操作,1001, 如何确定源操作数?,例:将AL的D0位和D1位清0。,设(AL)= BFH,指令为,AND AL, ?,分析:1011 1111B, 1111 1100B (FCH),1011 1100B,应将源操作数取为立即数FCH,指令为:,AND AL,0FCH,执行指令后: (AL)=BCH,根据上述操作的特点,可以确定该用什么操作实现需要的功能: 某些位清0 (保留其他位)用逻辑与操作 某位置1 用逻辑或操作,某位求反用异或操作,例:将AL中的大写字母(AL)= 41H 转换为小写字母,即 41H 61H,指令为: OR AL, ?,分析: 0100 0001B (41H), 0010 0000B (20H),20H,执行指令后: (AL)=61H,小写转换为大写的指令为:,AND AL, ?,0DFH, 110 1 1111B (DFH),执行指令后: (AL)=41H,0110 0001B (61H),0100 0001B (41H),根据需要的功能,先确定逻辑运算指令,再利用逻辑运算指令的特点确定源操作数。, 逻辑运算方法:,例:测试AL的D0位是否为1。,MOV AL,0F3H,TEST AL,01H,执行指令后: ZF=0,分析:1111 0011B, 0000 0001B,0000 0001B,根据ZF=0可知AL的D0位为1,指令系统有专门的指令来检测ZF的设置,从而控制程序的处理流程。JZ rel ZF=0 则转移 rel,2 移位指令,1)逻辑左移指令,SHL opd,count,2)算术左移指令Arithmetic,SAL opd,count,(分为逻辑移位、算术移位和循环移位三类),OPD 为8/16/32位的R/M OPS是计数值(移位的次数):1、8位立即数,或CL的内容(移位前将将要移位的次数送入CL中。) 最后移出的位保存在CF中。,逻辑左移与算数左移物理上完全相同。,例:将BL中的值逻辑左移1位 ,设(BL)=AFH,SHL BL,1,执行指令后: (BL)=5EH CF=1,3)逻辑右移指令,SHR opd,count,4)算术右移指令,SAR opd,count,OPD 为8/16/32位的R/M OPS是计数值(移位的次数):1、8位立即数,或CL的内容(移位前将将要移位的次数送入CL中。) 每次右移后,LSB位保存在CF中。 SHR: 最高位补0 SAR: 符号位(MSB)不变 ,从位6开始右移,例:将BL中的值逻辑右移1位 ,设(BL)=AFH,SHR BL,1,执行指令后: (BL)=57H CF=1,例:将BL中的值算术右移1位 ,设(BL)=AFH,SAR BL,1,执行指令后: (BL)=D7H, 逻辑移位总是补0 ,算术移位保持符号。,移位位数大于1时,必须用CL寄存器给出移位位数。,5)循环左移指令,ROL opd,count,6)带进位循环左移指令,RCL opd,count,7)循环右移指令,ROR opd,count,8)带进位循环右移指令,RCR opd,count,循环移位,例:将BL中的值循环左移1位 ,设(BL)=AFH,ROL BL,1,执行指令后: (BL)=5FH,注意:如果移位位数大于1,必须用CL寄存器给出移位位数。 只有在实方式情况下,OPS可以为8位立即数(=2的情况),例:将BX指向的存储器单元的高字节与低字节互换位置。,MOV CL,8 ROR BX,CL,设 执行指令前: (DS)=3000H,(BX)=0150H (30150H)=5B40H,执行指令后:,(30150H)=405BH ,CF=0,算术、逻辑移位可用于:, 改变数据二进制位的位置(丢失移出的位) 二进制的整次幂的乘法(左移)、除法(右移) 算术移位用于带符号数操作 逻辑移位用于无符号数操作,循环移位可用于:, 改变数据二进制位的位置(不丢失移动的位),双精度移位指令,SHLD OPD,OPS,移位位数 双精度左移 SHRD OPD,OPS,移位位数 双精度右移 双精度移位指令 指令操作数的初值 指令执行后的结果 SHLD AX, BX, 1 (AX)=1234H,(BX)=8765H (AX)=2469H SHLD AX, BX, 3 (AX)=1234H,(BX)=8765H (AX)=91A4H SHRD AX, BX, 2 (AX)=1234H,(BX)=8765H (AX)=448DH SHRD AX, BX, 4 (AX)=1234H,(BX)=8765H (AX)=5123H 环境不支持,移位指令中,溢出标志位OF的设置规则为: 如果只移动一位,则系统按照操作数的最高符号位在移位前后是否发生改变,来相应地设置溢出标志OF的值:如果移位前操作数的最高符号位与移位后操作数的最高符号位不相同(有变化),则设置OF=1,认为溢出了;否则,设置OF=0,认为没有溢出; 但是,如果移位位数大于1,则OF的值不确定;也就是说,溢出标志OF的值只有在移位位数为1时才有意义,算术运算指令,算术运算指令完成加、减、乘、除。,(1)加法指令 验证,完成二进制的加法、带进位加法、加1。,1)加法指令ADD 验证,ADD OPD,OPS,(OPD)(OPD)+(OPS),影响CF、AF、OF、PF、SF、ZF 标志位。,2)带进位加法指令ADC 验证,ADC OPD,OPS,( OPD )( OPD )+( OPS )+CF(进位标志位的值),3) 加1指令INC,INC opd,(opd)(opd)+1, CF=1:无符号数运算溢出 最高有效位有进位时,CF置1, OF=1:带符号数运算溢出 两个同符号操作数的运算结果 符号发生变化时, OF置1,CF、OF 标志位在加法运算中的作用:,255,-1,0 255,127 -128,1 1 1 1 1 1 1 1,S,1 1 1 1 1 1 1 1,(不影响CF ),例: 用ADD、ADC指令执行两个双字加法运算。,计算:0002F360H + 0005E020H = 0008D380H,设执行指令前: (DX)=0002H, (AX)=F360H, (BX)=0005H, (CX)=E020H,ADD AX,CX,ADC DX,BX,执行第一条指令ADD:,F360H + E020H,(AX)=D380H,SF=1,ZF=0 CF=1,OF=0,执行第二条指令ADC :,0002H + 0005H + 1H ( CF ),(DX)=0008H,SF=0,ZF=0 CF=0,OF=0,1 D380H,0008H,例: INC CX,设指令执行前: (CX) = 0005H 指令执行后: (CX) = 0006H, INC常用于: 寄存器或存储器单元自增,修改计数 器或地址,比加法指令简便、效率高。,ADD CX, 1,(一般不用这种方式),对于双字加法,用ADC指令:低位字加法的进位高位字,4)XADD OPD,OPS 交换并相加指令 (实验环境不可用) OPD+OPS TEMP OPD OPS TEMP OPD 例如: AL=12H,BL=34H XADD AL,BL 执行指令后:AL= BL=,1)减法指令 SUB,SUB OPD,OPS,2)带借位减法指令 SBB,(OPD) (OPD) - (OPS),SBB OPD,OPS,(OPD) (OPD) (OPS) - CF(借位值),3)减1指令 DEC,DEC opd,(opd) (opd) -1,(2)减法指令,影响AF、CF、OF、PF、SF、ZF标志位,完成二进制减法、带借位减法、减1、求补和比较运算。,例:求补指令举例,NEG AL,设:执行指令前:(AL)= 02H,执行指令时: 计算 0FFH -(AL)+1,1111 1111B - 0000 0010B,等效求反,4)求补指令NEG,NEG opd,(opd)0FFH -(opd)+1(字节操作),或(opd)0FFFFH -(opd)+1(字操作),1111 1101B + 0000 0001B,(AL) = FEH,1111 1110B,加1,FFH (AL),等效求补,1111 1101B,(FEH的原码十进制值是-2 ), NEG指令的功能: 改变操作数的符号,可用于取操作数的绝对值,5)比较指令 CMP,CMP opd,ops,(opd)-(ops),例 : 比较指令CMP 举例,设指令为: CMP AX,CX,指令执行后如何判别AX和CX 的大小关系? (以无符号数为例),ZF =,CF =,1,即(AX)=(CX) (AX) - (CX) = 0,0,即(AX)(CX) (AX) - (CX) 0,1,即(AX)(CX) 有借位,0,即(AX)(CX) 无借位,CMP指令仅仅做减法并设置标志位 判别大小关系由条件转移指令完成(后边介绍)。, CMP和SUB 指令的差别?(操作与用途),练 习,MOV CH,4 BX=1234H LAB:MOV CL,4 ROL BX,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,3AH JC PRINT JC:CF=1则转移 ADD DL,7 PRINT:MOV AH,02 INT 21H DEC CH JNZ LAB,(3) 乘法指令,两条指令:无符号数乘法指令和带符号数乘法指令。,MUL OPS,字节操作: (AX) (AL) * (OPS),2)带符号数乘法指令IMUL,IMUL OPS,1)无符号数乘法指令,标志位:影响CF和OF,其它标志位无定义。,操作与MUL相似,不同处是操作数为带符号数。,字操作: (DX (高位字),AX (低位字) (AX)* (OPS),CF 和 OF 标志位可判定乘积的数据类型:,CF=OF=0,字节乘字节的积,字 乘 字 的积,CF=OF=1,字节乘字节的积,字 乘 字 的积,字节,字,双字,字,例: 比较无符号数和带符号数乘法指令,设指令执行前: (AL)=A4H (BL)=12H,(A4H) 无符号数 带符号数,164,-92,(12H ) 无符号数 带符号数,18,18,执行IMUL后: (AX)0F988H = -1656 CF1,OF1,执行MUL后: (AX)0B88H2952 CF1,OF1,IMUL BL MUL BL,(4) 除法指令,无符号数和带符号数除法指令。,1)无符号数除法指令,2)带符号数除法指令,IDIV OPS ( 操作同DIV,不同处是操作数为带符号数。),字节操作:(AL)(AX) / (OPS)的商 (AH)(AX) / (OPS)的余数,字操作: (AX)(DX-AX) / (OPS)的商 (DX)(DX-AX) / (OPS)的余数,DIV OPS,div 指令,div指令格式: div reg div 内存单元 使用div作除法的时候: 除数:8位或16位,在寄存器或内存单元中 被除数:(默认)放在AX 或 DX和AX中 结果:运算 8位 16位 商 AL AX 余数 AH DX,div 指令,div指令示例 div byte ptr ds:0 含义为:(al)=(ax)/(ds)*16+0)的商; (ah)=(ax)/(ds)*16+0)的余数 div word ptr es:0 含义为:(ax)=(dx)*10000H+(ax)/(ds)*16+0)的商; (dx)=(dx)*10000H+(ax)/(ds)*16+0)的余数,div 指令,div指令示例(续) div byte ptr bx+si+8 含义为: (al)= (ax)/(ds)*16+(bx)+(si)+8)的商; (ah)=(ax)/(ds)*16+(bx)+(si)+8)的余数,div 指令,div指令示例(续) div word ptr bx+si+8 含义为:(ax)=(dx)*10000H+(ax)/(ds)*16+(bx)+(si)+8)的商; (dx)=(dx)*10000H+(ax)/(ds)*16+(bx)+(si)+8)的余数,div 指令,编程: 利用除法指令计算100001/100。 我们首先分析一下,被除数 100001 大于65535,不能用ax寄存器存放,所以我们要用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。 除数100小于255,可以在一个 8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。,div 指令,编程: 利用除法指令计算100001/100。(分析续),因为要分别为dx和ax赋100001的高16位值和低16位值,所以应先将100001表示为十六进制形式:186A1H。,div 指令,编程: 利用除法指令计算100001/100。(程序) mov dx,1 mov ax,86A1H ;(dx)*10000H+(ax)=100001 mov bx,100 div bx 程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。 读者可自行在Debug中实践。,div 指令,编程: 利用除法指令计算1001/100。 我们首先分析一下被除数1001可用 ax寄存器存放,除数100可用 8位寄存器存放,也就是说,要进行8位的除法。程序如下: mov ax,1001 mov bl,100 div bl 程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。 读者可自行在Debug中实践。,例:93H/45H, 被除数不是16位,应当扩展为16位,如何扩展?,简便起见,以 3为例,讨论二进制数位的扩展问题:,8位的二进制 3,0000 0000 0000 0011,8位的二进制-2,1111 1111 1111 1110,数据位扩展方法:用符号位进行数位的扩展。,上述能保持符号的数据位扩展方法称为:符号扩展。, 如果操作数字长不满足除法指令的要求,怎么办?,扩展为16位,扩展为16位,0000 0011,1111 1110,3)字节转换为字指令,CBW,执行操作:将(AL)的符号扩展到AH,构成字 (AX),( AL ) 7 =,0 时,使 (AH)=00H,1 时,使 (AH)=FFH,4)字转换为双字指令,CWD,执行操作:将(AX)的符号扩展到DX,方法类似。,例,DIV BL,(AL)= 0CH=商,(AH)= 50H=余数,执行指令后:,:设执行指令前:(AX)=0800H ( BL)=A4 H,有两条指令完成符号扩展功能:,(5) 十进制调整指令,BCD码有压缩和非压缩两种格式:,例:(95)10 = (1001 0101)BCD, 压缩的BCD码:用四位二进制数表示一位十进制数, 非压缩的BCD码:用八位二进制数表示一位十进制数,例:(95)10 = (00001001 00000101)BCD,BCD码, BCD码建立了二进制与十进制的联系, 算术运算指令只能完成二进制运算,十进制数调整指令可二进制运算结果进行调整,得到用BCD码表示的十进制数。,8位非压缩BCD码的高4位可以是任意值 ,因此数字字符的ASCII码看成 一种非标准的压缩的BCD码,例:5的ASCII码为 35H(0011 0101)BCD,十进制调整指令共有6条指令,分为: (1) 压缩的BCD码调整指令 (2)非压缩的BCD码调整指令,5 (非压缩的BCD码),压缩的8421码调整指令: DAA(Decimal Adjust for Addition) 加法的十进制调整指令 DAS(Decimal Adjust for Subtraction)减法的十进制调整指令 ADD、 ADC以及SUB、 SSB指令只用于二进制数加、减法, 是逢二进一,借一当二, 对连续的4位二进制数是逢十六进一, 借一当十六。但压缩的8421码却是逢十进一,借一当十。因此使用加、减法指令对8421码运算后,必须经调整才能得到正确的结果。,非压缩的8421码调整指令: AAA(ASCII Adjust for Addition)加法的ASCII调整指令 AAS(ASCII Adjust for Subtraction)减法的ASCII调整指令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论