PC汇编语言程序设计 第3章.pdf

上传人:asd****56 文档编号:70321463 上传时间:2023-01-19 格式:PDF 页数:90 大小:1.64MB
返回 下载 相关 举报
PC汇编语言程序设计 第3章.pdf_第1页
第1页 / 共90页
PC汇编语言程序设计 第3章.pdf_第2页
第2页 / 共90页
点击查看更多>>
资源描述

《PC汇编语言程序设计 第3章.pdf》由会员分享,可在线阅读,更多相关《PC汇编语言程序设计 第3章.pdf(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第三章 指令格式与寻址方式第三章 指令格式与寻址方式3.1 PC机操作数的寻址方式机操作数的寻址方式3.2 PC机转向地址的寻址方式机转向地址的寻址方式3.3 机器语言与汇编语言简介机器语言与汇编语言简介习题三习题三第三章 指令格式与寻址方式计算机的指令一般由两部分组成:操作码字段和操作对象字段。操作码字段指示所要执行的操作,即指示计算机“做什么”。如加、减法,数据传送等;而“做”的对象则由操作对象字段给出,如加法指令中的两个加数及它们和的存放处。操作对象字段可能是操作数本身,也可能是指明存放操作数的寄存器或内存单元地址。指令的格式可表达为:第三章 指令格式与寻址方式指令中的操作对象字段可以有

2、三个,二个或一个,也可以没有,并依次称为三地址指令、二地址指令、一地址指令和零地址指令。例如:大多数运算型指令需要指出三个操作数,除参加运算的两个操作数外,还指出运算结果的存放处;传送指令MOV则只需要两个操作数,即操作数的源位置和目的位置;另有些指令,如加一指令INC只需要指出一个操作数。空操作指令NOP则不需要任何操作数,属零地址指令。第三章 指令格式与寻址方式PC机的指令系统为二地址指令系统,需要有三个操作对象的指令,也使用二地址指令来表示,并将两个操作对象分别称为“源操作数”和“目的操作数”(或终点操作数),指令执行后的运算结果(第三个操作对象)存放到目的操作数的地址中。这样,参加运算

3、的目的操作数运算后将会丢失。如果这个操作数以后还要用到,就应在运算之前保存一个副本。指令的操作码字段和操作对象字段是用二进制编码来表示的。如果操作码字段共有n位,则可以有2n种不同的代码,可用于代表2n个不同的操作。第三章 指令格式与寻址方式如果操作对象字段指的是操作数在内存中的地址,那么如果这个地址的位数较少,则必然使访问内存的空间受到限制。如果让这个地址能访问较大的内存空间,则又会使地址码长度太大,特别是当指令有两个或三个操作对象时,就使得这个问题更加突出了。另外,如果指令中的地址字段只能表示内存的实际地址,碰到需要按某种规律访问的操作对象(例如访问存放在内存中的数组元素或矩阵元素)时,将

4、很不方便。第三章 指令格式与寻址方式为了解决上述两个问题,就要压缩指令中操作对象字段的长度,同时使操作对象的表示多样化,这就是所谓的“寻址方式”。换句话说,寻址方式是规定如何对操作对象字段作出解释,找到所需的操作数的方式,或者程序转移时找到转移地址的方式。即形式地址寻址方式物理地址寻址方式不仅有效地压缩了操作对象字段的长度,节省了存储空间;而且丰富了程序设计手段,提高了程序的质量和可读性。第三章 指令格式与寻址方式3.1 PC机操作数的寻址方式机操作数的寻址方式3.1.1 寄存器寻址(寄存器寻址(Register Addressing)方式)方式寄存器寻址方式的操作数在某个寄存器中,指令中仅指

5、定寄存器号。寄存器寻址方式如图3.1(a)所示。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP,对于8位操作数,寄存器可以是AL、AH,BL、BH、CL、CH、DL和DH。这种寻址方式由于操作数就在CPU的通用寄存器中,不需要访问存储器,因而指令的执行速度高。另外,由于通用寄存器数目较少,编码所需的二进位也就少,因而使用寄存器寻址可以有效地减少指令宽度;由于寄存器寻址的优点,因而在程序设计中应尽可能地采用寄存器寻址。第三章 指令格式与寻址方式图3.1 操作数的寻址方式寄存器号操作数指令寄存器(a)寄存器操作数指令(b)立即段基址段寄存器段内偏移地址指令操作数存储器

6、(c)直接段基址段寄存器段内偏移地址寄存器操作数(d)寄存器间接存储器EA寄存器号指令物理地址物理地址第三章 指令格式与寻址方式图3.1 操作数的寻址方式段基址段寄存器操作数存储器偏移量寄存器号指 令地址寄存器段内偏移地址EA(e)寄存器相对段基址段寄存器操作数存储器变址值基址寄存器指 令基地址基址寄存器段内偏移地址EA(f)基址变址变址寄存器变址寄存器段基址段寄存器操作数存储器偏移量基址寄存器指 令基地址基址寄存器段内偏移地址EA(g)相对基址变址变址寄存器变址值变址寄存器物理地址物理地址物理地址第三章 指令格式与寻址方式下列指令中所有操作数均采用寄存器寻址:MOV AL,AH该指令表示将A

7、H寄存器的内容送入AL寄存器中,如图3.2所示。图的右面是内存,指令位于CS段中,图的左面是AX寄存器,操作用箭头标出。SUB AX,BX该指令表示将AX内容减去BX内容,所得差送入AX寄存器中,即(AX)-(BX)(AX)。XOR AX,AX第三章 指令格式与寻址方式该指令表示将AX寄存器各位与自身求异或,结果送入AX寄存器中,即完成0(AX)。INC CX该指令表示将CX寄存器内容加1,再送入CX寄存器中,即(CX)+1(CX)。第三章 指令格式与寻址方式图 3.2 寄存器寻址AHALMMMOVAHCS段第三章 指令格式与寻址方式3.1.2 立即寻址立即寻址(Immediate Addre

8、ssing)方式方式在立即寻址方式中,操作数存放在指令中,在取出指令的同时,也就获得了操作数,故将这种操作数称为立即数。这种寻址方式如图3.1(b)所示。立即寻址方式用来表示常数,经常用于给寄存器赋初值。立即数可以是8位的或16位的。如果是16位数,则高位字节存放在高地址中,低位字节存放在低地址中。例如:MOV CL,5该指令表示将立即数5送入CL寄存器,如图3.3(a)所示。第三章 指令格式与寻址方式OV AX,AB该指令表示将字母A、B的ASCII码分别送入AH和AL寄存器中,如图3.3(b)所示。该指令表示将AL寄存器内容与立即数30H相加后放回AL寄存器中,即(AL)+30H(AL)。

9、AND DX,7FFFH该指令表示将DX寄存器内容与立即数7FFFH按位与,结果放回DX寄存器,完成将DX最高位清零。第三章 指令格式与寻址方式图3.3 立即寻址MMMOV5CS段CHCLMMMOVBCS段AHALA(b)MOV AX,AB(a)MOV CL,5第三章 指令格式与寻址方式需要强调的是,立即数不能用于单操作数指令。而双操作数指令只能用于源操作数字段,不能用于目的操作数字段。下面三条指令是错误的:INC 1999H ;单操作数指令不能使用立即数寻址MOV 1000H,AX ;立即数不能作为目的操作数ADD AL,AB;立即数A、B的ASCII码为16位,而目的操作数只有8位除上述两

10、种寻址方式外,以下各种寻址方式的操作数都在除代码段以外的内存区中。在汇编语言源程序中,内存地址是采用逻辑地址的形式表示的,逻辑地址可写为:段基址:段内偏移地址第三章 指令格式与寻址方式图 3.4 直接寻址18H01H88HMMCS段ES118HES段NOT第三章 指令格式与寻址方式段基址位于某个段寄存器内,段内偏移地址是存储单元与段起始地址之间的距离,也可称为“有效地址”记作EA。在PC机中,偏移地址可由下面三个地址分量中的某一个或某几个的组合求得,并由此命名为不同的寻址方式。(1)偏移量(Displacement)。偏移量既可用数字也可用变量名或符号地址表示,既可为8位,也可为16位。(2)

11、基址(Base Address)。基址为基址寄存器BX或基址指针BP中的内容。(3)变址(Index Address)。变址为源变址寄存器SI或目的变址寄存器DI中的内容。第三章 指令格式与寻址方式313 直接寻址(直接寻址(Direct Addressing)方式)方式在直接寻址方式中,段内偏移地址由偏移量给出,即EA=偏移量,如图3.1(c)所示。如果操作数在数据段中,则物理地址16d(DS)+EA。若指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。下列指令中均使用了直接寻址:NOT Byte PTR ES:第三章 指令格式与寻址方式该指令把距附加段ES首地址为118H的一个内存字节

12、单元的内容按位取反。若该单元原存内容为88H,操作后变为77H。指令中Byte PTR为字节指针(Byte Pointer)操作符,用来说明对内存的一个字节(而不是一个字)进行操作,如图3.4所示。ADD AX,ABC该指令表示将数据段DS内符号地址为ABC的字单元的内容与AX寄存器的内容相加,再放回AX中,若指令中未指明段寄存器,则隐含为DS,另外将ABC写为ABC,其汇编意义相同。CMP ES:LABEL,80H第三章 指令格式与寻址方式该指令为比较指令,表示将附加段ES段内符号地址为LABEL的字节单元内容减去立即数80H,但不送结果,仅置标志位。SAL WORD PTR DS:26H,

13、1该指令为算术左移指令,表示将DS段内偏移地址为26H的字算术左移一位(即乘以2)。指令中WORD PTR为字指针(Word Pointer)操作符,用来说明对内存的一个字进行操作。当仅使用数字表示段内直接地址时,必须将其放在内,否则会被认为是立即数26H。第三章 指令格式与寻址方式314 寄存器间接寻址(寄存器间接寻址(Register Indirect Addressing)方式)方式这种寻址方式的操作数段内偏移地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数则在存储器中,如图3.1(d)所示。在寄存器间接寻址方式中,上述4个寄存器就如同一个地址指针指向操作数的存放单元。如果指

14、令中指定的寄存器是BX、SI、DI,则DS为隐含的段寄存器,即操作数的物理地址为:)DI()SI(BX(DS)d16物理地址第三章 指令格式与寻址方式如果指令中指定BP寄存器,则SS为隐含的段寄存器,所以操作数的物理地址为:物理地址16d(SS)+(BP)若操作数前指定段寄存器说明,则以指定的段寄存器为准。下列指令中均使用了寄存器间接寻址:NEG WORD PTRDI该指令为求补指令,操作数为数据段中的一个字,DI寄存器中存放着它的段内偏移地址。若该存储字单元存放数据为8888H,则指令执行完后将变为7778H(按位取反,末位加一),如图3.5所示。第三章 指令格式与寻址方式图 3.5 寄存器

15、间接寻址MM88H88H(DI)DS第三章 指令格式与寻址方式OR BX,80H 该指令以BX的内容作为段内偏移地址,从数据段(以DS为段寄存器)中取出一个字节的数据与立即数80H按位“或”,结果仍放回原内存单元(即将该单元最高位置为“1”)。TEST BP,8000H该指令为测试指令,它将两个操作数按位“与”,但不回送结果,仅置标志位,源操作数为立即寻址,目的操作数为寄存器间接寻址。操作数为位于堆栈段的一个字,BP寄存器中存放着操作数的段内偏移地址。该指令是检测这个字的最高位是“1”还是“0”的。第三章 指令格式与寻址方式DEC Byte PTRSI该指令为减 1 指令,操作数为数据段中的一

16、个字节,SI寄存器中存放着它的段内偏移地址。指令执行完后该地址单元中的数据被减去了1。在下面指令中由于源操作数为直接寻址,目的操作数为寄存器间接寻址,两个操作数均在内存中,因而是错误的。第三章 指令格式与寻址方式3.1.5 寄存器相对寻址(寄存器相对寻址(Register Relative Addressing)方式)方式这种寻址方式的操作数段内偏移地址是一个基址寄存器(BX或BP)或变址寄存器(SI或DI)的内容与指令中指定的8位或16位偏移量之和。即:位偏移量位偏移量168)DI()SI()BP(BXEA使用BX或BP也可称为基址寻址,使用SI或DI也可称为变址寻址,这种寻址方式如图3.1

17、(e)所示。第三章 指令格式与寻址方式如果寄存器为BX、SI、DI,则隐含使用段寄存器DS,而如果寄存器为BP,则隐含使用段寄存器SS,若操作数前指定段寄存器,则应以指定的段寄存器为准。位偏移量位偏移量物理地址168)DI()SI(BX(DS)d16或位偏移量位偏移量物理地址168)BP(SS)d16用这种寻址方式处理数组和表格比较方便,可将偏移量设置为数组或表格的首地址,利用修改基址或变址寄存器的内容来访问数组或表格中的不同元素或表项。第三章 指令格式与寻址方式下面指令使用了寄存器相对寻址:SHL Byte PTR 26HSI,1该指令为逻辑左移指令,操作数为位于内存数据段中的一个字节,其段

