第五单元综合测试题.ppt_第1页
第五单元综合测试题.ppt_第2页
第五单元综合测试题.ppt_第3页
第五单元综合测试题.ppt_第4页
第五单元综合测试题.ppt_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

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

文档简介

1、,第三章,IBM PC机的指令系统和寻址方式,第三章 IBM PC机的指令系统和寻址方式,每种计算机都有一组指令集提供给用户,这组指令集就是计算机的指令系统 计算机中的指令由操作码字段和操作数字段两部分组成 指令的格式:,操作码目的操作数,源操作数;注释,3.1 IBM PC机的寻址方式,3.1.1 与数据有关的寻址方式 3.1.1.1 立即寻址方式 立即数:操作数直接放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里。这种操作数称为立即数 立即寻址方式用来表示常数,它经常用于给寄存器赋初值,且只能用于源操作数字段,不能用于目的操作数字段 例:MOVAL,5 例:MOVAX,306

2、4H,注意:1. 立即数永远不能作目的操作数。 2. 源操作数和目的操作数要互相匹配。,3.1.1.2 寄存器寻址方式,操作数在寄存器中,指令指定寄存器号 寄存器寻址方式不需要访问存储器来取得操作数,因而运算速度较快,是执行速度最快的寻址方式。 例:MOVAX,BX MOVD L,CH 错误指令: MOVA L,BX MOVS P, CH,操作数地址的取得,操作数地址由段基地址和偏移地址相加取得 段基地址在实模式和保护模式下可从不同途径取得。 在80X86里,把操作数的偏移地址称为有效地址(EA),有效地址的计算如下: EA=基址+(变址*比例因子)+位移量,存放在基址寄存器中的内容,常用来指

3、向数据段中数组或字符串的首地址,存放在变址寄存器中的内容,常用来访问数组中的某个元素或字符串中的某个字符,可用变址寄存器的内容乘以比例因子来取得变址值,可以是1,2,4,8.,存放在指令中的一个8位、16或32位的数,但它不是立即数,而是一个地址,3.1.1.3 直接寻址方式,有效地址EA:操作数的偏移地址就是有效地址 在直接寻址方式中,有效地址EA就在指令中,它存放在代码段中指令操作码之后,操作数一般存放在数据段中,所以必须先求的操作数的物理地址,然后再访问存储器取得操作数 在汇编语言中,可以用符号地址代替数值地址。 MOV AX,VALUE MOV AX,VALUE MOV AX,ES:V

4、ALUE,VALUE为存放操作数单元的符号地址,等效,段跨越,例:MOVAX,2000H; 已知(DS)=3000H, (32000H)=3050H 则(AX)=3050H,3.1.1.4 寄存器间接寻址,操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中 MOV AX,BX;AXDS16BX MOV AL,BX;ALDS16BX MOV AX,SI;SIDS16SI MOV AX,DI;AXDS16DI MOV AX,BP;AXSS16BP MOV AX,ES:BX;AXES16BX MOV AX,DS:BP;AXDS16BP 例:MOVAX,BX;其中(DS

5、)=2000H,(BX)=1000H,(21000H)=50A0H,3.1.1.5 寄存器相对寻址方式(直接变址寻址方式),操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和 对于寄存器为BX、SI、DI,段寄存器用DS;对于寄存器BP,段寄存器用SS。 物理地址=16d*(DS)+(BX)+位移量 或=16d*(DS)+(SI)+位移量 或=16d*(DS)+(DI)+位移量 或=16d*(SS)+(BP)+位移量 例:MOV AX,COUNTSI;已知(DS)=3000H,(SI)=2000H,COUNT=3000H,(35000H)=1234H,3.1.1.

6、6 基址变址寻址方式,操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和 若基址寄存器是BX,则段寄存器使用DS;若基址寄存器是BP,则段寄存器使用SS 物理地址=16d*(DS)+(BX)+(SI) 或 =16d*(DS)+(BX)+(DI) 或 =16d*(SS)+(BP)+(SI) 或 =16d*(SS)+(BP)+(DI) 例:MOV AX,BXDI;已知(DS=)2100H,(BX)=0158H,(DI)=10A5H;(221FDH)=1234H,还可以写成: MOV AX,BX+DI,3.1.1.7 相对基址变址寻址方式,操作数的有效地址是一个基址寄存器和一个变址寄存器的内

