




已阅读5页,还剩225页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术,主要内容:,指令系统的一般概念 操作数的寻址方式 六大类指令的操作原理 操作码的含义 指令对操作数的要求 指令执行的结果,3.1 概述,指令 控制计算机完成指定操作的命令 机器指令指令的二进制代码形式。例如:cd21h 汇编指令助记符形式的指令。例如:int 21h 指令系统cpu所有指令及其使用规则的集合,8088/8086指令系统: (1)指令向后兼容(x86系列) (2)应用广泛,资料易于寻找,指令按功能分为六大类(92种),参见 附录1 8086/8088 指令系统 p458,(1)数据传送类; (2)算术运算类; (3)逻辑运算和移位; (4)串操作; (5)控制转移类; (6)处理器控制。,3.1.1 指令的基本构成,操作码,操作数,,操作数,说明要执行的是什么操作,操作对象,可以有0个、1个或2个,目的,源,标号:,指令举例:,add ax,si+6,mov ax , bx,操作码 操作数,inc bx,hlt,部分8088/8086常用指令,8088/8086的操作数分为4类,1、立即数(常数)源操作数就是参加操作的数据本身,它们可以是8位或16位。取值范围如下表:,立即数只能用作源操作数,如,mov ax,0fa00h ;正确 mov 8000h,dx ;错误,操作数,数据(立即数),地址: 寄存器(名称)、存储器单元(地址) i/o接口的端口(地址),2、寄存器操作数,放在8个通用寄存器或4个段寄存器中的操作数,表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。,只能存放字操作数,段寄存器存放当前操作数的段基地址,可作为源或目的操作数(但cs不作为目的操作数), 不允许将立即数传送到段寄存器, 可通过某个通用寄存器传递改变,si,di,bp,sp,cs,ds,es,ss,3、存储器操作数,存储器操作数,字节 字 双字,1 2 4,类型,存储单元个数,一般不允许两个操作数同时为存储器操作数,flags 标志寄存器: 仅有个别指令可用它作为操作数 ip 不能用指令指针寄存器: 它作为操作数, 顺序执行时它自动加1,跳转执行时自动会跳转,表示当前参加运算的数存放在存储器的某1/2/4个单元中,存储单元的物理地址 = 段基地址16 + 偏移地址,若指令中没有指明所涉及的段寄存器,cpu就采用默认的段寄存器来确定操作数所在的段。,表3.3 段寄存器使用的一些基本约定,8086规定了访问存储器段的规则: 此规则定义了段地址寄存器和偏移地址寄存器的组合方式,其默认规则如下表:,存储器操作数的偏移地址(也称有效地址ea)要用“ea”方括号括起来, 它可以通过不同的寻址方式由指令给出; 存储器操作数的段基地址(也称段头地址)一般省去,按隐含规则确定它们,也可直接给出进行段超越。 例如 若(bx)=2000h, (si)=0a00h, (di)=2a00h, 则以下指令的结果是一样的: mov al, 2a00h ;隐含段头为ds,直接寻址 mov al, bx+0a00h ;隐含段头为ds ,寄存器相对寻址 mov al, bxsi ;隐含段头为ds,基址-变址寻址 mov al, di ;隐含段头为ds,寄存器间接寻址 但 mov al, es:2a00h ; 段超越,段头为es,与前4条不同,存储单元的物理地址 = 段基地址16 + 偏移地址,注意:存储器数据表示形式: ,地址值或寄存器,、i/o接口操作数,i/o接口操作数,字节 字,1 2,类型,存储单元个数,一般不允许两个操作数同时为i/o接口操作数,i/o接口地址为16位,一般采用dx寄存器间接寻址给出;有时i/o接口地址仅用8位,这时可采用直接寻址。,例如:in al,dx; 括号习惯都省去写为 in al,dx out 80h,al;括号习惯都省去写为 out 80h,al,注意:不要理解为:mov al, dx 和mov 80h,al ,它们完全不同。,表示当前参加运算的数存放在i/o接口的某1/2个端口中,一条指令的执行时间=,3.1.2 指令的执行时间,取指令 取操作数 执行指令 传送结果,单位用时钟周期数t表示,常用指令执行时间 p458 计算偏移地址ea所需时间,结论: 1)尽量使用寄存器作为操作数 2)若有可能,用移位代替乘除法 3)尽量使用简单的寻址方式,执行,寻址方式寻找操作数的方法 寻找操作数的地址(一般指源操作数) 寻找要执行的下一条指令的地址 在8086指令系统中,操作数所在地址的寻址方式可分为8种: 立即寻址 寄存器相对寻址 直接寻址 基址-变址寻址 寄存器寻址 相对的基址-变址寻址 寄存器间接寻址 隐含寻址,3.2 8086的寻址方式,操作数(为一常数)直接由指令给出 (此操作数称为立即数) 立即寻址只能用于源操作数 例: mov ax, 1c8fh mov byte ptr2a00h, 8fh 错误例: mov 2a00h, ax ; 错误!,3.1.2 立即寻址,立即数,操作码,低8位,高8位,存储器,mov操作码,02h,31h,ah,al,代码段,代码段,立即寻址指令在存储器中的存放形式,ax,指令操作例:mov ax,3102h ; ax 3102h 执行后,(ah) = 31h,(al) = 02h,用途:直接给出操作数据,立即数存放在内存的代码段中,3.2.3 寄存器寻址,操作数放在某个寄存器中 源操作数与目的操作数字长要相同 寄存器寻址与段地址无关 例: mov ax, bx mov 3f00h, ax mov cl, al 错误例: mov ax, bl ; 字长不同 mov es: ax, dx ; 寄存器与段无关,ax,si,2233h,2233h,指令操作例:mov si,ax ; si (ax) 指令执行前:(ax)=2233h 指令执行后:(ax)=2233h,(si)=2233h,用途:操作数存放在寄存器中,根据寄存器名称寻找寄存器里面的数据。,3.2.2 直接寻址,指令中直接给出存储器操作数的16位偏移地址 或i/o接口仅8位端口地址 存储器偏移地址也称为有效地址(ea, effective address) 存储器默认的段寄存器为ds, 但也可以显式地指定其他段寄存器称为段超越前缀 存储器偏移地址也可用符号地址来表示,如addr、var 例: mov ax , 2a00h; 段头隐含为ds mov dx , es: 2a00h;段超越 mov si , table_ptr; 段头隐含为ds 还有: in al,90h;括号可以省去 out 85h,al;括号可以省去,例:mov ax,3102h ;al (3102h) , ah (3103h),如果(ds)=2000h, (23102h) = cdh, (23103h) = abh 则操作数的物理地址为: 20000h+3102h = 23102h 指令执行后:(ax) = abcdh,mov操作码,02h,31h,ah,al,23102h,cdh,abh,存储器,代码段,数据段,. .,23103h,用途:用于操作数存放在存储器单元中 或i/o接口地址仅为8位的的端口中,3.2.4 寄存器间接寻址,操作数的偏移地址(有效地址ea)放在寄存器中 只有si、di、bx和bp可作间址寄存器 例: mov ax, bx mov cl, cs:di in al, dx;括号可省去 out dx,al;括号可省去 错误例 : mov ax, dx mov cl, ax,ea =,(bx) (bp) (si) (di),指令操作例:mov ax,si 若 (ds)=6000h, (si)=1200h, (61200h)=44h, (61201h)=33h 则指令执行后,(ax)=3344h。,用途:操作数存放在存储器或i/o接口地址为16位的的寻址,3.2.5 寄存器相对寻址,ea=间址寄存器的内容 + 8/16位的位移量,寄存器相对寻址常用于存取表格或一维数组中的元素把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之),ea =,(bx) (bp) (si) (di),+,8位 16位,位移量,例: mov ax, bx+8 mov cx, tablesi mov ax, bp+1000h ; 默认段寄存器为ss 指令操作例:mov ax,databx 若(ds)=6000h, (bx)=1000h, data=2a00h, (63a00h)=66h, (63a01h)=55h 则物理地址 = 60000h + 1000h + 2a00h = 63a00h 指令执行后:(ax)=5566h (见下页图示),操作码,00 偏移量低,2a 偏移量高,ds 60000,bx 1000,+ data 2a00,63a00,63a00h,ah,al,ax,代码段,数据段,. . .,. . .,. . .,66h,55h,mov ax,databx,用途:操作数存放在存储器地址指定的单元中,3.2.6 基址-变址寻址,若操作数的偏移地址: 由基址寄存器(bx或bp)给出 基址寻址方式 由变址寄存器(si或di)给出 变址寻址方式,由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。,ea =,(bx) (bp),+,(si) (di),同一组内的寄存器不能同时出现。,基址寄存器,变址寄存器,例: mov ax, bx si mov ax, bx+si mov ax, ds: bp di 错误例: mov ax, bx bp mov ax, di si,用途:操作数存放在存储器地址指定的单元中,83000,操作码,ds 80000,bx 2000,+ si 1000,83000h,ah,al,ax,代码段,数据段,. . .,. . .,. . .,yy,xx,指令操作例:mov ax,bxsi 假定:(ds)=8000h, (bx)=2000h, si=1000h 则物理地址 = 80000h + 2000h + 1000h = 83000h 指令执行后: (al)=83000h (ah)=83001h,3.2.7 相对的基址-变址寻址,在基址-变址寻址的基础上再加上一个相对位移量 注意事项同基址-变址寻址,ea =,(bx) (bp),+,(si) (di),+,8位 16位,位移量,例:,mov ax,base si bx mov ax,bx+base si mov ax,bx+si+base mov ax,bx base si mov ax,bx+si base,基址,变址,用途:操作数存放在存储器地址指定的单元中,指令操作例:mov ax,datadibx 若(ds)=8000h, (bx)=2000h, (di)=1000h, data=200h 则指令执行后(ah)=83021h, (al)=83020h,83200,83200h,ah,al,ax,+ data 0200,操作码,代码段,数据段,. . .,. . .,. . .,yy,xx,ds 80000,bx 2000,di 1000,使用相对的基址-变址寻址方式可以很方便地访问二维数组。,基址寄存器,数组首地址,变址寄存器,数组元素行址,位移量,数组元素列址,(偏移地址),二维数组例:内存图示(按行存储),(行位移地址),(行内元素下标),这种寻址方式为386以上处理器采用: 将第二个寄存器与比例因子相乘,比例因子可以是1、2、4、8。分别对应字节、字、双字、四字数组。 例如: mov eax+2*edi+100h,cx mov al,ebp+2*edi-2 mov eax,array4*ecx,3.2.8 比例变址寻址,3.2.9 隐含寻址,指令操作数是隐含的,在指令中未显式地指明。 例:mul bl 指令隐含了被乘数al及乘积ax 类似的指令还有:xlat、div、cbw、movs等,(al)(bl)ax,用途:操作数存放在寄存器或存储器地址指定的单 元中,如何寻找指令的地址呢?,(1)程序中将要执行的指令的地址由cs:ip指向; (2)程序的第一条指令的地址(首地址)由操作系统os分配产生; (3)一般程序是一条接着一条的顺序执行的,所以cs:ip自动加1即可实现。 (4)当程序跳转执行时,cs:ip采用直接方式或间接方式改为跳转到的指令地址。,3.3 程序转移地址寻址方式,第四章 80x86的寻址方式和指令系统,段内转移只需改变 (ip) 段内转移包括两种寻址方式:直接 ,间接。 段间转移改变(cs)(ip) 段间转移包括两种寻址方式: 直接 ,间接。 功能: 用来确定转移指令及call指令的转移地址。 以转移指令为对象来分析各种转移地址寻址方式。,(一)段内直接寻址(intrasegment direct addressing) (二)段内间接寻址(intrasegment indirect addressing) (三)段间直接寻址(intersegment direct addressing) (四)段间间接寻址(intersegment inderect addressing),(一)段内直接寻址(intrasegment direct addressing),转向有效地址ea是(ip)当前 和指令中指定的8位或16位位移量之和。 对于近转,16位位移量可正可负,范围是3276832767 对于短转,8位位移量可正可负,范围是 128127, 这种寻址方式适用于条件转移及无条转移指令。 当用于条件转移指令时,位移量只允许 8 位; 用于无条件转移指令时,位移量 8 位时称为 短跳转。,指令汇编语言格式: jmp near ptr progia;(ip)(ip)当前+16位位移量 jmp short quest; (ip)(ip)当前+8位位移量 调用指令(call)也适用。 progia、 quest 均为转向符号地址,机器中用位移量表示。 汇编指令中16位位移量,则在符号地址前加操作符 near ptr。,jmp near ptr progia; (ip)(ip)当前+16位位移量,段内直接寻址 jmp near ptr progia,op,00h,12h,.,.,op,03h,progia=3172ah,(ip),当前,=,3052ah,16位的位移量,3172ah-3052ah,存储器,跳转,(二)段内间接寻址(intrasegment indirect addressing) 段内间接寻址: 转向有效地址是一个寄存器或一个存储单元的内容, 这内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得。得到的转向有效地址用来取代ip寄存器的内容。 这种寻址方式和以下二种段间寻址方式都不能用于条件转移指令。 * 条件转移指令只能适用段内直接寻址的8位位移量。,汇编格式: jmp bx jmp word ptr bp + table 其中: word ptr操作符, (bp)+table 寻址所得地址,是一个字的有效地址, 由有效地址形成物理地址里的内容即为转向有效地址ip。 转向物理地址的计算公式:pa=16d(cs)+(ip),段内间接寻址方式的转移指令中转移的有效地址的计算方法: 举例: 指令执行前: 设:(ds)=2000h,(bx)=1256h,(si)=528fh, table=20a1h, (232f7h)=3280h,(264e5h)=2450h 例1、jmp bx 指令执行后: (ip)=1256h,例2、jmp word ptr tablebx 指令执行后: pa= 16d(ds)+(bx)+table = 232f7h (ip) = 3280h=(232f7h) 例3、jmp word ptr bxsi 指令执行后: pa= 16d (ds)+(bx)+(si)= 264e5h (ip) = 2450h=( 264e5h) 注意:如果指令操作数已被定义为16位的存储器,则: word ptr 可以省去。,(三)段间直接寻址:(intersegment direct addressing) 指令中直接提供了转向段地址和偏移地址。 用指令中指定的偏移地址 (ip) 用指令中指定的段地址 (cs) 完成了从一段到另一段的转移操作 指令汇编语言格式: jmp far ptr nextroutint nextroutint 转向的符号地址 far ptr 段间转移操作符 offset nextroutint (ip) seg nextroutint (cs),例:jmp far ptr ccc,op,34h,12h,00h,50h,.,.,.,.,存储器,2000:1000h,jmp far ccc,ccc:,5000:1234h,.,2000h段,5000h段,(四)段间间接寻址(intersegment inderect addressing) 用存储器中二个相继字的内容取代ip、cs以达到段间转移目的。 存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种寻址方式取得。 指令汇编语言格式: jmp dword ptr inters+bx dword ptr双字操作符,转向地址双字(段间转移) inters+bx数据寻址方式为直接变址寻址方式 * 段间转移必须是无条件转移。,例:jmp dword ptr bx 指令执行前: 设: (ds)=4000h, (bx)=1212h (41212h)=1000h (41214h) =4a00h 指令执行后: (ip)=1000h (cs)=4a00h,小结,指令由( )和( )构成,如何取得操作数称为( ),操作码,操作数,寻址方式,寻址方式可分8种,立即寻址,直接寻址 - 针对m、i/o,寄存器相对寻址 - 针对m,寄存器寻址 - 针对r,基址-变址寻址 - 针对m,基址-变址相对寻址- 针对m,寄存器间接寻址 - 针对m、i/o,隐含寻址 - 针对r、m,寄存器间接、寄存器相对、基址变址、相对基址变址4种寻址方式的比较: 寻址方式 指令操作数形式 寄存器间接 只有一个寄存器(bx/bp/si/di之一) 寄存器相对 一个寄存器加上位移量 基址变址 两个不同类别的寄存器 相对基址-变址 两个不同类别的寄存器加上位移量,为便于理解指令的形式和功能,对指令中操作 符号的约定如下: 大小写字母无区别 oprd: 泛指各类操作数; oprd1, oprd2: 多操作数指令中, oprd1为目标操 作数,oprd2为源操作数; dest, src: 目的操作数, 源操作数 reg: 8位或16位的通用寄存器; sreg: 段寄存器; acc: 累加器al或ax,3.3 8086/8088指令系统,reg8: 8位通用寄存器; reg16: 16位通用寄存器; mem: 8位或16位存储器; mem8: 8位存储器; mem16: 16位存储器; disp: 8位或16位存储器地址偏移量; imm或data: 8位或16位立即数; imm8: 8位立即数; imm16: 16位立即数; port : i/o端口地址, port端口号0255 ; : 存储单元的内容或偏移地址。,可分成如下6类: 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令,3.3.1 数据传送指令,可实现 存储器 寄存器 i/o 数据传送指令又可分为如下四种: 通用传送 目标地址传送 标志传送 输入输出,表 4-1 数据传送类指令表,1.通用传送指令 (1) mov dest,src; destsrc 传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。 具体来说可实现: mov mem/reg1,mem/reg2 指令中两操作数中至少有一个为寄存器 例: mov cl,dl mov ax,bx mov si,cx mov cl,bx+5, mov reg,data ;立即数送寄存器 mov mem,data ;立即数送存储单元 mov acc,mem ;存储单元送累加器 mov mem,acc ;累加器送存储单元 mov segreg,mem/reg ;存储单元/寄存器送 段寄存器 mov mem/reg,segreg ;段寄存器送存储单 元/寄存器,mov指令使用规则:,1) ip不能作目的寄存器 2) 不允许memmem 3) 不允许segregsegreg 4) 立即数不允许作为目的操作数 5) 不允许segreg立即数 6) 源操作数与目的操作数类型要一致,几个不能传送的解决办法:用ax作桥梁 存储器存储器: mov ax,mem1 mov mem2,ax 段寄存器段寄存器: mov ax,ds mov es,ax 段寄存器立即数: mov ax,data mov ds,ax,应用举例:将1000h开始的100个存储单元 全部填充为ascii码2ah(*)。 程序段如下(例001) mov di,1000h mov cx,64h mov al,2ah;* again:mov si,al inc si dec cx jnz again hlt,上程序段存放在代码段中,设(cs)=109eh,则各条指令存放地址如下: cs : ip 指令 109e : 0100 mov di,1000h 109e : 0103 mov cx,64h 109e : 0106 mov al,2ah 109e : 0108 mov di,al 109e : 010a inc di 109e : 010b dec cx 109e : 010c jnz 0108 109e : 010e hlt 109e : 0110,写入2ah(*)后,数据段中相应存储单元的内容改变如下: ds:1000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ds:1060 2a 2a 2a 2a,例:把内存中首地址为mem1的200个字节送到首地址为mem2的区域中,编程。(例002),mov si, offset mem1 mov di, offset mem2 mov cx, 200 next: mov al, si mov di, al inc si inc di dec cx jnz next hlt,什么是堆栈? 按“后进先出(lifo)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。 为什么要设置堆栈? 为什么要按 “后进先出”方式工作? 参见下图,(2) 堆栈操作指令,主程序,ip,继续执行,主程序,执行子程序,转子程序,压栈,弹出,返回主程序,主程序,ip,ip(下),继续执行,主程序,转子程序1,返回主程序,ip,执行子程序 2,转子程序2,返回子程序1,ip(下),执行子 程序1,继续执行,子程序1,(a),(b),子程序调用示意图,(a) 主程序调子程序; (b) 子程序嵌套示意图,压栈,弹出,ip(下),规定由ss指示堆栈段的段基址,堆栈指针sp始终指向堆栈的顶部,sp的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。,sp,ss,堆栈段,进栈方向,退栈方向,栈底,栈顶, 压栈指令 push src ; src为16位操作数 例:push ax ;将ax内容压栈 执行操作:(sp)-1高字节ah (sp)-2低字节al (sp)(sp)- 2,设(ax)=1020h,执行示意图如图所示,低地址,存储区 (ss段),执行前 (ax)=1020,(sp),存储区 (ss段),进栈方向,执行后,20,10,(al),(ah),push ax指令执行示意图,(sp)-2,(sp),高地址,低地址,高地址,(sp)-1,压栈指令的格式为: push reg push mem/reg push segreg 例如: push ax push bx push ds,注意:进栈方向是高地址向低地址发展 (向上生成)。, 弹出指令 pop dest 例:pop bx ;将栈顶内容弹至bx 执行操作:(bl)(sp) (bh)(sp)+1 (sp)(sp)+2,pop bx 的执行示意图如下图所示,低地址,存储区 (ss段),出栈方向,执行前,20,10,pop bx指令执行示意图,(sp),存储区 (ss段),执行后 (bx)=1020,(sp),(sp)+1,(sp)+2,bx,20,10,高地址,低地址,高地址,堆栈指令使用时应注意几点: 堆栈操作总是按字进行 不能从栈顶弹出一个字给cs 堆栈指针为ss:sp,sp永远指向栈顶 sp自动进行增减量(-2,+2),例子(例003),mov ax,9000h mov ss,ax mov sp,0e200h mov dx,38ffh push dx push ax pop dx pop ax,格式:xchg reg/mem,mem/reg 功能:交换两操作数的内容。 要求:两操作数中至少有一个在寄存器中; 操作数不能为段寄存器和立即数; 源和目地操作数类型要一致。 举例: xchg ax,bx xchg 2000,cl xchg 2000,cx (例004),(3)交换指令xchg,(4). 输入输出(i/o)指令,只限于用累加器al或ax来传送信息。 功能: (累加器)i/o端口 输入指令in 格式: in acc,port ;port端口号0255 in acc,dx ;dx表示的端口范围达64k 例:in al,80h ;(al)(80h端口) in al,dx ;(al)(dx),例:out 68h,ax ;(69h,68h)(ax) out dx,al ;(dx)(al) 在使用间接寻址的in/out指令时,要事先用传送指令把i/o端口号设置到dx寄存器,如: mov dx,220h in al,dx ;将220h端口内容读入al, 输出指令out 格式:out port,acc out dx,acc,(5)查表指令xlat 执行的操作:al(bx)+(al) 又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到bx中,表项序号存于al中。 例:内存数据段有一张小写字母的ascii码表,如欲查出表中第3个代码(代码序号从0开始),程序如下: (例005),mov bx,offset mem1;(bx)表首地址 mov al,3 ;(ax)序号 xlat ; 查表转换 mov dl,al mov ah,2 int 21h 执行后得到:(al)= 64h = d,注意:转换表长度最大为256个表项(字节)。,(5)字节-字转换指令,格式:cbw ;把al的符号位复制到ah 即8位带符号数al16位带符号数ax=ah al, 真值不变 cwd ;把ax的符号位复制到dx 即16位带符号数ax 32位带符号数dx ax, 真值不变 用途:用于有符号数的除法。 例如:(al) = a7h,则执行cbw后,ah的内 容为ffh。 注意: 带符号数扩展与无符号数扩展的区别,2. 地址传送指令 共有三条: 格式:lea reg,mem ; 将指定存储器的16位偏移 地址送指定寄存器(例005) lds reg, mem32; ds: reg mem开始的四 个内存单元) les reg, mem32; 同上,但ds改为es 要求源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。,设:(si)=1000h 则执行该指令后,(bx)=1010h 注意:以下两条指令差别: lea bx,buffer ; 将符号地址为buffer的存储单元的偏移地址取到 bx中; mov bx,buffer ;将buffer存储单元中的内容取到 bx中.,例:lea bx,si+10h,下面两条指令等效: lea bx,buffer mov bx, offset buffer 其中offset buffer表示存储器单元buffer的偏移地址。 二者都可用于取存储器单元的偏移地址,但lea指令可以取动态的地址,offset只能取静态的地址。,4.标志传送指令 共有四条: (1)读标志指令lahf (例006) lahf把标志寄存器低8位中的5个标志位传送到ah中的指定位,如下图所示:,of,df,if,tf,sf,zf,af,pf,cf,ah,lahf指令的功能,flag,(2)设置标志指令sahf sahf的功能与lahf的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。,of,df,if,tf,sf,zf,af,pf,cf,ah,sahf指令的功能,flag,执行的操作:(sp)-1标志寄存器高8位 (sp)-2标志寄存器低8位 (sp)(sp)-2 (4)从栈顶弹出标志寄存器指令popf 执行的操作:标志寄存器低8位(sp) 标志寄存器高8位(sp)+1 (sp)(sp)+2 pushf和popf指令用于保护和恢复标志寄存器内容。,(3)把标志寄存器推入栈顶指令pushf,例如: push ax push cx pushf ;保护标志寄存器内容 ;这段程序要用到ax,cx以及标志位 popf ;恢复标志寄存器内容 pop cx pop ax,. . .,数据传送指令中,除sahf和popf这两条指令外,其余所有指令均不影响标志位(即标志寄存器flags的6个状态标志)。,3.3.2 算术运算指令,涉及两种类型数据: 无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意: 参加的操作数必须都是无符号数或都是有符号数。 需使用不同的标志位(cf,of)来检查无符号数和有符号数的运算结果是否溢出。 这类指令一般都影响标志寄存器flags。,表4 - 2 算术运算类指令表,两个8位数相加时有4种情况:,无符号数和有符号数均不溢出 二进制相加 无符号数加 有符号数加 0000 1000 8 +8 +0001 1110 + 30 + (+30) 0010 0110 38 +38 结果38 cf=0 of=0,无符号数范围0255 带符号数范围-128127, 无符号数溢出 无符号数 有符号数 0000 1000 8 +8 +1111 1101 +253 +(-3) 10000 0101 261 +5 结果5 cf=1 of=0 有符号数溢出 0000 1000 8 +8 +0111 1101 +125 +(+125) 1000 0101 133 +133 结果-123 cf=0 of=1 (补码表示), 无符号数和有符号数均溢出 无符号数 有符号数 1000 1000 136 -120 +1111 0111 +247 +(-9) 10111 1111 383 -129 结果127 cf=1 of=1 上面四种情况说明, cf标志可用来表示无符号数的溢出, of标志可用来表示有符号数的溢出。 有符号数的溢出是一种出错状态,在运算过程中应当避免。,所有的算术运算指令,都会影响flags标志寄存器的6个状态标志cf/of/zf/sf/af/pf(3个控制标志if/df/tf不受影响)。 总的讲,有这样一些规则: 当无符号数运算产生溢出(即最高位向前有进位 或借位)时,cf=1,否则为0; 当有符号数运算产生溢出时,of=1(即of=cfcf-1) , 否则为0; 当运算结果为0时,zf=1 ,否则为0; 当运算结果为负数时,sf=1 ,否则为0; 当运算一半位置有进位或借位时,af=1 ,否则为0; 当运算结果中有偶数个时,pf=1 ,否则为0。,(1) 不带进位的加法指令add 格式: add acc,data add mem/reg,data add mem/reg1,mem/reg2 注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数 例:add al,30h add ax,bx+20h add cx,si add di,200h add指令对标志位(指6个状态标志)都有影响。,1.加法指令(共5条),(2) 带进位位的加法指令adc,adc指令在形式上和功能上都有与add类似,只是相加时还要包括进位标志cf的内容。 例如: adc al,68h ;al(al)+68h+(cf) adc ax,cx ;ax(ax)+(cx)+(cf) adc bx,di ;bx(bx)+di+1di+(cf),例:有两个4字节的无符号数相加: 2c 56 f8 ac + 30 9e 47 be = ? 设被加数、加数分别存放在buffer1及buffer2开始的两个存储区内,结果放回buffer1存储区,如下页图所示。 因cpu只能进行8位或16位的加法运算,为此可将加法分4次进行。,adc指令主要用于多字节加法运算中,56h,2ch,beh,47h,buffer1,buffer2,ach,f8h,9eh,30h,被加数,加数,数据段,多字节加法示意图,.,.,程序段如下: mov cx,4 ;置循环次数 mov si,0 ;置si初值为零 clc ;清进位标志cf ll: mov al,buffer2si adc buffer1si,al ;带进位加 inc si ;(si)+1 dec cx ;(cx)-1 jnz ll ;若(cx)0,则转ll 思考:若最高位有进位,如何改?,add/adc指令对条件标志位(cf/of/zf/sf)的影响:,cf位表示无符号数相加的溢出。 of位表示带符号数相加的溢出。,格式:inc reg/mem 功能:类似于c语言中的+操作:对指定的操作数加1 例: inc al inc si inc byte ptrbx+4 注意:本指令不影响cf标志,但对af/of/pf/sf/zf会产生影响。,3) 加1指令inc(单操作数指令),(1) 不考虑借位的减法指令sub 格式: sub dest, src 操作: dest(dest)-(src) 注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数 指令例子: sub al,60h sub bx+20h,dx sub ax,cx,2. 减法指令,sbb指令主要用于多字节的减法。 格式: sbb dest, src 操作: dest(dest)-(src)-(cf) 指令例子: sbb ax,cx sbb word ptrsi,2080h sbb si,dx,(2) 考虑借位的减法指令sbb,例:x、y、z均为32位数,分别存放在地址为x, x+2;y,y+2;z,z+2的存储单元中,用指令序列实现wx+y+24-z,结果放在w, w+2单元中。(例007) mov ax, x mov dx, x+2 add ax, y adc dx, y+2 ; x+y add ax, 24 adc dx, 0 ; x+y+24 sub ax, z sbb dx, z+2 ; x+y+24-z mov w, ax mov w+2, dx ; 结果存入w, w+2单元,作用类似于c语言中的”操作符。 格式:dec opr 操作:opr(opr)-1 指令例子: dec cl dec byte ptrdi+2 dec si,(3) 减1指令dec,注:该指令与inc一样,它不影响cf标志,但对af/of/pf/sf/zf会产生影响。,格式: neg opr 操作: opr 0-(opr) 对一个操作数取补码相当于用0减去此操作数,故利用neg指令可得到负数的绝对值。 例: 若(al)=0fch,则执行 neg al 后, (al)=04h,cf=1 本例中,0fch为-4的补码,执行求补指令后,即得到4(-4的绝对值)。,(4) 求补指令neg,sub/sbb指令对标志位(cf/of/zf/sf)的影响:,cf=1表示无符号数减法溢出。 of=1表示带符号数减法溢出。 neg指令对cf/of的影响: cf:操作数为0时,求补的结果使cf=0,否则cf=1。 of:字节运算对-128求补或字运算对-32768求补时of=1, 否则of=0。,格式: cmp dest, src 操作: dest(dest)-(src) (而 sub dest, src; dest(dest)-(src) ) cmp也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。 指令例子: cmp al,0ah cmp cx,si cmp di,bx+03,(5) 比较指令cmp,根据标志位来判断比较的结果(例008),1)根据zf判断两个数是否相等。若zf=1,则两数相等。 2)若zf=0,则两个数不相等,则分两种情况考虑: 比较的是两个无符号数 若cf=0,则destsrc; 若cf=1,则destsrc。 比较的是两个有符号数 若ofsf=0,则destsrc; 若ofsf=1,则destsrc。,比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。 举例:比较al、bl、cl中带符号数的大小,将 最小数放在al中。 程序: cmp al,bl ;al和bl比较 jng bbb ;若albl,则转 xchg al,bl ;若albl,则交换 bbb: cmp al,cl ;al和cl比较 jng ccc ;若alcl,则转 xchg al,cl ;若alcl,则交换 ccc: hlt,思考: 程序的结果? (al、bl、cl中数据的大小顺序),进行乘法时: 8位 8位 16位乘积 (即 al mem8/reg8 ax) 16位 16位 32位乘积 (即 ax mem16/reg16 dx ax) (1) 无符号数的乘法指令mul mem/reg 格式: mul src 操作:字节操作数 (ax) (al) (src) 字操作数 (dx, ax) (ax) (src) 指令例子: mul bl ;(al)(bl),乘积在ax中 mul cx ;(ax)(cx),乘积在dx,ax中 mul byte ptrbx,3. 乘法指令,格式与mul指令类似,只是要求两操作数均为有符号数。 指令例子: imul bl ;(ax)(al)(bl) imul word ptrsi ;(dx,ax)(ax)(si+1si),(2) 有符号数乘法指令imul,注意:mul/imul指令中 al(ax)为隐含的乘数寄存器; ax(dx,ax)为隐含的乘积寄存器; src不能为立即数; 除cf和of外,对其它标志位无定义。,mul/imul乘法指令对cf/of的影响:,例:(al) = a5h(-5b),(bl) = 11h(例009) (1) imul bl ; (ax) (al)(bl) ; a511 -5b11=-060b f9f5 ; (ax) = f9f5h cf=of=1 (2) mul bl ; (ax) (al)(bl) ; a511= 0af5 ; (ax) = 0af5h cf=of=1,4. 除法指令,进行除法时:16位/8位 8位商及8位余数 32位/16位 16位商及16位余数 对被除数、商及余数存放有如下规定: 被除数 商 余
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第10课 音频软件本领强教学设计小学信息技术(信息科技)五年级下册人教·陕师大版
- 黄冈市2025湖北黄冈市黄梅县招聘引进急需紧缺专业高层次人才笔试历年参考题库附带答案详解
- 2025年上半年中心静脉导管维护理论考试题及答案
- 湖南宝山有色金属矿业有限责任公司2025招聘考试历年参考题附答案详解
- 市场营销推广活动执行方案
- 关注学生心理 说课稿
- 雨山区2025安徽马鞍山市雨山区事业单位招聘工作人员12人笔试历年参考题库附带答案详解
- 第15课 有礼貌的小客人(教案) -鄂教版心理健康一年级上册
- 信息技术课程教学设计与案例分析
- 小学作文教学重难点及范文赏析
- 隧道施工应急预案方案
- 植物鉴赏课件
- 2025云南丽江市公安局警务辅助人员招聘29人考试参考题库及答案解析
- 压实度试验课件
- 硬笔书法全册教案共20课时
- 教师资格证-综合素质-学生观
- 3食品用纸包装容器等制品食品相关产品生产许可实施细则
- 故障录波器与故障波形分析PPT通用课件
- 《合理安排课余生活》(教案)综合实践活动三年级下册
- 最新北师大版100以内加减法口算和竖式计算
- 生产小批量试产表格
评论
0/150
提交评论