18、内偏移地址为26H+(SI),如图3.6所示。若该存储字单元存放数据为11H,指令执行完后将各位依次左移一位,末位补“0”,该单元内容变为22H。PUSH ES:86HDI该指令为压栈指令,表示将附加段内的一个字(而不是一个 字 节)压 入 堆 栈,该 单 元 的 物 理 地 址 为(ES)16d+86H+(DI)。第三章 指令格式与寻址方式图 3.6 寄存器相对寻址MM11H26H(SI)DS第三章 指令格式与寻址方式CMP ABCBX,55H该指令为比较指令,表示将数据段内一个字节的内容与立即数55H做比较,并置标志位,该字节的物理地址为(DS)16d+符号ABC代表的偏移地址+(BX)。

19、SUB AX,ARRYBP该指令中的源操作数为堆栈段的一个字,该操作数的物理地址为(SS)16d+符号ARRY代表的偏移地址+(BP)。SUB指令将AX的内容减去该操作数,减得的差送回AX寄存器中。第三章 指令格式与寻址方式3.1.6 基址变址寻址(基址变址寻址(Based Indexed Addressing)方式)方式基址变址寻址方式的操作数段内偏移地址是一个基址寄存器和一个变址寄存器的内容之和。这种寻址方式如图3.1(f)所示。如基址寄存器为BX时,段寄存器则隐含使用DS;如基址寄存器为BP时,段寄存器则隐含使用SS。因此,物理地址为:(DI)(SI)(BX)(DS)d16物理地址或(D

20、I)(SI)(BP)(SS)d16物理地址第三章 指令格式与寻址方式若操作数前指定段寄存器,则应以指定的段寄存器为准。这种寻址方式同样适用于数组或表格处理,首地址可存放在基址寄存器中,而用变址寄存器指向数组中的各个元素。由于两个寄存器都可以修改,因而使用起来更加灵活。下面指令均使用了基址变址寻址:NEG Byte PTRBXSI该指令将数据段内的一个字节的数据取补(按位取反,末位加一),若该单元原存56H,求补后则变为AAH。该单元的段内偏移地址为:EA=(BX)+(SI),如图3.7所示。第三章 指令格式与寻址方式图 3.7 基址变址寻址MM56H(BX)(SI)DS第三章 指令格式与寻址方