7、容和8位或16位位移量之和。 物理地址=16d*(DS)+(BX)+(SI)+位移量 或 =16d*(DS)+(BX)+(DI)+位移量 或 =16d*(SS)+(BP)+(SI)+位移量 或 =16d*(SS)+(BP)+(DI)+位移量 例:MOV AX,MASKBXSI;已知(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,(33250H)=1234H,也可以写成: MOV AX, BX+SI+2050H,操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和。 优点:对于元素大小为2,4,8字节的数组,可以在变址寄存器中给出数组

8、元素下标,而由寻址方式控制直接用比例因子吧下标转换为变址值 例:MOV EAX,COUNTESI*4,3.1.1.8 比例变址寻址方式,操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上基址寄存器的内容之和。 例:MOV ECX,EAXEDX*8,3.1.1.9 基址比例变址寻址方式,3.1.1.10 相对基址比例变址寻址方式,操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加上基址寄存器的内容再加上位移量之和。 例:MOV EAX,TABLEEBPEDI*4,总结:,在直接寻址中,地址可以用符号代替,如 “MOV AX,WORD_ADDR”,相当于“MOV AX,xx

9、xxH”, “WORD_ADDR”称为变量或符号地址。 偏移量可以是变量或符号数。 如果一条指令有两个操作数,源操作数和目的操作数的寻址方式可能相同,也可能不同,如指令 “MOV AX,BX”,源操作数为寄存器间接寻址,目的操作数为寄存器寻址。 很多寻址方式允许段跨越,3.1.2 与转移地址相关的寻址方式,3.1.2.1 段内直接寻址 转向的有效地址是当前IP寄存器的内容和指令中指令的8位或16位位移量之和 指令中的位移量是转向的有效地址与当前IP之差 指令的汇编语言格式为: JMP NEAR PTR PROGIA JMP SHORT QUEST,3.1.2.2 段内间接寻址,转向有效地址是一

10、个寄存器或是一个存储单元的内容。该寄存器号或内存地址按上节介绍的与操作数有关的寻址方式(立即寻址方式除外)获得。所得到的有效地址送给IP,于是实现转移。 指令的汇编格式可以表示为: JMP BX JMP WORD PTRBP+TABLE 物理地址=16d*(CS)+EA,设:(DS) 2000H,(BX)0300H (IP)0100H,(20300H)0 (20301H)0005H 则: 例1: JMP BX ;执行后(IP)(BX) 0300H 例2: JMP WORD PTR BX,式中WORD PTR BX表示BX指向一个字型内存单元。这条指令执行时,先按照操作数寻址方式得到存放转移地址

11、的内存单元:10H (DS)(BX) 20300H再从该单元中得到转移地址:EA(20300H) 0500H于是,(IP)EA0500H,下一次便执行CS:500H处的指令,实现了段内间接转移,3.1.2.3 段间直接寻址,指令中直接给出转向的4字节的偏移量和段基址,只需把它们分别送给IP和CS后即可实现段间转移。 指令格式:JMP FAR PTR NEXTROUTINT 其中:NEXTROUTINT为转向的符号地址,FAR PTR是表示段间转移的操作符,3.1.2.4 段间间接寻址,用一个双字内存变量中的低16位取代IP值,高16位取代CS值,从而实现段间转移。该双字变量的地址可以由除立即寻

12、址和寄存器寻址方式以外的其它与数据有关的寻址方式获得。 指令格式为:JMP DWORD PTRINTERS+BX 其中:INTERS+BX说明数据寻址方式为直接变址寻址方式,DWORT PTR为双字操作符,说明转向地址需取双字为段间转移指令,设:(DS) 2000H,(INTERS+BX) 0300H (IP) 0100H,(20300H) 0 (20301H) 05H,(20302H) 10H (20303H) 60H 则: 例. JMP DWORD PTR INTERS+BX 这条指令执行时,先按照与操作数有关的寻址方式得到存放转移地址的内存单元: 16d(DS)(INTERS+BX) 2

13、0300H 再把该单元中的低字送给IP,高字送给CS,即0500H IP,6010HCS,下一次便执行6010:0500H处的指令,实现了段间间接转移。,上边介绍的与转移地址有关的寻址方式完全适用于386以上的实模式环境。保护模式下的虚拟8086方式转移地址的形成与此类似,只是32位的偏移量送给EIP,但高16位清0,这是因为段长不能超过64K的缘故。 对于32位的保护模式,其段内转移的目标地址的形成与以上所介绍的16位机相比较没有太大变化,只是偏移量为32位、并把该偏移量送给EIP指令指针寄存器而已。 而段间转移的目标地址采用48位全指针形式,即32位的偏移量和16位的段选择子。段间转移的目

14、标地址的形成比较复杂,需要涉及到任务门、调用门等知识。,3.3 IBM PC机的指令系统,指令告诉CPU执行什么样的操作及操作数从哪里得到。指令可以用大写、小写或大小写字母混合的方式书写。要熟悉指令的寻址方式和功能,并能灵活运用它们。掌握指令对标志的影响,避免非法指令。 IBM PC机的指令系统可以分为6类: 数据传送类指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制指令,3.3.1 数据传送指令,数据传送指令可以实现数据、地址、标志的传送。该类指令负责把数据、地址或立即数传送到寄存器或存储器中。除了目标地址为标志寄存器的传送指令外,本组的其它指令不影响标志。 数据传送指令可以分

15、为四种: 通用数据传送指令 累加器专用传送指令 地址传送指令 标志寄存器传送指令,3.3.1.1 通用数据传送指令,1、MOV传送指令 一般形式:MOV DST,SRC 执行操作:SRC(源) DST(目标) 语法格式: MOVmem/reg1,mem/reg2 MOVreg,data MOVac,mem MOVmem,ac,MOVseg/reg,mem/reg MOVmem/reg,seg/reg MOVmem/reg,data 说明: 立即数只能作源操作数,且要与目的操作数匹配。 两个操作数类型要匹配。 如汇编程序无法确定操作类型,要加类型说明符。 CS一般不能作目的操作数(用转移指令改变

16、)。 如果指令有两个操作数,不允许两个都是存储器数。 所有“MOV”类指令均不影响标志。,MOV指令数据传送方向示意图,段寄存器 (CS除外),存储器,立即数,通 用 寄 存 器 (8位) (16位) (32位),例1 : MOV BYTE PTR BX,55H 或者MOV WORD PTR BX,55H 例2:MOVAX,DATA-SEG MOV DS,AX 例3:MOVAL,E 例4:MOV BX,OFFSET TABLE 例5:MOVAX,YBPSI,加类型说明符确定操作类型。若写成MOV BX,55H,则会警告。,CS不能作目的操作数,可用转移指令改变CS。,有单引号,表示取的数字的A

17、SCII码,而不是数字本身,OFFSET表示取TABLE偏移地址,而不是内容!,一般形式:MOVSX DST,SRC 执行操作:符号扩展SRC(源) DST(目标) 语法格式: MOVSXreg1,reg2 MOVSXreg,men 例: MOVSX EAX,CL,2、MOVSX带符号扩展传送指令(386及后继机型可用),一般形式:MOVZX DST,SRC 执行操作:零扩展SRC(源) DST(目标) 语法格式: MOVSXreg1,reg2 MOVSXreg,men 例: MOVZX DX,CL,3、MOVZX带零扩展传送指令(386及后继机型可用),堆栈操作指令,堆栈是在内存的堆栈段中,

18、具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单元。,4 PUSH进栈指令,格式为:PUSHSRC 执行的操作为: SPSP-1,SS:SPSRC高8位 SPSP-1,SS:SPSRC低8位 例:PUSH BX;(设DS:BX字单元数据为55AAH),先修改堆栈指针使其指向新的栈顶,然后把SRC压入(拷贝)到栈顶单元。,SRC可以是16位或32位(386以上)的寄存器操作数或存储器操作数。在80286以上的机器中,SRC还可以是立即数。若SRC是16位操作数,则堆栈指针减2;若SRC是32位操作数,则堆栈指针减4。,5 POP出栈指令,格式为:P

19、OPDST 执行的操作为: DST低8位SS:SP,SP SP+1 DST高8位SS:SP,SP SP+1 例:POP BX。,先把堆栈指针所指向单元的内容弹出(拷贝)到DST,然后修改堆栈指针以指向新的栈顶。,DST可以是16位或32位(386以上)的寄存器操作数和存储器操作数,也可以是除CS寄存器以外的任何段寄存器。若DST是16位,则堆栈指针加2;若DST是32位,则堆栈指针加4。,使用堆栈指令:,堆栈操作是字操作指令,不要写出“PUSH AL”等。 在“POP”指令中,“POP CS”为非法指令。 堆栈中的数据弹出后,数据并没有在堆栈中消失, 除非压入新数据,画图时注意。 堆栈操作指令

20、不影响标志。 使用堆栈指令保护和恢复现场时,要注意指令的 排列顺序,如:,PUSH AX PUSH BX PUSH DS . . . POP DS POP BX POP AX,格式:PUSHA PUSHAD 执行操作: PUSHA:16位通用寄存器依次进栈,进栈顺序为:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI。指令执行后(SP)(SP)-16仍然指向栈顶 PUSHAD:32位通用寄存器依次进栈,进栈顺序为:EAX, ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI指令执行后(SP)(SP)-32仍然指向栈顶,6、PUSHA/PUSHAD 所有寄存器进栈指令,

21、格式:POPA POPAD 执行操作: POPA:16位通用寄存器依次出栈,出栈顺序为:DI,SI,BP,SP,BX,DX,CX,AX 。指令执行后(SP)(SP)+16仍然指向栈顶 POPAD:32位通用寄存器依次进栈,进栈顺序为: EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX指令执行后(SP)(SP)+32仍然指向栈顶,7、POPA/POPAD 所有寄存器出栈指令,8、XCHG交换指令,格式为:XCHG OPR1,OPR2 执行的操作为(OPR1) (OPR2) 功能: 交换两个操作数。 说明: OPR是寄存器或者存储器操作数,但不允许同时为存储器。可以同时为是8位、16

22、位、32位。,例1.设:(AX) 1234H,(BX) 4567H,则: XCHG AX,BX 执行后(AX) 4567H,(BX) 1234H 例2. XCHG CX,WORD PTR BX 例3. XCHG ECX,EDX,3.3.1.2 累加器专用传送指令,1、IN输入指令 格式: IN ACR,PORT 功能: 把外设端口(PORT)的内容传送给累加器(ACR)。 说明: 可以传送8位、16位、32位,相应的累加器选择AL、AX、EAX。若端口号在0255之间,则端口号直接写在指令中;若端口号大于255,则端口号通过DX寄存器间接寻址,即端口号应先放入DX中。,例. IN AL,61H

23、 IN AX,20H MOV DX,3F8H IN AL,DX IN EAX,DX,这两条指令为寄存器间接寻址,但对DX不加中括号,MOV指令中要加中括号。(MOV AL,BX;IN AL,DX),2、OUT输出指令,格式:OUT PORT,ACR 功能: 把累加器的内容传送给外设端口。 说明: 可以传送8位、16位、32位,相应的累加器选择AL、AX、EAX。若端口号在0255之间,则端口号直接写在指令中;若端口号大于255,则端口号通过DX寄存器间接寻址,即端口号应先放入DX中。,例: OUT 61H,AL;61H端口 (AL) OUT 20H,AX;20H端口 (AX) MOV DX,3

24、F8H OUT DX,AL;3F8H端口 (AL) OUT DX,EAX;DX所指向的端口 (EAX),总结: 输入输出指令从寻址方式来说分成两种: 直接寻址和寄存器DX间接寻址。如果要访问的端口地址 在0255之间,既可以用直接寻址,也可以用DX间接寻 址;如果要访问的端口地址256,则只能用DX间接寻 址。另外,输入输出指令中可用的数据寄存器只能是 AL和AX,其他寄存器不可使用。不影响标志。,3、XLAT换码指令(查表指令),格式为:XLATOPR或XLAT 执行的操作为: (AL) (BX)+(AL) 功能: 通过AL寄存器中的索引值在表中查得表项内容并返回到AL中。 说明: 该指令的

25、操作数是隐含的(AL),且寻址方式可理解为寄存器相对寻址,偏移量在AL中。使用这条指令之前,数据段中应有一个字节型表,该表起始地址的偏移量(首地址)应放入BX,表索引值(需转换代码)放入AL。,例: 通过查表转换指令,把015之间的十进制数转换成十六进制数的ASCII值。为了实现这个功能,需要先造一个十六进制数的ASCII值表,其顺序为09、AF。设要查11的十六进制数的ASCII值,编写如下程序段: TAB DB 0,1,2,3,4,5,6,7,8, 9,A,B,C,D, E,F MOV AX , SEG TAB MOV DS , AX MOV BX , OFFSET TAB MOV AL

26、, 11D XLAT,查表步骤 在内存中建立数据表格; 将表格的首地址送入BX中; 假定要求“11”的十六进制数的ASCII值,将11送入寄存器AL中; 执行指令 XLAT; 执行:ALBX+11(DS) 执行结束:AL= 42H。 AL中的内容被“换码”!,查表示意图,3.3.1.3 地址传送指令,地址传送指令传送的是操作数的地址,而不是操作数本身。 地址传送指令共有六种: LEA 有效地址送寄存器指令 LDS 指针送寄存器和DS指令 LES 指针送寄存器和ES指令 LFS 指针送寄存器和FS指令 LGS 指针送寄存器和GS指令 LSS 指针送寄存器和SS指令,1、LEA 有效地址送寄存器指

27、令,格式:LEAREG,SRC 执行的操作: (REG) SRC 功能: 把源操作数的有效地址送给指定的寄存器。 说明: 源操作数必须是存储器操作数。 例:设BX=0400H,SI=003CH LEA BP,2050h;执行后 BP=2050H LEA BP,SI;执行后 BP=003CH LEA BX,BX+SI;执行后 BX=043CH LEA BX,BX+SI+0F62H;执行后 BX=139EH,常用的寄存器是BX、BP、SI、DI。一般不使用其他寄存器,常用的是变量名,如:LEA BX,WORD_VAR。所以,本条指令常被描述为“取变量的偏移地址”,属常用指令。,2、LDS指针送寄存

28、器和DS指令,格式:LDSREG,SRC 执行的操作: (REG) (SRC) (DS) (SRC+2) 功能:把源操作数中的FAR型指针拷贝到DS指令中指定的通用寄存器 说明:源操作数必须是存储器操作数,目标寄存器应是一个16位或32位通用寄存器。LDS指令可用于为处理不在当前数据段的数据做准备,例如字符串指令的源操作数。该指令常指定SI寄存器。,例:设DS=400H,BX=100H,SI=200H, 04300=2050H,04302H=0500H,则 LDS SI,BX+SI执行后DS=0500H,SI=2050H,50H,20H,00H,05H,04000H,0100H,0200H,+

29、,04300H,DS*16,BX SI,04300H,SI,DS,3、LES 指针送寄存器和ES指令,格式:LESREG,SRC 执行的操作: (REG) (SRC) (ES) (SRC+2) 功能: 把源操作数中的FAR型指针拷贝到ES和指令中指定的通用寄存器。 说明 LES指令可用于为处理不在当前附加数据段的数据做准备,例如字符串指令的目标操作数。 LES,LFS,LGS,LSS等指令格式与LDS相同,仅指定的段寄存器不同。,3.3.1.4 标志寄存器传送指令,1、LAHF 标志送AH指令 格式:LAHF 执行的操作: (AH) (PSW的低字节) 功能:标志寄存器低8位(FLAGS7FL

30、AGS0) 内容送AH寄存器。不影响标志位 2、SAHF AH送标志寄存器指令 格式:SAHF 功能:AH寄存器内容送标志寄存器低8位(FLAGS7FLAGS0) 标志:影响FLAGS中的低8位标志。,3、PUSHF 标志进栈指令 格式:PUSHF 功能: 先使堆栈指针寄存器SP减2,然后压入(拷贝)标志寄存器FLAGS的内容到栈顶单元。不影响标志位。 2POPF 标志出栈指令 格式:POPF 功能: 先把堆栈指针所指向的字弹出(拷贝)到FLAGS,然后使堆栈指针寄存器SP加2。 标志:影响FLAGS中的所有标志。,3.3.1.5 类型转换指令,1、CBW 字节转换为字指令,格式:CBW 执行

31、的操作:AL的内容符号扩展到AH 功能:把AL寄存器中的符号位值扩展到AH中 例. MOV AL,5 CBW ;(AH) 0,AL值不变 MOV AL,80H CBW ;(AH) 0FFH,AL值不变,2、CWD字转换为双字指令,格式:CWD 执行的操作:AX的内容符号开展到DX。 功能:把AX寄存器中的符号位值扩展到DX中 例. MOV AX,5 CWD;(DX:AX)00000005H MOV AX,9098H CWD;(DX:AX)0FFFF9098H,格式:CDQ 执行的操作:EAX的内容符号开展到EDX,形成EDX:EAX中的4字。,3、CDQ 双字转换为4字指令,4、BSWAP 字

32、节交换指令,格式:BSWAP r32 执行的操作:使指令指定的32位寄存器的字节依次变反。即:1、4字节交换,2、3字节交换。,注意,符号扩展涉及的对象是AL和AH以及AX和DX,与其他寄存器无关。 用来为有符号数除法准备被除数(16位被除数和32位被除数)。 为无符号数除法准备被除数 例如,ALBL,由于CPU使用AX作被除数,故必须将AL中的被除数扩展到AX中。如果做有符号数除法,应使用符号扩展指令CBW;如果做无符号数除法,应使AH为0(xor ah,ah或and ah,0/mov ah,0等)。 做AXBX,应使用同样的方法处理被除数,即将符号扩展到DX,或使DX中为0。,3.3.2

33、算术指令,参与运算的操作数及计算结果:8位、16位、32位无符号或带符号二进制数(在书写指令时可以用十进制形式表示)。 带符号数在机器中用补码形式表示,最高位为符号位,0表示正数,1表示负数。 双操作数指令的两个操作数中除源操作数为立即数外,必须有一个操作数在寄存器中 单操作数不允许使用立即数方式,3.3.2.1 加法指令,1、ADD 加法指令 格式:ADD DST,SRC 功能:(DST)(SRC) (DST) 说明:对操作数的限定同MOV指令。 标志:影响OF、SF、ZF、AF、PF、CF标志 例. ADD AL,BL ADD CL,6 ADD WORD PTRBX,56 ADD EDX,

34、EAX,2、ADC 带进位加法指令 格式: ADC DST,SRC 功能:(DST)(SRC)CFDST 说明:对操作数的限定同MOV指令,该指令适用于多字节或多字的加法运算。 标志:影响OF、SF、ZF、AF、PF、CF标志 例: ADC AX,35 则(AX) (AX)35CF,3、 INC 加1指令 格式:INC DST 功能:(DST)1DST 说明:使用本指令可以很方便地实现地址指针或循环次数的加1修改。 标志:除不影响CF标志外,影响其它五个算术运算特征标志。 例: INC BX,4、 XADD 交换并相加指令,格式:XADD DST,SRC 功能:(DST) (SRC) TEMP

35、 (DST) (SRC) TEMP (DST) 说明:用于486及后继机型,它把目的操作数装入源,并把源和目的操作数之和送入目的操作数。 标志:对标志位的影响与ADD同。,总结:,加法指令对标志的影响:ADD和ADC指令对所有的6个状态标志都有影响,INC指令不影响CF,影响其他五个标志。学习加减法指令要会设置标志、使用标志。 对于两个二进制数进行加法运算,如果把数解释为无符号数,其结果可能是溢出的,而如果把数解释为带符号数,其结果可能是不溢出的,反之也一样。其判定条件是: 无符号数相加结果若使CF置1,则表示溢出;带符号数相加结果若使OF置1,则表示溢出。一旦发生溢出,结果就不正确了。下表以

36、8位数为例说明了这种情况。,CF,CF,带符号数和无符号数不溢出,c. 带符号数 溢出,对二进制数加法结果的解释,CF,CF,对于情况b: 最高位向前有进位,该进位记录在CF中,7加251应该等于258,但在有效的8位结果中,只看到2,这是因为丢掉了28256,所以对于无符号数来讲,通过判断CF1,便知该结果是错的。 对于情况c: 因为两同号数相加,和的符号却与加数符号相反.所以对于带符号数来讲,该结果是错的,发生这种情况后系统会置OF1,所以可通过OF来判断。,3.3.2.2 减法指令,1、减法指令 SUB 格式:SUB DST,SRC 功能:(DST)(SRC)DST 说明:除是实现减法功

37、能外,其它要求同ADD。 标志:影响OF、SF、ZF、AF、PF、CF标志。 例: SUB AX,35 SUB CL,6 SUB WORD PTRBX,56 SUB EDX,EAX,2、带借位减法指令 SBB 格式:SBB DST,SRC 功能:(DST)(SRC)CFDST 说明:除了操作为减外,其它要求同ADC,该指令适用于多字节或多字的减法运算。 标志:影响OF、SF、ZF、AF、PF、CF标志 例: SBB AX,35 则(AX) (AX)35CF,3减1指令 DEC 格式:DEC DST 功能:(DST)1DST 说明:使用本指令可以很方便地实现地址指针或循环次数的减1修改。 标志:

38、除不影响CF标志外,影响其它五个算术运算特征标志。 例: DEC BX,格式:NEG DST 功能:对目标操作数(含符号位)求反加1,并且把结果送回目标。即:实现0(DST)DST 说明:利用NEG指令可实现求一个数的相反数。 标志:影响OF、SF、ZF、AF、PF、CF标志。其中 对CF和OF的影响如下: a.对操作数所能表示的最小负数(例若操作数是8 位则为128)求补,原操作数不变,但OF被置1 b.当操作数为0时,清0 CF。 c.对非0操作数求补后,置1 CF。,4、求补指令 NEG,4比较指令 CMP 格式:CMP DST,SRC 功能:(DST)(SRC),影响标志位。 说明:

39、这条指令执行相减操作后只根据结果设置标志位,并不改变两个操作数的原值,其它要求同SUB。CMP指令常用于比较两个数的大小。 标志:影响OF、SF、ZF、AF、PF、CF标志 例: CMP AX,BX,5.比较并交换指令 CMPXCHG,格式:CMPXCHG DST,SRC 功能:累加器AC与DST相比较,如 (AC)=(DST) 则1 ZF, (SRC) (DST) 否则0 ZF, (DST) (AC) 累加器可以是AL,AX或EAX,用于486及后继机型。 标志:对标志位的影响与CMP指令同,格式:CMPXCHG8B DST,SRC 功能:EDX,EAX与DST相比较,如 (EDX,EAX)

40、=(DST) 则1 ZF, (ECX,EBX) (DST) 否则0 ZF, (DST) (EDX,EAX) 用于Pentium及其后继机型。 标志:只影响ZF位,6.比较并交换8字节指令 CMPXCHG8B,例. 试编写两个三字节长的二进制数加法程序,加数FIRST、SECOND及和SUM的分配情况如图所示。,11H 22H 33H 44H 55H 66H ,FIRST,SECOND,SUM,内存低端,112233H 445566H ,三字节长加法程序示意图,分析:为便于理解和方便讨论,设(FIRST)112233H,(SECOND) 445566H,存放顺序如图3-17所示。算法类似于手工计

41、算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过三字节,即最高位不会有进位产生。为了最大限度地用到我们所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。因为是三字节数据,所以不能用字或双字加法指令实现。,LEA DI,SUM;建立和的地址指针DI ADD DI,2;DI指向和的低字节 MOV BX,2 MOV AL,FIRSTBX;取FIRST的低字节(本例为33H) ADD AL,SECOND2;两个低字节相加,和在AL中,进位反映在CF中 MOV DI,AL;把低字节和存到DI指向的单元(本例为SUM2单元) DEC DI ;修改和指针

42、,使其指向中字节 DEC BX ;修改加数指针,使其指向中字节,MOV AL,FIRSTBX;取FIRST的中字节(本例为22H) ADC AL,SECOND1;两个中字节相加且加CF,和在AL中,进位反映在CF中 MOV DI,AL;把中字节和存到DI指向的单元(本例为SUM1单元) DEC DI ;修改和指针,使其指向高字节 DEC BX ;修改加数指针,使其指向高字节 MOV AL,FIRSTBX;取FIRST的高字节(本例为11H) ADC AL,SECOND ;两个高字节相加且加CF,和在AL中,进位反映在CF中 MOV DI,AL;把高字节和存到DI指向的单元(本例为SUM单元),

43、说明:程序中用到的形如SECOND2的寻址方式是直接寻址方式,SECOND2单元中存放66H。程序中的注释以分号开始。 讨论: 两个ADC指令能否换为ADD?答案是否定的。因为在对高字节计算时要考虑到低字节的进位,这个进位在执行上一条加法指令时已反映在CF中。 DEC DI和SUB DI,1指令的功能从表面上看是等价的,是否可以互换?在本程序中答案是否定的。因为上一条加法指令对CF的影响后边要用到,所以不能破坏CF值,使用DEC指令正好不影响CF。但是可以用以下指令序列代替本程序中的DEC DI,以保证得到正确的CF值。,PUSHF ;保存包括CF的FLAGS值 SUB DI,1 ;修改DI

44、POPF ;恢复原FLAGS值 多字节或多字加减时,CF始终有意义(前边的反映进借位,最后一次反映溢出情况),而OF只有最后一次的才有意义。 溢出情况判断:若是两个无符号数相加,则当最后一次的CF被置1时,表示溢出,结果不正确;若是两个带符号数相加,则当最后一次的OF被置1时,表示溢出,结果不正确。 从该例可以看出,选取合适的算法、恰当的指令、灵活的寻址方式对汇编语言程序设计人员十分重要,它可以达到事半功倍的效果。,3.3.2.3 乘法指令,1、 MUL 无符号乘法指令 格式:MUL SRC 执行的操作: 字节操作数:(AX) (AL)*(SRC) 字操作数: (DX,AX) (AX)*(SR

45、C) 功能:实现两个无符号二进制数乘。,说明:指令的被乘数是隐含的,指令指定的是乘数,这个乘数只能是寄存器(reg)或存储器操作数(m) 。如乘数类型为字节,则被乘数为AL,16位乘积用AX;如乘数类型为字,则被乘数为AX,32位乘积用DX,AX。可以实现8位、16位、32位无符号数乘。 标志: 影响CF、OF、SF、ZF、AF、PF,而只有CF、OF有意义,其它标志不确定。对CF和OF的影响是:若乘积的高半部分(例字节型乘法结果的AH)为0则对CF和OF清0,否则置CF和OF为1。,例: MOV AL,8 MUL BL ;(AL)(BL),结果在AX中 MOV AX,1234H MUL WO

46、RD PTR BX ;(AX)(BX),结果在 DX:AX中 MOV AL,80H SUB AH,AH ;清0 AH MUL BX ;(AX)(BX),结果在DX:AX中,2 IMUL 带符号乘法指令,格式:IMUL SRC 执行的操作: 字节操作数:(AL)(SRC)(AX) 字操作数: (AX)(SRC)(DX,AX) 功能:实现两个带符号二进制数乘。 说明: 这种格式的指令除了是实现两个带符号数相乘且结果为带符号数外,其它与MUL指令相同。所有的80X86 CPU都支持这种格式。相同的二进制数,看作无符号数相乘与看作有符号数相乘,结果是不同的。,标志:影响CF、OF、SF、ZF、AF、P

47、F,而只有CF、OF有意义,其它标志不确定。对CF和OF的影响是:若乘积的高半部分为低半部分的符号扩展,则对CF和OF清0,否则置CF和OF为1。 例. MOV AL,8 IMUL BL;(AL)(BL),结果在AX中 MOV AX,1234H IMUL WORD PTR BX;(AX)(BX)送DX:AX,3.3.2.4 除法指令,1、DIV 无符号数除法指令 格式:DIV SRC 执行的操作: 功能:实现两个无符号二进制数除法。指令对状态标志无定义,说明: 该指令只含一个源操作数,该操作数作为除数使用,注意它不能是立即数。被除数必须事前放在隐含的寄存器中。可以实现8位、16位、32位无符号

48、数除。 实现1000512的无符号数除法。 MOV AX,1000 SUB DX,DX ; 清0 DX MOV BX,512 DIV BX ;(DX:AX)(BX)、商在AX中、余数在DX中,2 IDIV 带符号除法指令,格式:IDIV SRC 具体操作: 功能:实现两个带符号二进制数除。,说明: 除了是实现两个带符号数相除且商和余数均为带符号数、余数符号与被除数相同外,其它与DIV指令相同。 例:实现1000(512)的带符号数除法。 MOV AX,1000 CWD ; AX的符号扩展到DX MOV BX,512 IDIV BX ;(DX:AX)(BX)、商在AX中、余数在DX中,3.3.2

49、.5 十进制调整指令,压缩的BCD码:一个字节存放两位BCD码,如“0110 1001”(69H),如看成压缩的BCD码,即为十进制数 69。一个字节的压缩BCD码可表示的数:0099。 非压缩的BCD码:一个字节存放一位BCD码,该字节低4位为合法的BCD码,高4位未定义。如“0110 1001”,看成压缩的BCD码,是69;看成非压缩的BCD码,是9。 另外: 高4位通常用0表示。(0000 1001); 09的ASCII码也可看成非压缩的BCD码。 0011 0000,0011 00010011 1001,压缩的BCD码调整指令,1、DAA 加法的十进制调整指令 格式:DAA 功能:跟在

50、二进制加法指令之后,把AL中的结果(高4位和低4位)调整成压缩BCD码并送回AL。 如果做BCD码加法运算,ADD、ADC指令后应紧跟DAA指令,以保证结果正确。调整对象只能是AL寄存器(BCD码运算只能使用以AL寄存器为目的操作数的8位数运算指令)。 标志: AF、CF按以上情况设置,SF、ZF、PF按结果设置,OF位不确定,格式:DAS 功能:跟在二进制减法指令之后,把AL中的结果(高4位和低4位)调整成压缩BCD码并送回AL。 如果做BCD码减法运算,SUB、SBB指令后应紧跟DAA指令,以保证结果正确。调整对象只能是AL寄存器(BCD码运算只能使用以AL寄存器为目的操作数的8位数运算指

51、令)。 标志: AF、CF按以上情况设置,SF、ZF、PF按结果设置,OF位不确定。,2、DAS 减法的十进制调整指令,非压缩的BCD码调整指令 1、AAA 加法的ASCII调整指令 格式:AAA 功能: 跟在二进制加法指令之后,调整AL中的结果成为非压缩BCD码并送回AL。 说明: 正像指令名称所示,参与二进制加法指令的两个操作数必须是ASCII码或非压缩BCD码。AAA指令必须在ADD或ADC指令之后;二进制加法的和必须在AL寄存器中;调整的非压缩BCD码结果在AL中。,调整操作(系统自动执行):,( AL低4位 9)且AF=0,不需要调整,将AL高4位清零,置CF=AF=0,结束指令。

52、如(0AH AL低4位)或 AF=1,则AL+6(调整),AH+1(将进位记到高位),将AL高4位清0,置CF=AF=1,结束指令。,IF(AL AND 0FH)9)OR(AF1) THEN AL(AL6)AND 0FH; /*加6并调整成非压缩BCD码*/ AH(AH)1; AF1; CF1; ELSE AF0; CF0; AL(AL)AND 0FH; /*调整成非压缩BCD码*/ FI;,标志:AF、CF按以上情况设置,其它标志位不确定。 例: 实现7+9的功能,7和9可以是非压缩BCD码或ASCII码的形式, 本例用ASCII码形式 表示。 MOV AL,7 ADD AL,9 AAA 调

