第3章指令系统和寻址方式第3章指令系统和寻址方式3.1指令系统概述3.28088/8086CPU的寻址方式3.38088/8086CPU的指令系统习题3第3章指令系统和寻址方式3.1指令系统概述程序是指令的有序集合,指令是程序的组成元素,通常一条指令对应着一种基本操作。一台计算机能执行什么样的操作,能做多少种操作,是由该计算机的指令系统决定的。一台计算机的指令集合,就是该计算机的指令系统。每种计算机都有自己固有的指令系统,互不兼容。但是,同一系列的计算机其指令系统是向上兼容的。每条指令由两部分组成:操作码字段和地址码字段,格式如图3.1所示。第3章指令系统和寻址方式图3.1指令格式操作码字段:用来说明该指令所要完成的操作。地址码字段:用来描述该指令的操作对象。一般是直接给出操作数,或者给出操作数存放的寄存器编号,或者给出操作数存放的存储单元的地址或有关地址的信息。操作码操作数(地址码)第3章指令系统和寻址方式根据地址码字段所给出地址的个数,指令格式可分为零地址、一地址、二地址、三地址和多地址指令格式。大多数指令需要双操作数,分别称两个操作数为源操作数和目的操作数,指令运算结果存入目的操作数的地址中。这样,目的操作数的原有数据将被取代。Intel8086/8088的双操作数运算指令就采用这种二地址指令。指令中用于确定操作数存放地址的方法,称为寻址方式。如果地址码字段直接给出了操作数,这种寻址方式叫立即寻址;如果地址码字段指出了操作数所在的寄存器编号,叫寄存器寻址;如果操作数存放在存储器中,则地址码字段通过各种方式给出存储器地址,叫存储器寻址。第3章指令系统和寻址方式指令有机器指令和汇编指令两种形式。前一种形式由基2码(二进制)组成,它是机器所能直接理解和执行的指令。但这种指令不好记忆,不易理解,难写难读。因此,人们就用一些助记符来代替这种基2码表示的指令,这就形成了汇编指令。汇编指令中的助记符通常用英文单词的缩写来表示,如加法用ADD、减法用SUB、传送用MOV等等,这些符号化了的指令使得书写程序、阅读程序、修改程序变得简单方便了。但计算机不能直接识别和执行汇编指令,在把它交付给计算机执行之前,必须翻译成计算机所能识别的机器指令。汇编指令与机器指令是一一对应的,本书中的指令都使用汇编指令形式书写,便于学习和理解。第3章指令系统和寻址方式3.28088/8086CPU的寻址方式寻找和获得操作数、操作数存放地址或指令转移地址的方法称为寻址方式。8088/8086CPU的寻址分为两类,即数据寻址和指令寻址。指令寻址方式将在3.3.5节结合控制转移指令加以讨论。机器执行指令的目的就是对指定的操作数完成规定的操作,将操作结果存入规定的地方。因此,如何获得操作数的存放地址及操作结果的存放地址就是一个很关键的问题。8088/8086CPU有多种方法来获取操作数的存放地址及操作结果的存放地址,这些方法统称为数据寻址方式。第3章指令系统和寻址方式操作数及操作结果存放的地点有三处:存放在指令的地址码字段中;存放在寄存器中;存放在存储器的数据段、堆栈段或附加数据段中。与其对应的三种操作数是:立即操作数、寄存器操作数和存储器操作数。寻找这些操作数有三种基本寻址方式,立即寻址方式、寄存器寻址方式和存储器寻址方式。其中,存储器寻址又包括多种寻址方式。下面分别介绍这些寻址方式。第3章指令系统和寻址方式3.2.1立即寻址方式立即寻址方式寻找的操作数紧跟在指令操作码之后。这种寻址方式在汇编语言格式中表示为操作码数字表达式其中,这个数字表达式的值可以是一个8位整数,也可以是一个16位整数。【例3-1】MOVAX,267MOVAL,10010011BAND0FEHMOVAL,PORT1MOVAX,DATA1第3章指令系统和寻址方式其中,“267”是数字;“10010011BAND0FEH”是一个数字表达式;PORT1是一个用EQU定义的变量名,属于常数;DATA1是定义的段名,实际上就是段地址,是一常数。这些都是立即寻址方式。汇编立即寻址方式时,汇编程序首先计算出数字表达式的值,然后将其写入指令的地址码字段,这称为立即数。第3章指令系统和寻址方式【例3-2】MOVAL,0FFH操作的示意图如图3.2所示。【例3-3】MOVAX,1234H操作的示意图如图3.3所示。另外要注意,这种寻址方式不能用于单操作数指令。若用于双操作数指令,也只能用于源操作数字段,不能用于目的操作数字段。第3章指令系统和寻址方式图3.28位立即寻址操作示意图OP0FFH代码段AL第3章指令系统和寻址方式图3.316位立即寻址操作示意图OP34H代码段AX12H第3章指令系统和寻址方式3.2.2寄存器寻址方式寄存器寻址是指寻找的操作数在某个寄存器中。这种寻址方式在汇编语言格式中表示为操作码寄存器名比如AL,BX,CX,DS、IP等等。【例3-4】MOVAX,BXMOVAL,BL其中,AX,BX是16位寄存器寻址方式;AL,BL是8位寄存器寻址方式。第3章指令系统和寻址方式汇编这种寻址方式时,汇编程序将寄存器的地址编号写入指令的地址码字段。当机器执行含有这种寻址方式的指令时,根据地址码字段的编号访问到寄存器,继而访问到操作数。这种寻址方式的优点是:寄存器数量一般在几个到几十个,比存储器单元少很多,因此它的地址码短,从而缩短了指令长度,节省了程序存储空间;另一方面,从寄存器里取数比从存储器里取数的速度快得多,从而提高了指令执行速度。第3章指令系统和寻址方式3.2.3存储器寻址方式当操作数放在存储器中的某个单元时,CPU要访问存储器才能获得该操作数。如果存储器的存储单元地址是20位,把通过各种方法算出段内偏移地址(有效地址),结合段地址形成20位物理地址找到操作数的方法,统称为存储器寻址方式。1.直接寻址方式直接寻址方式是指寻找的操作数的地址在指令中直接给出。这种寻址方式在汇编格式中表示为●操作码地址表达式(或[地址表达式])●操作码[数字表达式]第3章指令系统和寻址方式【例3-5】假设TABLE是在数据段定义的一个字节数组的首地址标号(变量名),其偏移地址为1000H,则指令MOVAL,TABLE或MOVAL,TABLE+2或MOVAL,[TABLE]或MOVAL,[TABLE+2]或MOVAL,[1000H]或MOVAL,[1000H+2]是等效的。其中TABLE、[TABLE]、[1000H]、TABLE+2、[TABLE+2]和[1000H+2]都是直接寻址方式。第3章指令系统和寻址方式【例3-6】MOVAX,[1000H]如果(DS)=3000H,(31000H)=12H,(31001H)=34H,则指令执行完以后,(AX)=3412H。由此看出,这种寻址方式默认的段寄存器是DS。IBM-PC机允许在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址,这就是段超越前缀,其汇编格式为段寄存器名:地址表达式或段寄存器名:数字表达式或段寄存器名:[地址表达式]或段寄存器名:[数字表达式]第3章指令系统和寻址方式【例3-7】假设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则指令MOVAL,ES:TABLE或MOVAL,ES:[TABLE]或MOVAL,ES:1000H或MOVAL,ES:[1000H]是等效的,都表示将字节数组的第一个数组元素送入AL寄存器中。第3章指令系统和寻址方式2.寄存器间接寻址方式在计算机中通常将BX、BP称为基址寄存器,SI、DI称为变址寄存器,寻址时操作数的地址被放在这些寄存器中。寄存器间接寻址方式在汇编格式中表示为[基址寄存器名或变址寄存器名]【例3-8】MOVAX,[BX]MOVAX,[SI]其中,[BX]、[SI]都是寄存器间接寻址方式。第3章指令系统和寻址方式汇编寻址这种方式时,汇编程序将BX、SI、DI或BP寄存器的地址编号写入指令的地址码字段,当机器执行含有这种寻址方式的指令时,依据地址码字段的值访问得到寄存器的值,将该值作为操作数的偏移地址。如果指令中指定的寄存器是BX、SI、DI,则操作数默认在数据段中,取DS寄存器的值作为操作数的段地址值;如果指令中指定的寄存器是BP,则操作数默认在堆栈段中,取SS寄存器的值作为操作数的段地址值,从而算得操作数的20位物理地址,继而访问到操作数。第3章指令系统和寻址方式【例3-9】MOVAX,[BX]如果(DS)=3000H,(BX)=1010H,(31010H)=12H,(31011H)=24H,则操作数的20位物理地址=30000H+1010H=31010H。操作的示意图如图3.4所示。指令执行完以后,(AX)=2412H。这种寻址方式也允许指定段超越前缀来取得其他段中的数据。第3章指令系统和寻址方式图3.4寄存器间接寻址操作图12H存储器30000H24H数据段31010HAX第3章指令系统和寻址方式【例3-10】MOVAX,ES:[BX]它表示将附加数据段偏移量(BX)处的字数据送到AX寄存器中去。这种寻址方式一般用于访问表格,执行完一条指令后,通过修改SI、DI、BX或BP的内容就可访问到表格的下一数据项的存储单元。第3章指令系统和寻址方式3.寄存器相对寻址操作数的偏移地址是指定寄存器的值与一个整数之和。这种寻址方式的汇编格式为●变量名[基址寄存器名或变址寄存器名]或[变量名+基址寄存器名或变址寄存器名]●符号名[基址寄存器名或变址寄存器名]或[基址寄存器名或变址寄存器名+符号名]●[基址寄存器名或变址寄存器名±数字表达式]第3章指令系统和寻址方式【例3-11】TABLE是在数据段定义的一个字节数组的首地址标号(也称变量名),则有如下程序:MOVSI,5MOVAL,TABLE[SI];可以写为:MOVAL,[TABLE+SI]ABCEQU5LEASI,TABLE;LEA是取偏址指令,本句是把TABLE偏址→SIMOVAL,ABC[SI];可以写为:MOVAL,[ABC+SI]如:[BX+6]、[BP-100H]、[SI+OFFSETTABLE]都是寄存器相对寻址方式。第3章指令系统和寻址方式汇编这种寻址方式时,汇编程序将BX、SI、DI或BP寄存器的地址编号写入指令的地址码字段,并且将变量名的偏移地址、符号名的数值或数字表达式的计算结果值作为位移量也写入指令的地址码字段。当机器执行含有这种寻址方式的指令时,依据地址码字段的编号访问得到寄存器的值,将该值与位移量相加(或相减),和(或差)作为操作数的偏移地址。如果指令中指定的寄存器是BX、SI、DI,则操作数默认在数据段中,取DS寄存器的值作为操作数的段地址值;如果指令中指定的寄存器是BP,则操作数默认在堆栈段中,取SS寄存器的值作为操作数的段地址值,从而算得操作数的20位物理地址,继而访问到操作数。第3章指令系统和寻址方式【例3-12】TABLE是数据段中定义的一个变量,假设它在数据段中的偏移地址为0100H,有指令:MOVAX,TABLE[SI]若(DS)=2000H,(SI)=00A0H,(201A0H)=12H,(201A1H)=34H,则源操作数20位物理地址=20000H+0100H+00A0H=20000H+01A0H=201A0H。当然,也可用段超越前缀重新指定段寄存器,例如:MOVAL,ES:TABLE[SI]这种寻址方式一般用于访问表格,表格首地址可设置为变量名,通过修改SI、DI、BX或BP的内容来访问表格的任一数据项的存储单元。第3章指令系统和寻址方式4.基址变址寻址操作数的偏移地址是两个指定寄存器的值之和。这种寻址方式在汇编格式中表示为[基址寄存器名][变址寄存器名]或[基址寄存器名+变址寄存器名]【例3-13】MOVAX,[BX][SI]或写为MOVAX,[BX+SI]其中,[BX][SI]、[BX+SI]都是基址变址寻址方式。当机器执行含有这种寻址方式的指令时,依据地址码字段的值访问得到基址寄存器和变址寄存器的值,将其相加,和作为操作数的偏移地址。第3章指令系统和寻址方式【