21、式POP BPDI该指令为出栈指令,它将堆栈的栈顶元素(一个字)弹出,送入堆栈段(由SS指定的段)内的一个字单元中。该单元的段内偏移地址为:EA=(BP)+(DI)。AND AX,BXDI该指令中的源操作数位于数据段(由DS指定的段)。该单元的段内偏移地址为:EA=(BX)+(DI)。该指令将该单元的内容与AX的内容按位“与”,结果存放于AX寄存器中。TEST BPSI,80H该指令的目的操作数位于堆栈段(由SS指定的段),段内偏移地址为:EA=(BP)+(SI),该指令将立即数80H与该字节单元的内容按位求逻辑“与”,但不回送结果,仅置标志位,即检测该字节单元的符号。第三章 指令格式与寻址方

22、式下面的指令将两个基址寄存器或变址寄存器一起使用,因此是错误的。OR AX,BXBPDWNOT WORD PTRSIDI第三章 指令格式与寻址方式3.1.7 相对基址变址寻址(相对基址变址寻址(Relative Based Indexed Addressing)方式)方式这种寻址方式的操作数段内偏移地址是三个地址分量之和,即一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容与一个偏移量(8位或16位)之和。这种寻址方式如图3.1(g)所示。同样,当基址寄存器为BX时,隐含使用的段寄存器为DS;而当基址寄存器为BP时,则隐含使用的段寄存器为SS。因此,物理地址为:位偏移量位偏移量物