53、整后AL中的06H 是和的本位值,且 已是非压缩BCD码 的形式,2、AAS减法的ASCII调整指令,格式:AAS 功能: 跟在二进制减法指令之后,调整AL中的二进制结果成为非压缩BCD码并送回AL。 说明: 参与二进制减法指令的两个操作数必须是ASCII码或非压缩BCD码,AAS指令必须在SUB或SBB指令之后,二进制减法的差必须在 AL寄存器中,调整的非压缩BCD码结果在AL中。 标志:AF、CF按结果设置,其它标志位不确定,调整操作(系统自动执行):,IF(AL AND 0FH)9)OR(AF1) THENAL(AL6)AND 0FH; /*减6并调整成非压缩BCD码*/ AH(AH)

54、1; AF1; CF1; ELSECF0; AF0; AL(AL)AND 0FH;/*调整成非压缩BCD码*/ FI;, ( AL低4位 9)且AF=0,不需要调整,将AL高4位清零,置CF=AF=0,结束指令。 如果AF=1,则AL 6,AH 1,AL高4位清 0,置AF=CF=1。,例:实现79的功能,7和9可以是非压缩BCD 码或ASCII码的形式,本例用非压缩BCD码形式表示。 MOV AL,07H SUB AL,09H AAS ;调整后(AL) 08H,借位反映在CF中 显然,08H是差的本位值,且已是非压缩BCD码的形式,请读者按调整操作验证结果的正确性。,3、AAM乘法的ASCI

