汇编语言程序设计-第三章_80X86的指令系统和寻址方式.ppt_第1页
汇编语言程序设计-第三章_80X86的指令系统和寻址方式.ppt_第2页
汇编语言程序设计-第三章_80X86的指令系统和寻址方式.ppt_第3页
汇编语言程序设计-第三章_80X86的指令系统和寻址方式.ppt_第4页
汇编语言程序设计-第三章_80X86的指令系统和寻址方式.ppt_第5页
免费预览已结束,剩余456页可下载查看

下载本文档

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

文档简介

第三章 80x86的指令系统和寻址方式,河南师范大学计算机与信息技术学院,2,2019/2/6,本章内容提要,河南师范大学计算机与信息技术学院,3,2019/2/6,预备知识,指令由操作码和操作数两部分组成。,操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。,操作数是指令执行的参与者,也就是各种操作的对象。,用助记符表达的指令的一般格式:,操作码 操作数1,操作数n ;注释,河南师范大学计算机与信息技术学院,4,2019/2/6,预备知识,操作码:,用一个唯一的助记符表示(指令功能的英文缩写),对应着机器指令的一个二进制编码,操作数:,可以是操作数本身(一个具体的数值),也可以是存放数据的寄存器,或指明数据在主存位置的存储器地址,河南师范大学计算机与信息技术学院,5,2019/2/6,预备知识,操作数字段可以是一个、二个或三个,通常称为一地址、二地址或三地址指令。,单操作数指令就是一地址指令它只需要指定一个操作数。,双操作数指令就是二地址指令。,操作数2称为源操作数scr,操作数1称为目的操作数dest,它不仅作为指令操作的一个对象,还用来存放指令操作的结果。,操作码 操作数,操作码 操作数1,操作数2,河南师范大学计算机与信息技术学院,6,2019/2/6,预备知识,大多数运算指令可使用三地址指令:,除给出参加运算的两个操作数(操作数2,操作数3)外,还指出运算结果的存放地址(操作数1)。,分号后的内容是对指令的解释。,操作码 操作数1,操作数2,操作数3,河南师范大学计算机与信息技术学院,7,2019/2/6,预备知识,而操作数的给出方式比较复杂,指令系统设计了多种操作数的来源。,寻找操作数的方式叫做操作数的寻址方式。,操作数采取哪一种寻址方式,会影响机器运行的速度和效率。,这种符号指令系统中,操作码的给出方式比较简单。,如何寻址一个操作数对程序的设计来讲也是很重要的。,河南师范大学计算机与信息技术学院,8,2019/2/6,3.1 80x86的寻址方式,河南师范大学计算机与信息技术学院,9,2019/2/6,3.1.1 与数据有关的寻址方式,8086、80286的机器字长位16位,一般情况下只处理8、16位数,只在乘、除指令中才会有32位数。,80386及其后继机型字长位32位,它可处理8、16、32位操作数,在乘除指令中还可产生64位数。,这种寻址方式用来确定操作数地址从而找到操作数。,本节对数据寻址方式的讨论,均以mov指令为例。,河南师范大学计算机与信息技术学院,10,2019/2/6,3.1.1 与数据有关的寻址方式,河南师范大学计算机与信息技术学院,11,2019/2/6,1. 立即数寻址方式(immediate addressing),操作数直接存放在指令中,紧跟在操作码之后,作为指令的一部分存放在代码段里。如图3.1(1)所示。,这种操作数被称为立即数imm:,它可以是8位数值i8;,也可以是16位数值i16或32位数值i32。,数据存放时采用“小端方式”。,立即数寻址方式常用来给寄存器赋值。,只能用于源操作数字段,不能用于目的操作数字段。,河南师范大学计算机与信息技术学院,12,2019/2/6,立即数寻址举例,例3.1 mov al,5 指令执行后(al)05h。,例3.2 mov ax,3064h 指令执行后(ax)3064h,如图3.2所示。,例3.3 mov eax,12345678h 指令执行后(eax)=12345678h。,河南师范大学计算机与信息技术学院,13,2019/2/6,2. 寄存器寻址方式(register addressing),操作数存放在cpu的内部寄存器reg中,无需访问存储器,因而可以得到较高的运算速度,如图3.1(2)所示。,寄存器可以是:,8位(r8): ah、al、bh、bl、ch、cl、dh、dl,16位(r16): ax、bx、cx、dx、si、di、bp、sp,32位(r32):eax、ebx、ecx、edx、esi、edi、ebp、esp,段寄存器(seg);cs、ds、ss、es、fs、gs,河南师范大学计算机与信息技术学院,14,2019/2/6,寄存器寻址举例,例3.4(a) mov ax,bx 如指令执行前(ax)3064h,(bx)1234h; 则指令执行后,(ax)1234h,(bx)保持不变。,例34(b) mov ecx,edx 如执行前(ecx)0123754h,(edx)12345678h; 则指令执行后,(ecx)12345678h,(edx)保持不变。,执行动画演示,河南师范大学计算机与信息技术学院,15,2019/2/6,存储器寻址方式,以下各种寻址方式的操作数都在除代码段以外的存储区中。,操作数地址是由段基地址和偏移地址相加而取得的。段基地址在实模式和保护模式下可从不同途径取得。这里要解决的问题是如何取得操作数的偏移地址。,在80x86里,把操作数的偏移地址称为有效地址(effective address,ea)。,通过不同寻址方式求得操作数地址,从而取得操作数。,下述各种寻址方式即为求得有效地址(ea)的不同途径。,河南师范大学计算机与信息技术学院,16,2019/2/6,存储器寻址方式,指令中给出操作数的主存地址信息(偏移地址,称之为有效地址ea),而段地址在默认的或用段超越前缀指定的段寄存器中。,80x86设计了多种存储器寻址方式:,16位寻址: 直接寻址方式 寄存器间接寻址方式 寄存器相对寻址方式 基址变址寻址方式 相对基址变址寻址方式,32位寻址: 比例变址寻址方式 基址比例变址寻址方式 相对基址比例变址寻址方式,河南师范大学计算机与信息技术学院,17,2019/2/6,有效地址ea (effective address),位移量(displacement)是存放在指令中的一个8位、16位或32位的数,但它不是立即数,而是一个地址。,基址(base)是存放在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。,变址(index)是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。,有效地址的四种组成成分:,比例因子(scale factor)是386及其后继机型新增加的寻址方式中的一个术语,其值可为1,2,4或8。在寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。这类寻址方式对访问元素长度为2,4,8字节的数组特别有用。,河南师范大学计算机与信息技术学院,18,2019/2/6,有效地址ea (effective address),ea基址(变址比例因子)+位移量,这四个成分中,除比例因子是固定值外,其他三个成分都可正可负,以保证指针移动的灵活性。,8086/80286只能使用16位寻址,而80386及其后继机型则既可用32位寻址,也可用16位寻址。在这两种情况下,对以上四种成分的组成有不同的规定,表3.1说明了这一规定。,有效地址的计算公式:,这四种成分可以任意组合使用,在各种不同组合下其中每一种成分均可空缺,但比例因子只能与变址寄存器同时使用。其中有关比例因子的三种组合只能用于80386及其后继机型。,河南师范大学计算机与信息技术学院,19,2019/2/6,段选择规则,表3.2则说明了各种访存类型下所对应的段的默认选择。实际上,在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段,如允许数据存放在除ds段以外的其他段中,此时程序中应使用段跨越前缀。,段的选择和段跨越前缀,以下三种情况下,不允许使用段跨越前缀:,串处理指令的目的串必须用es段;,push指令的目的和pop指令的源必须用ss段;,指令必须存放在cs段中。,河南师范大学计算机与信息技术学院,20,2019/2/6,3. 直接寻址方式(direct addressing),操作数的有效地址只包含位移量一种成分,其值就存放在代码段中指令的操作码之后,位移量的值即操作数的有效地址。如图3.1(3)所示。,默认的段地址在ds段寄存器,可使用段超越前缀改变。,直接寻址方式适用于处理单个变量。,例如,要处理某个存放在存储器里的变量,可以用存储器寻址方式,这就是一个常量常常先要送到寄存器的原因。,河南师范大学计算机与信息技术学院,21,2019/2/6,直接寻址举例,例3.5 mov ax,2000h 如(ds)3000h,则执行情况如图3.3所示。 执行结果为:(ax)3050h,在汇编语言指令中,可以用符号地址代替数值地址,如: mov ax,value,此时value为存放操作数单元的符号地址。如写成: mov ax,value,也是可以的,两者是等效的。如value在附加段中,则应指定段跨越前缀如下: mov ax,es:value 或 mov ax,es:value,河南师范大学计算机与信息技术学院,22,2019/2/6,直接寻址举例,例3.6 mov eax,data 指令中的data为符号地址,其中存放着32为操作数,故目的操作数也应使用32位寄存器。,河南师范大学计算机与信息技术学院,23,2019/2/6,4. 寄存器间接寻址方式(register indirect addressing),操作数的有效地址为基址寄存器内容或变址寄存器的内容。因此,有效地址就在某个寄存器中,而操作数则在存储器中,如图3.1(4)所示。,其他寄存器默认的段地址在ds段寄存器,可使用段超越前缀改变。,凡使用bp,esp和ebp寄存器时,其默认段为ss段。,这种寻址方式可以用于表格处理,执行完一条指令后,只需修改寄存器内容就可以取出表格的下一项。,河南师范大学计算机与信息技术学院,24,2019/2/6,寄存器间接寻址举例,例3.7 mov ax,bx 如果(ds)2000h,(bx)1000h 则物理地址20000100021000h 执行情况如图3.4所示。 执行结果为:(ax)50a0h。,指令中也可指定段跨越前缀来取得其他段中的数据。 如:mov ax,es:bx,例3.8 mov ecx,edx 指令把数据段中有效地址存放在edx寄存器中的32位操作数传送到ecx寄存器中。,河南师范大学计算机与信息技术学院,25,2019/2/6,5. 寄存器相对寻址方式(register relative addressing),又称直接变址寻址方式。,寄存器的使用和段寄存器的默认情况,同“寄存器间接寻址”。,操作数的有效地址为基址寄存器或变址寄存器的内容与指令中指定的位移量之和,所以有效地址由两种成分组成。这种寻址方式如图3.1(5)所示。,这种寻址方式同样可用于表格处理,表格的首地址可设置为位移量,利用修改基址或变址寄存器的内容来取得表格中的值。,河南师范大学计算机与信息技术学院,26,2019/2/6,寄存器相对寻址举例,例39 mov ax,countsi (也可表示为mov ax,countsi) 其中count为16位位移量的符号地址。 如果(ds)3000h,(si)2000h,count3000h 则物理地址300002000300035000h 指令执行情况如图3.5所示。 执行结果是:(ax)1234h,类似地,可有 mov eax,tableesi table为32位位移量的符号地址,esi的内容指向此表格中的一项。,这种寻址方式也可以使用段跨越前缀。例如: mov dl,es:stringsi,河南师范大学计算机与信息技术学院,27,2019/2/6,6. 基址变址寻址方式(based indexed addressing),操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两种成分组成。如图3.1(6)所示。,这种寻址方式同样适用于数组或表格处理,首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器都可以修改,所以它比直接寻址方式更加灵活。,河南师范大学计算机与信息技术学院,28,2019/2/6,基址变址寻址举例,例3.10 mov ax,bxdi (或写为:mov ax,bxdi) 如(ds)2100h,(bx)0158h,(di)10a5h 则ea015810a511fdh, 物理地址2100011fd221fdh 指令执行情况如图3.6所示。 执行结果(ax)1234h。,类似地,对于32位寻址方式可有: mov edx,ebxesi,此种寻址方式使用段跨越前缀时的格式为: mov ax,es:bxsi,河南师范大学计算机与信息技术学院,29,2019/2/6,7. 相对基址变址寻址方式(relatived based indexed addressing),操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中指定的位移量之和,所以有效地址由三种成分组成。如图3.1(7)所示。,这种寻址方式通常用于对二维数组的寻址。例如,存储器中存放着由多个记录组成的文件,在位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。这种寻址方式也为堆栈处理提供了方便,一般(bp)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。,河南师范大学计算机与信息技术学院,30,2019/2/6,相对基址变址寻址举例,例3.11 mov ax,maskbxsi (也可写成 mov ax,maskbxsi 或 mov ax,maskbxsi)。 如(ds)3000h,(bx)2000h,(si)1000,mask0250h, 则物理地址16d(ds)(bx)(si)mask 3000020001000025033250h 指令执行情况如图3.7所示。 执行结果(ax)1234h。,类似地,对于32位寻址方式可有: mov eax,arrayebxecx,提示:,位移量可用符号表示,同一寻址方式有多种表达形式,河南师范大学计算机与信息技术学院,31,2019/2/6,8. 比例变址寻址方式(scaled indexed addressing),操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和,所以有效地址由三种成分组成。如图3.1(8)所示。,这种寻址方式与相对寄存器寻址相比,增加了比例因子,其优点在于:对于元素大小为2,4,8字节的数据,可以在变址寄存器中给出数组元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。,河南师范大学计算机与信息技术学院,32,2019/2/6,比例变址寻址举例,例3.12 mov eax,countesi*4 如要求把双字数组count中的元素3送到eax中,用这种寻址方式可直接在esi中放入3,选择比例因子4(数组元素为4字节长)就可以方便地达到目的(见图3.8),而不必像在相对寄存器寻址方式中要把变址值直接装入寄存器中。,河南师范大学计算机与信息技术学院,33,2019/2/6,9. 基址比例变址寻址方式(based scaled indexed addressing),操作数的有效地址是变址寄存器的内容乘以比例因子再加上基址寄存器的内容之和,所以有效地址由三种成分组成。如图3.1(9)所示。,这种寻址方式与基址变址寻址方式相比,增加了比例因子,其优点是很明显的。,例3.13 mov ecx,eaxedx*8,河南师范大学计算机与信息技术学院,34,2019/2/6,10. 相对基址比例变址寻址方式(relative based scaled indexed addressing),操作数的有效地址是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量之和,所以有效地址由四种成分组成。如图3.1(10)所示。,这种寻址方式比相对基址变址方式增加了比例因子,便于对元素为2,4,8字节的二维数组的处理。,例3.14 mov eax,tableebpedi*4,河南师范大学计算机与信息技术学院,35,2019/2/6,3.1.2 与转移地址有关的寻址方式,河南师范大学计算机与信息技术学院,36,2019/2/6,3.1.2 与转移地址有关的寻址方式,如图3.9所示。,这种寻址方式用来确定转移指令及call指令的转向地址。,本节均以无条件转移指令jmp为例。,河南师范大学计算机与信息技术学院,37,2019/2/6,3.1.2 与转移地址有关的寻址方式,目标地址的寻址方式,直接寻址: 转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式。,间接寻址: 转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式。,用寄存器或存储器操作数表达,用符号表达,河南师范大学计算机与信息技术学院,38,2019/2/6,3.1.2 与转移地址有关的寻址方式,目标地址的范围:段内,段内转移近转移(near) 在当前代码段64kb范围内转移( 32kb范围) 不需要更改cs段地址,只要改变ip偏移地址,段内转移短转移(short) 转移范围可以用一个字节表达,在段内128127范围的转移,河南师范大学计算机与信息技术学院,39,2019/2/6,3.1.2 与转移地址有关的寻址方式,目标地址的范围:段间,段间转移远转移(far),从当前代码段跳转到另一个代码段,可以在1mb范围。,需要更改cs段地址和ip偏移地址。,目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。,实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移。,可用操作符short、near ptr 或far ptr强制。,河南师范大学计算机与信息技术学院,40,2019/2/6,1. 段内直接寻址(intrasegment direct addressing),转向的有效地址是当前ip寄存器的内容和指令中指定的8位或16位位移量之和,如图3.9(1)所示。,指令中的位移量是转向的有效地址与当前ip值之差,所以当这一程序段在内存中的不同区域运行时,这种寻址方式的转移指令本身不会发生变化,这是符合程序的再定位要求的。,转向有效地址用相对于当前ip值的位移量来表示,所以它是一种相对寻址方式。,河南师范大学计算机与信息技术学院,41,2019/2/6,1. 段内直接寻址(intrasegment direct addressing),这种寻址方式适用于条件转移及无条件转移指令:,当它用于条件转移指令时,位移量只允许8位(386及其后继机型条件转移指令的位移量可为8位或32位)。,无条件转移指令在位移量为8位时称为短跳转,位移量为16位时则称为近跳转 。,河南师范大学计算机与信息技术学院,42,2019/2/6,1. 段内直接寻址(intrasegment direct addressing),指令的汇编语言格式表示为: jmp near ptr progia jmp short quest,progia和quest均为转向的符号地址,在机器指令中,用位移量来表示。,在汇编指令中: 如果位移量为16位,则在符号地址前加操作符nera ptr; 如果位移量为8位,则在符号地址前加操作符short。,河南师范大学计算机与信息技术学院,43,2019/2/6,1. 段内直接寻址(intrasegment direct addressing),对于386及其后继机型:,代码段的偏移地址存放在eip中,同样用相对寻址的段内直接方式。,只是其位移量为8位或32位。8位对应于短跳转;32位对应于近跳转。由于位移量本身是个带符号数,所以8位位移量的跳转范围在128127的范围内;16位位移量的跳转范围为32k,32位位移量的跳转范围在2g。,所有机型的汇编格式均相同。,河南师范大学计算机与信息技术学院,44,2019/2/6,2. 段内间接寻址(intrasegment indirect addressing),转向有效地址是一个寄存器或是一个存储单元的内容。,这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。也就是说:,转向有效地址可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向的有效地址用来取代ip寄存器的内容。如图3.9(2)所示。,条件转移指令只能使用段内直接寻址的8位位移量(386及其后继机型允许8位或32位位移量);,jmp和call指令则可用四种寻址方式中的任何一种。,河南师范大学计算机与信息技术学院,45,2019/2/6,2. 段内间接寻址(intrasegment indirect addressing),段内间接寻址转移指令的汇编格式可以表示为: jmp bx jmp word ptrbp+table,其中word ptr为操作符,用以指出其后的寻址方式所取得的转向地址是一个字的有效地址,也就是说它是一种段内转移。,以上两种寻址方式均为段内转移,所以直接把求得的转向的有效地址送到ip寄存器就可以了。,河南师范大学计算机与信息技术学院,46,2019/2/6,段内间接寻址举例,假设:(ds)2000h,(bx)1256h,(si)528fh,位移量20a1h,(232f7h)3280h,(264e5h)2450h。,例316 jmp tablebx 则执行该指令后 (ip)(16d(ds)(bx)位移量) (20000125620a1) (232f7) 3280h,例315 jmp bx 则执行该指令后(ip)1256h,例316 jmp tablebx 则执行该指令后 (ip)(16d(ds)(bx)位移量) (20000125620a1) (232f7) 3280h,河南师范大学计算机与信息技术学院,47,2019/2/6,段内间接寻址举例,例316 jmp tablebx 则执行该指令后 (ip)(16d(ds)(bx)位移量) (20000125620a1) (232f7) 3280h,例317 jmp bxsi 则执行该指令后 (ip)(16d(ds)(bx)位移量) (200001256528f) (264e5) 2450h,以上说明举例均针对8086的16位寻址来分析的,对于386及其后继机型除16位寻址方式外,还可使用32位寻址方式,就方法而言是与16位寻址完全相同的。,例318 jmp bx 例319 jmp word ptr tablesi,河南师范大学计算机与信息技术学院,48,2019/2/6,3. 段间直接寻址(intersegment direct addressing),指令中直接提供了转向段地址和偏移地址,所以只要,用指令中指定的偏移地址取代ip寄存器的内容;,用指令中指定的段地址取代cs寄存器的内容就完成了从一个段到另一个段的转移操作。,如图3.9(3)所示。,河南师范大学计算机与信息技术学院,49,2019/2/6,3. 段间直接寻址(intersegment direct addressing),指令的汇编语言格式可表示为: jmp far ptr nextroutint,其中,nextroutint为转向的符号地址,far ptr则是表示段间转移的操作符。,对于386及其后继机型,段间转移应修改cs和eip的内容,方法仍然和16位寻址时一致。,河南师范大学计算机与信息技术学院,50,2019/2/6,4. 段间间接寻址(intersegment indirect addressing),用存储器中的两个相继字的内容来取代ip和cs寄存器中的原始内容,以达到段间转移的目的。,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得。,如图3.9(4)所示。,河南师范大学计算机与信息技术学院,51,2019/2/6,4. 段间间接寻址(intersegment indirect addressing),这种指令的汇编语言格式可表示为: jmp dword ptrintersbx,其中,intersbx说明数据寻址方式为直接变址寻址方式,dword ptr为双字操作符,说明转向地址需取双字为段间转移指令。,对于386及其后继机型,除16位寻址方式外,还可使用32位寻址方式,方法上也与16位寻址相同。如: jmp dword ptredi,河南师范大学计算机与信息技术学院,52,2019/2/6,3.2 程序占有的空间和执行时间,汇编语言程序要由 “汇编程序”将它翻译成机器语言程序,才能由计算机识别并执行。,一方面,80x86的机器指令是可变字节指令,即不同指令或不同寻址方式的机器指令长度不同。,一个程序一旦装入计算机,它就会占有一定的存储空间。程序量越大,占有的存储空间也越大。,一条16位格式指令的长度可为17个字节,32位指令则可达14个字节,如计入前缀字节(如段跨越前缀等)长度还会增加。,河南师范大学计算机与信息技术学院,53,2019/2/6,3.2 程序占有的空间和执行时间,另一方面,当程序在计算机上运行时,访问存储器取得操作数或存放结果需要时间,运算器执行指令也需要时间。,尽管计算机的运行速度已有很大提高:,时钟频率已从原来的5mhz提高到300mhz; 在体系结构方面采用了如数据预取、高速缓冲、流水线等多项重叠或并发技术。 指令的执行速度有了很大的提高,但程序运行仍是需要时间的。,完成同样功能的不同程序,可能在占有存储空间和执行时间上有很大差别。,河南师范大学计算机与信息技术学院,54,2019/2/6,3.2 程序占有的空间和执行时间,因此,在编制程序时:,如果对程序所占有的空间或程序的执行时间要求不高,那就只要根据题意编制出合乎要求的程序就可以了,当然也应该尽量在空间和时间上提高运行的效率。,对于程序所占有的存储空间或者对于程序执行的时间要求很高,在这种情况下,应仔细斟酌程序的算法、数据结构以及指令与寻执方式的选用,以编制出符合要求的程序。,河南师范大学计算机与信息技术学院,55,2019/2/6,3.3 80x86的指令系统,河南师范大学计算机与信息技术学院,56,2019/2/6,准备知识,指令系统,计算机的指令系统就是指该计算机能够执行的全部指令的集合。,每种计算机都有它支持的指令集合 。,16位8086指令系统是intel 80x86系列微处理器指令系统的基础。,河南师范大学计算机与信息技术学院,57,2019/2/6,准备知识,学习指令的注意事项,指令的功能该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式。,指令支持的寻址方式该指令中的操作数可以采用何种寻址方式。,指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响。,其他方面该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等。,河南师范大学计算机与信息技术学院,58,2019/2/6,准备知识,汇编语言指令的格式,标号:指令助记符 目的操作数,源操作数 ;注释,标号表示该指令在主存中的逻辑地址,每个指令助记符就代表一种指令,目的和源操作数表示参与操作的对象,注释是对该指令或程序段功能的说明,河南师范大学计算机与信息技术学院,59,2019/2/6,准备知识,指令操作数的表达,立即数:i8、i16、i32、imm、data、dest、src,寄存器: reg (r8、r16、r32)、seg,存储器: mem (m8、m16、m32),累加器:ac,河南师范大学计算机与信息技术学院,60,2019/2/6,3.3.1 数据传送指令,河南师范大学计算机与信息技术学院,61,2019/2/6,3.3.1 数据传送指令,数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。,数据传送是计算机中最基本、最重要的一种操作。,传送指令也是最常使用的一类指令。,传送指令把数据从一个位置传送到另一个位置。,除标志寄存器传送指令外,均不影响标志位。,河南师范大学计算机与信息技术学院,62,2019/2/6,1. 通用数据传送指令,河南师范大学计算机与信息技术学院,63,2019/2/6,(1) mov(move)传送,把一个字节、字或双字的操作数从源地址传送至目的地址。,格式为:mov dst,src,执行操作:(dst)(src),其中dst表示目的操作数,src表示源操作数。,mov指令传送功能示意图,非法传送情况,可以传送字节、字、双字,河南师范大学计算机与信息技术学院,64,2019/2/6,(1) mov(move)传送,mov reg/mem , imm ;立即数送寄存器或主存,mov reg/mem/seg , reg ;寄存器送(段)寄存器或主存,mov reg/mem , seg ;段寄存器送寄存器或主存,mov reg/seg , mem ;主存送(段)寄存器,mov指令传送形式,示例1,示例2,示例3,示例4,河南师范大学计算机与信息技术学院,65,2019/2/6,(2) movsx(move with sign-extend)带符号传送,该指令属386及其后继机型可用指令。,格式为:movsx dst,src,执行操作:(dst)符号扩展(src),传送时把源操作数符号扩展送入目的寄存器。,可以是8位符号扩展到16位或32位;,也可以是16位符号扩展到32位。,河南师范大学计算机与信息技术学院,66,2019/2/6,(2) movsx(move with sign-extend)带符号传送,mov reg (r16/r32), reg(r8/r16) ;寄存器送寄存器主存,mov reg(r16/r32), mem(m8/m16) ;主存送寄存器,movsx指令传送形式,示例,河南师范大学计算机与信息技术学院,67,2019/2/6,(3) movzx(move with zero-extend)带零扩展传送,该指令属386及其后继机型可用指令。,格式为:movzx dst,src,执行操作:(dst)零扩展(src),传送时把源操作数零扩展送入目的寄存器。,可以是8位符号扩展到16位或32位;,也可以是16位符号扩展到32位。,河南师范大学计算机与信息技术学院,68,2019/2/6,(3) movzx(move with zero-extend)带零扩展传送,mov reg (r16/r32), reg(r8/r16) ;寄存器送寄存器主存,mov reg(r16/r32), mem(m8/m16) ;主存送寄存器,movzx指令传送形式,示例,movsx和movzx指令与一般双操作数指令的差别是:,一般双操作数指令的源操作数和目的操作数的长度是一致的,但movsx和movzx的源操作数长度一定要小于目的操作数长度。,河南师范大学计算机与信息技术学院,69,2019/2/6,堆栈,堆栈是一个“后进先出filo”(或说“先进后出filo”)的主存区域,位于堆栈段中;ss段寄存器记录其段地址。,堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器sp(esp)指定。,栈顶是地址较小的一端(低端),栈底不变。,河南师范大学计算机与信息技术学院,70,2019/2/6,堆栈,堆栈:按照后进先出(lifo)的原则组织的存储器空间(栈)。,队列:按照先进先出(fifo)的原则组织的存储器空间。,河南师范大学计算机与信息技术学院,71,2019/2/6,(4) push(push onto the stack)进栈,格式为:push src,执行操作:,16位指令:(sp)(sp)2 (sp)1,(sp)(src),32位指令:(esp)(esp)4 (esp)3,(esp)2,(esp)1,(esp)(src),河南师范大学计算机与信息技术学院,72,2019/2/6,(4) push(push onto the stack)进栈,push指令可以有四种格式:,push reg push mem push data push segreg,也就是说,它可使用所有的寻址方式,但8086不允许push指令使用立即数寻址方式。,执行演示,示例,河南师范大学计算机与信息技术学院,73,2019/2/6,(5) pop(pop from the stack)出栈,格式为:pop dst,执行操作:,16位指令:(dst) (sp)1,(sp) 2 (sp)(sp) + 2,32位指令:(dst) (esp)3,(esp)2,(esp)1,(esp) (esp) (esp) + 4,河南师范大学计算机与信息技术学院,74,2019/2/6,(5) pop(pop from the stack)出栈,pop指令允许的格式:,pop reg pop mem pop segreg,pop指令不允许使用立即数寻址方式。,执行演示,注意:pop指令的目的为段寄存器时,不允许使用cs寄存器。,示例,河南师范大学计算机与信息技术学院,75,2019/2/6,堆栈操作,push指令: 先使堆栈指针sp(esp)减2(4),然后把一个字(双字)操作数存入堆栈顶部。,pop指令: 把栈顶的一个字(双字)传送至指定的目的操作数,然后堆栈指针sp(esp)加2(4)。,sp或esp的内容在任何时候都指向当前的栈顶,所以push和pop指令都必须根据当前sp或esp的内容来确定进栈或出栈的存储单元,而且必须及时修改指针,以保证sp或esp指向当前 的栈顶。 具体见表3.3。,河南师范大学计算机与信息技术学院,76,2019/2/6,特殊说明,8086中: push sp指令入栈的是该指令已修改了的sp新值; push esp指令入栈的却是esp在执行该指令之前的旧值。,此时 push 和 pop指令在使用与存储器有关的寻址方式且用 esp作为基址寄存器时:,push指令使用该指令执行前的esp内容; pop指令则使用该指令执行后的esp内容来计算基地址。,河南师范大学计算机与信息技术学院,77,2019/2/6,(6)pusha/pushad(push all registers)所有寄存器进栈,格式为:pusha 执行操作: 16位通用寄存器依次进栈,进栈次序为:ax,cx,dx,bx,指令执行前的sp,bp,si,di。指令执行后(sp)(sp)16仍指向栈顶。,格式为:pushad 执行操作: 32位通用寄存器依次进栈,进栈次序为:eax,ecx,edx,ebx,指令执行前的esp,ebp,esi和edi。指令执行后(esp)(esp)32。,示例,河南师范大学计算机与信息技术学院,78,2019/2/6,(7)popa/popad(pop all registers)所有寄存器出栈,格式为:popa 执行操作: 16位通用寄存器依次出栈,出栈次序为:di,si,bp,sp,bx,dx,cx,ax,指令执行后(sp)(sp)16仍指向栈顶。应该说明的是:sp的出栈只是修改了指针使其后的bx能顺利出栈,而堆栈中原先由pusha指令存入的sp的原始内容被丢弃,并未真正送到sp寄存器中去。,河南师范大学计算机与信息技术学院,79,2019/2/6,(7)popa/popad(pop all registers)所有寄存器出栈,格式为:popad 执行操作: 32位通用寄存器依次出栈,出栈次序为:edi,esi,ebp,esp,ebx,edx,ecx,eax。指令执行后(esp)(esp)32仍指向栈顶。与popa相同,堆栈中存放的原esp的内容被丢弃而不装入esp寄存器。,河南师范大学计算机与信息技术学院,80,2019/2/6,堆栈的操作特点,堆栈只有两种基本操作:进栈和出栈,对应四条指令push、pop、pusha/pushad、popa/popad。,pusha和popa可用于286及其后继机型;,pushad和popad可用于386及其后继机型。,堆栈的存取在16位指令中必须以字为单位(不允许字节堆栈),在32位指令中必须以双字为单位,所以push和pop指令只能作字或双字操作。,河南师范大学计算机与信息技术学院,81,2019/2/6,堆栈的特点,字(双字)数据从栈顶压入和弹出时,都是低地址字节(字)送低字节(字),高地址字节(字)送高字节(字)。,堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据。,堆栈常用来,临时存放数据 传递参数 保存和恢复寄存器,示例,河南师范大学计算机与信息技术学院,82,2019/2/6,堆栈的特点,如果在程序中要用到某些寄存器,但它们的内容却在将来还有用,这是就可以用pusha/pushad指令把它们保存在堆栈中,然后在需要时再用popa/popad指令恢复其原始内容。子程序结构的程序和中断程序中就经常会用到它们。,河南师范大学计算机与信息技术学院,83,2019/2/6,(8) xchg(exchange)交换,把两个地方的数据进行互换。,格式为:xchg opr1,opr2,执行操作:(opr1)(opr2),其中opr表示操作数。,指令允许字或字节操作,386及其后继机型还允许双字操作。,河南师范大学计算机与信息技术学院,84,2019/2/6,(8) xchg(exchange)交换,xchg reg , reg/mem ; reg reg/mem,xchg指令传送形式,示例2,寄存器与寄存器之间对换数据。,寄存器与存储器之间对换数据。,不能在存储器与存储器之间对换数据。,不允许使用段寄存器。,执行演示,示例1,河南师范大学计算机与信息技术学院,85,2019/2/6,2. 累加器专用传送指令,这组指令只限于使用累加器eax,ax或al传送信息。,河南师范大学计算机与信息技术学院,86,2019/2/6,输入/输出指令(in/out),在80x86里,外设与cpu之间的通信都由输入输出(in/out)指令来完成,呈现给程序员的外设是端口(port)即i/o地址。,8086用于寻址外设端口的地址线为16条,端口最多为21665536(64k)个,端口号(即外部设备的端口地址)为0000hffffh。,cpu只能用累加器(al或ax或eax)接收或发送信息。,in 完成从i/o到cpu的信息传送,而out则完成从cpu到i/o的信息传送。,每个端口用于传送一个字节的外设数据。,河南师范大学计算机与信息技术学院,87,2019/2/6,输入输出寻址方式,直接寻址(长格式):只用于寻址00hffh前256个端口,操作数i8表示端口号。,间接寻址(短格式):可用于寻址全部64k个端口(端口号可以从00000ffffh), dx寄存器的值就是端口号。,对大于ffh的端口只能采用间接寻址方式。,河南师范大学计算机与信息技术学院,88,2019/2/6,(1) in(input)输入,河南师范大学计算机与信息技术学院,89,2019/2/6,(1) in(input)输入,河南师范大学计算机与信息技术学院,90,2019/2/6,(2) out(output)输出,河南师范大学计算机与信息技术学院,91,2019/2/6,(2) out(output)输出,河南师范大学计算机与信息技术学院,92,2019/2/6,输入/输出指令(in/out),注意:这里的端口号或dx的内容均为地址,而传送的是端口中的信息,而且在用短格式时dx内容就是端口号本身,不需要由任何段寄存器来修改它的值。,操作提示,示例2,in和out指令提供了双字、字和字节三种使用方式,选用哪一种,则取决于外设端口宽度。如端口宽度只有8位,则只能用字节指令传送信息。,示例1,河南师范大学计算机与信息技术学院,93,2019/2/6,(3) xlat(translate)换码,将bx(ebx)指定的缓冲区中、al指定的位移处的一个字节数据取出赋给al。,格式为: xlat opr 或 xlat,执行的操作: 16位指令:(al)(bx)(al) 32位指令:(al)(ebx)(al),河南师范大学计算机与信息技术学院,94,2019/2/6,(3) xlat(translate)换码,opr为表格的首地址(一般为符号地址),在这里只是为提高程序的可读性而设置的,指令执行时只使用预先已存入bx或ebx中的表格首地址,而并不用汇编格式中指定的值。,换码指令执行前: 在主存建立一个字节表格,内含要转换成的目的代码,表格首地址存放于bx或ebx,al存放相对表格首地址的位移量(即需要转换的代码 )。,换码指令执行后: 将al寄存器的内容转换为目标代码。,执行演示,示例,河南师范大学计算机与信息技术学院,95,2019/2/6,3. 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器。,河南师范大学计算机与信息技术学院,96,2019/2/6,(1) lea(load effective address)有效地址传送寄存器,格式为:lea reg,src,执行的操作:(reg)mem的有效地址,指令把源操作数的有效地址送到指定的寄存器中。,该指令的目的操作数可使用16位或32位寄存器,但不能使用段寄存器。,源操作数可使用除立即数和寄存器外的任一种存储器寻址方式。,由于存在操作数长度和地址长度的不同,该指令执行的操作如表3.4所示。,示例1,示例2,河南师范大学计算机与信息技术学院,97,2019/2/6,(2) 指针送寄存器和ds/es/fs/gs/ss,该组指令包括lds、les、lfs、lgs、lss。,格式以lds为例为:lds reg,src,执行的操作: 16位指令:(reg)(mem) (sreg)(mem2) 32位指令:(reg)(mem) (sreg)(mem4),河南师范大学计算机与信息技术学院,98,2019/2/6,(2) 指针送寄存器和ds/es/fs/gs/ss,该组指令的源操作数只能用存储器寻址方式,根据任一种存储器寻址方式找到一个存储单元。,其他指令格式与lds指令格式相同,仅指定的段寄存器不同。,本组指令的目的寄存器不允许使用段寄存器。,lfs、lgs和lss只能用

温馨提示

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

评论

0/150

提交评论