23、理地址168(DI)(SI)(BX)(DS)d16第三章 指令格式与寻址方式或位偏移量位偏移量物理地址168(DI)(SI)(BP)(SS)d16这种寻址方式为访问数组(特别是两维数组)提供了方便。数组的首地址可用偏移量表示,基址(BX、BP)、变址(SI、DI)分别用以表示行地址和列地址。下面指令均使用了相对基址变址寻址:INC Byte PTR 0318HBXSI第三章 指令格式与寻址方式该指令操作数为位于数据段的一个字节数据,其段内偏移地址为318H+(BX)+(SI)。该指令将该字节内容加1后,仍放回原处。若该单元原存为77H,操作后变为78H,如图3.8所示。PUSH LABEL+B

24、X+DI该指令表示将数据段(由DS指定)的一个字压入堆栈,该字的段内偏移地址为:EA=LABEL+(BX)+(DI)。SHR WORD PTR ARRYBPDI,1该指令为逻辑右移指令,操作数为位于堆栈段(由SS指定)的一个字数据。该字的段内偏移地址为:EA=ARRY+(BP)+(DI)。SHR指令将该操作数的各位依次右移一位,最高位补“0”,最低位移进CF位。第三章 指令格式与寻址方式77HDS318H(BX)(SI)图3.8 相对基址变址寻址第三章 指令格式与寻址方式SAR BYTE PTR ABCBPSI,1该指令为算术右移指令,操作数为位于堆栈段的一个字节数据。该字节的段内偏移地址为A