55、I调整指令,格式:AAM 执行的操作: AH(AL)0AH ;(AL)10的商送AH AL(AL) MOD 0AH ;(AL)10的余数送AL 功能:跟在二进制乘法指令MUL之后,对AL中的结果进行调整,调整后的非压缩BCD码在AX中。 说明:1、只能是字节相乘; 2、参与MUL指令的两个操作数必须是非压缩BCD码,即高4必须为0位。 3、AAM指令必须在MUL之后,AX中的二进制乘积(最大为9*9=81)的有效部分在AL中,调整的非压缩BCD码结果在AX中,标志:SF、ZF、PF按结果设置,其它位不确定。 例:实现93的功能,9和3必须用非压缩BCD码表示。 MOV AL,09H MOV B

56、L,03H MUL BL ;(AL)00011011B AAM ;(AX)0000001000000111B0207H ;为正确的非压缩BCD码结果,4、AAD除法的ASCII调整指令,格式:AAD 执行的操作:AL(AH) 0AH (AL) AH0 可以看出,实际上是进行了一次十进制数到二进制数的转换。 功能: AAD指令在二进制除法指令DIV之前,对AX中的非压缩BCD码进行调整,以便执行DIV指令之后,得到非压缩BCD码形式的商在AL中,余数在AH中。,其他调整指令先运算,后调整,说明: 调整前AH中为非压缩BCD码的十位上的数,AL中为个位数。 标志: SF、ZF、PF按结果设置,其它