25、BC+(BP)+(SI)。SAR指令将该操作数的各位依次右移一位,最高位保持不变,最低位移进CF位。第三章 指令格式与寻址方式3.2 PC机转向地址的寻址方式机转向地址的寻址方式3.2.1 段内直接寻址段内直接寻址(Intrasegment Direct Addressing)方式方式段内直接转移的汇编格式为:程序控制指令NEAR PTR DST(DST为同一代码段内的符号地址)其中,程序控制指令可以为条件转移指令、无条件转移指令、循环指令和子程序调用指令,NEAR PTR为近指针(Near Pointer)操作符,指明后面的符号地址位于同一段内。第三章 指令格式与寻址方式汇编时用转向地址(同

26、一段内的符号地址所代表的地址)减去该程序控制指令的下一条指令所在的地址,得到两者间的相对距离,该距离称为相对偏移量。由于转向地址可在程序控制指令之后,也可在程序控制指令之前,因而偏移量可为正,也可为负,用补码表示。在汇编过程中,根据转移的距离,决定偏移量的位数。如果转移距离较大,就用16位偏移量;如果转移距离较近,就用8位偏移量。第三章 指令格式与寻址方式程序运行时,将当前IP寄存器的内容(程序控制指令下一条指令的地址)与指令中的偏移量(8位或16位)相加,将和装入IP实现段内直接转移,如图3.9(a)所示。由于这种寻址方式是以与程序控制指令的相对距离体现的,因而,当程序装入不同的内存区域时,

27、这种寻址方式总会找到要转向的指令,满足程序再定位的要求。这种寻址方式适用于所有程序控制类指令,但是当用于条件转移指令及循环指令时,偏移量只允许8位。无条件转移指令JMP和子程序调用指令CALL既可用16位偏移量也可用8位偏移量,当偏移量为8位时,称为短跳转(SHORT)。第三章 指令格式与寻址方式图 3.9 与转向地址有关的寻址方式偏移量指 令IP寄存器IP寄存器(a)段内直接数据寻址方式指 令由任何一种内存寻址得偏移地址转向的段内偏移地址转向的段内偏移地址IP寄存器IP寄存器寄存器寻址或寄存器存储器中一个字单元(b)段内间接转向的段内偏移地址第三章 指令格式与寻址方式图 3.9 与转向地址有

28、关的寻址方式转向的段内偏移地址指 令转向的段基址IP寄存器CS寄存器(c)段间直接数据寻址方式指 令由任何一种内存寻址得偏移地址转向的段内偏移地址转向的段基址IP寄存器CS寄存器存储器中的二个相继字(d)段间间接第三章 指令格式与寻址方式3.2.2 段内间接寻址段内间接寻址(Intrasegment Indirect Addressing)方式方式这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令和循环指令。也就是说,条件转移指令和循环指令只能使用段内直接寻址,并且仅为8位偏移量,而JMP和CALL两条指令则可用四种寻址方式中的任何一种。段内间接转移的汇编格式为:JMP(或CALL)

29、REG(REG为通用寄存器)或 JMP(或CALL)WORD PTR DST(DST为内存中的一个字)段内间接寻址方式的转向偏移地址不能为立即数,可以是一个寄存器的内容或是一个存储单元的内容。若它为存储单元的内容,则可使用任何一种内存寻址方式。第三章 指令格式与寻址方式若寻址方式为寄存器寻址方式,则寄存器的内容便是转向地址。当CPU执行JMP或CALL指令时,就将寄存器的内容装入IP,如图3.9(b)所示。若寻址方式为内存寻址方式,则转向地址便是存储单元的一个字。其中,WORD PTR为操作符,用以指出其后的寻址方式所取得的转向地址是一个字,CPU执行JMP或CALL指令时,就将内存单元一个字

30、装入IP,实现转移,如图3.9(b)所示。以上两种寻址方式均为段内转移,所以只改变IP寄存器的值,而不改变段寄存器CS的值。第三章 指令格式与寻址方式3.2.3 段间直接寻址段间直接寻址(Intersegment Direct Addressing)方式方式段间直接转移的汇编格式为:JMP(或CALL)FAR PTR DSTWT(DST为另一代码段内的符号地址)其中,FAR PTR(Far Pointer)为段间转移操作符,用以说明其后的符号地址位于另一段内。汇编时,将该符号地址所在的段基址和段内偏移地址写入JMP或CALL指令中。将段基址放在高字,将段内偏移地址放在低字。程序运行,当执行JM

31、P或CALL指令时,只要将指令中指定的偏移地址(低字)装入IP寄存器,将指令中指定的段基址(高字)装入段寄存器CS,就完成了从一个段到另一个段转移,如图3.9(c)所示。第三章 指令格式与寻址方式3.2.4 段间间接寻址段间间接寻址(Intersegment Indirect Addressing)方式方式段间间接转移的汇编格式为:JMP(或CALL)DWORD PTR DST (DST为内存中的一个双字)其中,DWORD PTR为双字指针(Doubler Word Pointer)操作符,指明转向地址需取双字分别作为段基址和段内偏移地址,可采用任何一种内存数据寻址方式,但不能用寄存器寻址方式

32、和立即数寻址方式。执行JMP或CALL指令时,根据指令中指定的某种内存寻址方式找到内存的一个双字(32位),将高字内容装入段寄存器CS,将低字内容装入IP寄存器,实现段间转移。如图3.9(d)所示。第三章 指令格式与寻址方式3.3 机器语言与汇编语言简介机器语言与汇编语言简介顾名思义,所谓“机器语言”就是计算机可读懂的语言,它是用二进制代码“0”、“1”对指令中的操作码、寻址方式等信息进行编码的。但“0”、“1”代码不便记忆和读写,为了方便编程,将操作码、寻址方式等信息用缩写的英文单词和其它简单符号来表示,这种语言便称之为“汇编语言”。汇编语言程序是机器语言程序的符号化,与机器语言程序有着简单

33、的一一对应的关系。本节简要说明指令的机器语言编码是如何构成的,以及机器语言与汇编语言是如何对应的。第三章 指令格式与寻址方式3.3.1 双操作数指令编码格式双操作数指令编码格式双操作数指令编码适用于如MOV,ADD,SUB,AND等有两个操作数的指令。一个操作数在寄存器中,另一个操作数在寄存器或存储器中;或者一个操作数在寄存器/存储器中,另一个为立即数。双操作数指令编码长度为26个字节。图3.10表示了这种编码格式。它由四个部分组成。图 3.10 双操作数指令编码格式第三章 指令格式与寻址方式1 操作特征部分 操作特征部分操作特征部分位于指令编码的第一字节。它包括以下三个字段:(1)OP操作码

34、字段(位7位2)。该字段规定了指令的操作种类和两个操作数的来源。表3-1给出了几条指令的操作码。第三章 指令格式与寻址方式(2)D方向字段(位1)。第二字节的寻址特征部分指出两个操作数,一个由REG字段确定,另一个由MOD和R/M字段确定。方向字段D规定哪个字段表示源操作数,哪个字段表示目的操作数。若D=1,表示REG字段为目的操作数,而由MOD和R/M字段确定了源操作数。若D=0,表示由MOD和R/M字段确定了目的操作数,而REG字段为源操作数。第三章 指令格式与寻址方式表表 3-1 指令操作码示例指令操作码示例第三章 指令格式与寻址方式(3)W字/字节字段(位0)。当W=1时,它表示字操作

35、,即两个操作数均为字;当W=0时,它表示字节操作,即两个操作数均为字节。第三章 指令格式与寻址方式2 寻址特征部分 寻址特征部分寻址特征部分位于指令编码的第二个字节。它表示两个操作数分别使用何种寻址方式,以及使用哪个寄存器。它包括三个字段。REG字段确定一个操作数,MOD和R/M字段共同确定另一个操作数。(1)REG寄存器字段(位5位3)。REG字段用于指定操作数所在的通用寄存器(即寄存器寻址方式)。REG字段与W字段配合使用,共有16种组合,见表3-2。它不仅指明寄存器,而且还指明寄存器是8位还是16位。第三章 指令格式与寻址方式第三章 指令格式与寻址方式(2)MOD寻址方式字段(位7位6)

36、。(3)R/M寄存器/存储器字段(位2位0)。由MOD和R/M字段共同确定一个操作数。这个操作数可以在寄存器中(即寄存器寻址方式),也可以在存储器的某一单元中(即直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址中的一个)。表3-3 给出了由这两个字段确定的寻址方式及寄存器。当MOD=11时,则代表相对寄存器寻址。结合R/M和W字段从16个寄存器中选取一个寄存器(与REG字段寻找操作数相同)。第三章 指令格式与寻址方式当MOD=00,01,10时,结合R/M给出计算操作数偏移地址EA的几种方法。当MOD=00,R/M=110时,则代表直接寻址,直接从指令编码的第3,4字节中取出16位偏

37、移量(displow,disphigh)作为EA。当MOD=00,R/M=100,101或111时,则分别代表寄存器间接寻址,此时变址寄存器(SI,DI)或基址寄存器(BX)中的内容就是EA。当MOD=01或10,且R/M=100,101,110,111时,则代表相对寄存器寻址(相对变址或相对基址),偏移量(disp)可以是8位或16位。第三章 指令格式与寻址方式当MOD=00,且R/M=000,001,010或011时,则代表基址变址寻址。当MOD=01或10,且R/M=000,001,010或011时,则代表相对基址变址寻址,其中偏移量(disp)可以是8位或16位。第三章 指令格式与寻址