57、位不确定。 注意: 只有AAD指令是在相应的二进制算术运算指令之前。,例.实现53的功能,5和3必须用非压缩BCD码表示。 MOV AH,0 MOV AL,05H MOV BL,03H AAD ;调整后(AL)00000101B,(AH)0 DIV BL;(AL)00000001B,(AH)00000010B 与手算方法类似,若是多位数除以一位数, AL中就是本位商,AH中的余数可以被调整作为下 一轮被除数的一部分。,3.3.3 逻辑指令,3.3.3.1 逻辑运算指令 逻辑指令提供了对二进制位的控制。该系统提供的逻辑指令包括逻辑运算指令、位测试指令、位扫描指令、基本移位指令、循环移位指令和双精

58、度移位指令。 逻辑运算指令见下表。这些指令的操作数可以是8位、16位、32位,其寻址方式与MOV指令的限制相同。逻辑与和逻辑测试的区别在于后者执行后只影响标志位而不改变任何操作数本身。,将操作数求反,将操作数的指定位清零,不保留运算结果,即不改变操作数,只是测试操作数的指定位,将操作数的指定位置1,将操作数的指定求反,逻辑运算指令用途: 逻辑非指令可用于把操作数的每一位均变反的场合。 逻辑与指令用于把某位清0(与0相与,也可称为屏蔽某位)、某位保持不变(与1相与)的场合。 逻辑测试指令可用于只测试其值而不改变操作数的场合。 逻辑或指令用于把某位置1(与1相或)、某位保持不变(与0相或)的场合。

59、 逻辑异或指令用于把某位变反(与1相异或)、某位保持不变(与0相异或)的场合。,例:对AL中的值按位求反。 MOV AL,00001111B NOT AL ;(AL) 11110000B 例:设从键盘接收的一个十进制数的ASCII码在AL中,要求把它转换成非压缩BCD码的形式。 AND AL,0FH ;清0高4位,低4位不变 例:把AL中的非压缩BCD码转换成十进制数的ASCII码形式。 OR AL,30H;AL中的高4位变成0011B,低4位不变 例:清0 AX寄存器。 XOR AX,AX,例: 使61H端口的D1位变反。 IN AL,61H XOR AL,2 OUT 61H,AL 例: 设某并行打印机的状态端口是379H,其D7位是忙闲位,若D70表示忙,为1表示闲,测试该打印机当前状态,若为忙继续测试,否则顺序执行下一条指令。 MOV DX,379H WT:IN AL,DX TEST AL,80H JZ

温馨提示

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

评论

0/150

提交评论