38、方式表表 3-3 MOD和和R/M字段编码字段编码第三章 指令格式与寻址方式3 偏移量 偏移量disp部分部分指令编码中是否有偏移量,取决于寻址特征中MOD和R/M字段。表3-3中,若MOD=00、R/M=110,则有两个字节的偏移量disp16(直接地址)。若MOD=01,则有一个字节的偏移量disp8(位于指令编码的第三字节)。若MOD=10,则有两个字节的偏移量disp16(位于指令编码的第三、四字节)。否则指令中没有偏移量disp。第三章 指令格式与寻址方式4 立即数 立即数Imm部分部分若指令带有立即数,那么就有这部分,且它总是位于指令编码的最后1或2个字节处,若立即数是8位,则只需

39、1个字节。若是16位,则需要2个字节。若无立即数,指令编码中就没有这一部分。以下举例说明指令的二进制编码,即指令的机器语言。第三章 指令格式与寻址方式例例 3.1 指令“MOV DA,89ABH”是将16位的立即数89ABH送入内存单元DA中,目的操作数DA为直接寻址。指令MOV的操作码为“1100011”,辅助操作码(REG)为000。若DA存储单元的段内偏移地址为0004H,则这条指令各部分编码如下:该指令的机器码为“C7 06 04 00 AB 89”,共六个字节。第三章 指令格式与寻址方式例例 3.2 指令“MOV BP,SP”完成了两个16位寄存器之间的数据传送。因不涉及偏移量和立即

40、数,所以指令代码较短。它的操作码为MOV,代码为“100010”。该指令的源、目的操作数均为寄存器,所以MOD=11。同一条指令可存在两种不同编码,如d=1,那么指令各部分编码如下:第三章 指令格式与寻址方式指令的机器代码为“8B EC”仅两个字节。如d=0,那么指令各部分编码为:指令的机器代码为“89 E5”。这两种编码完全等价,对应同一条汇编指令。第三章 指令格式与寻址方式例例 3.3 指令“MOV DS,AX”是把通用寄存器AX的内容传送到段寄存器DS中。在这种情况下,段寄存器总是由REG字段确定的,且必定是16位的操作数。所以d,W字段成为了操作码(OP)的一部分。当REG字段确定了段

41、寄存器时,按照表3-4编码进行选择,则指令编码如下:第三章 指令格式与寻址方式表表 3-4 REG字段的段寄存器编码字段的段寄存器编码第三章 指令格式与寻址方式表表 3-5 段前缀标记代码段前缀标记代码第三章 指令格式与寻址方式例例 3.4指令“MOV AX,ES:BX”是将存储单元的一个字传送到通用寄存器AX中。BX前使用了ES,则由段寄存器ES替代DS,为此,在指令编码中增加一个字节的段前缀标记代码。由于段前缀标记代码的前三位恒为001,最后三位恒为110,中间的两位是表3-4中段寄存器编码的后两位(去掉左边“0”),由此可得,段前缀标记代码如表3-5所示。该指令各部分编码如下:指令的机器

42、代码为“26 8B 07”。第三章 指令格式与寻址方式3.3.2 单操作数指令编码格式单操作数指令编码格式单操作数指令编码格式适用于INC,NOT,NEG和左右移位等只有一个操作数的指令。编码格式有操作特征、寻址特征和偏移量三部分,如图3.11所示。图 3.11 单操作数指令编码格式第三章 指令格式与寻址方式与双操作数指令编码相比,由于这类指令只涉及一个操作数,因此,寻址特征部分不需要REG字段,操作特征部分不需要D字段,并将REG字段改作辅助操作码。在移位/循环移位指令中把D字段改作V字段(若V=0,则表示只移位1次;若V=1,则移位次数取决于CL寄存器的值),其余各字段(W字段、MOD和R

43、/M字段、偏移量等)的意义与双操作数指令编码相同。第三章 指令格式与寻址方式例例 3.5 指令“INC AL”是指将8位寄存器AL的内容加“1”。INC的操作码和辅助操作码分别为1111111和000。因此,本指令编码如下:指令的机器代码为“FE C0”。第三章 指令格式与寻址方式例 3.6 指令“SHR AL,CL”是指按照CL寄存器中的值将AL寄存器中的内容逻辑右移。指令代码原来的D位改作V位,且V=1。它的操作码和辅助操作码分别为110100和101。因此,指令各部分编码如下:指令的机器代码为“D2 E8”。第三章 指令格式与寻址方式3.3.3 涉及涉及AX,AL寄存器的指令编码格式寄存

44、器的指令编码格式这种编码格式均为双操作数指令,并指定AX(AL)寄存器作为一个操作对象,因此,无需设置寻址特征部分(即无MOD,REG,R/M字段)。另一个操作对象或为立即数,或为存储单元,编码中用12个字节的数据部分表示,若该操作对象为存储单元,则寻址方式一定使用直接寻址方式,并把它的段内偏移地址置于编码中数据部分。图3.12表示了这种编码格式。图 3.12 涉及AX,AL寄存器的指令编码格式第三章 指令格式与寻址方式例例 3.7 指令“AND AL,0FH”是指将寄存器AL与立即数0FH进行逻辑与。其指令编码如下:指令的机器代码为“24 0F”。第三章 指令格式与寻址方式例例 3.8 指令

45、“MOV RAND,AX“是指把寄存器AX的内容传送到RAND单元中。若RAND存储单元的段内偏移地址为007DH,那么指令编码如下:指令的机器代码为“A3 7D 00”。第三章 指令格式与寻址方式3.3.4 其他指令编码格式其他指令编码格式其他编码格式主要用于转移指令、标志位操作指令、堆栈操作指令等。这种编码格式更为简单,仅有一个字节,如图3.13所示。图 3.13 这种编码格式的指令所含的操作数常常采用隐含方式,因此,它仅有操作码部分。第三章 指令格式与寻址方式例例 3.9 指令CLC为标志位CY的清零指令,该指令的编码为:有些指令的OP中包含有REG字段。第三章 指令格式与寻址方式例例

46、3.10 PUSH指令,如果把通用寄存器的内容压入堆栈,则其编码格式为:如果把段寄存器的内容压入堆栈,则其编码格式为:第三章 指令格式与寻址方式习 题 三习 题 三3.1 试说明下列各指令中源操作数和目的操作数的寻址方式:(1)AND AX,0FH (2)ADD AL,1918H(3)MOV DS,AX(4)CMP 18HSI,CX(5)INC WORD PTR318(6)SUB BPSI,222H(7)OR BX,714HBP(8)PUSH DS(9)STC 第三章 指令格式与寻址方式3.2 根据操作数所在的位置,指出其寻址方式的名称。(1)操作数在寄存器中(2)操作数的地址在通用寄存器中(

47、3)操作数在指令中(4)操作数的地址在指令中(5)操作数的地址为基址寄存器的内容与偏移量之和。(6)操作数的地址为变址寄存器的内容与偏移量之和。第三章 指令格式与寻址方式3.3 PC机有哪几种寻址方式为存储器寻址?在这些寻址方式中如何求得段内偏移地址?段内偏移地址、段基址、内存物理地址三者之间有什么关系?第三章 指令格式与寻址方式3.4 若(BX)=637DH,(SI)=2A9BH,偏 移 量D=7237H,试确定在以下寻址方式中哪些具有段内偏移地址,以及段内偏移地址是什么?(1)立即寻址(2)使用D的直接寻址(3)使用BX的寄存器寻址(4)使用BX的间接寻址(5)使用BX的寄存器相对寻址(6

48、)使用BX、SI的基址变址寻址(7)使用BX、SI、D的相对基址变址寻址第三章 指令格式与寻址方式3.5 若(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后AX寄存器的内容。(1)MOV AX,1200H(2)MOV AX,BX(3)MOV AX,1200H(4)MOV AX,BX(5)MOV AX,1100BX(6)MOV AX,BXSI(7)MOV AX,1

49、100BXSI第三章 指令格式与寻址方式3.6 根据以下要求写出相应的汇编语言指令。(1)把AX寄存器和CX寄存器的内容相加,结果存入CX寄存器中。(2)用寄存器BX和DI,采用基址变址寻址方式,把存储器中的一个字节与AH寄存器的内容相加,并保存在AH寄存器中。(3)用寄存器BX和偏移量10H,采用寄存器相对寻址方式把存储器中的一个字和(AX)相加,并把结果送回存储器单元中。(4)将段内偏移地址1000H按直接寻址方式把存储器中的一个字与数1234H相加,并把结果送回该存储单元中。(5)把数0A4H与(BH)相加,结果送回BH中。第三章 指令格式与寻址方式3.7 假定(DS)=2000H,(E

50、S)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下列源操作数字段的寻址方式,并计算其物理地址。(1)MOV AX,0ABH (2)MOV AX,BX(3)MOV AX,100H(4)MOV AX,VAL(5)MOV AX,BX(6)MOV AX,ES:BX(7)MOV AX,BP(8)MOV AX,SI(9)MOV AX,BX+10(10)MOV AX,VALBX(11)MOV AX,BXSI(12)MOV AX,VALBXSI第三章 指令格式与寻址方式3.8 已知(SS)=0915H

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