[汇编]8086寻址方式

PA

表示某一存储单元的物理地址
EA 表示某一存储单元的有效地址
(地址) 表示地址的内容
[地址] 表示地址的内容为偏移地址
DEST 表示目的地址,即目的操作数存放的偏移地址
SOUR 表示源地址,即源操作数存放的偏移地址
- 表示传送。如:(AX)-BX表示把AX的内容传送给BX
? 逻辑与
? 逻辑或
⊕ 逻辑异或
---- 上划线表示逻辑非
____ 下划线表示从键盘输入
或者
Flags 表示状态寄存器

8086和8088 CPU就功能而言可分成两大部分:总线接口单元BIU(Bus Inte***ce Unit)和执行单元EU(Execution Unit)

EU主要实现两种操作:一是根据指令进行算术逻辑运算。二是由计算出指令要求寻址单元地址偏移量,以形成一个20位物理地址,去存取器存取所要求的操作数。
BIU主要负责80868088 CPU与存储器和外设之间的信息传送,BIU用来实现EU所有总线操作。
在EU执行指令的过程中,BIU负责从内存指定区域取出传送给EU部分去执行。在执行指令时,所需的操作数也是由BIU从内存指定区域取出传送给EU部分执行。

与数据有关的寻址方式

1 立即寻址方式(Immediate addressing)

立即数可以是8位的或16位的。如果是16 位数,则高位字节存放在高地址中,低位字节存放在低地址中,如果是32 位数,则高位字在高地址中,低位字在低地址中。

  立即寻址方式常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。


例 MOV AL, 9
         指令执行后,(AL)= 09H

例 MOV AX, 3064H
         指令执行后,(AX)= 3064H

注意:不能直接给段寄存器和标志寄存器赋予立即数。

     显然,下面的指令是错误的:
     MOV DS, 1250H

2 寄存器寻址方式(Register addressing)

 对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和SS;对于8位操作数,寄存器可以是AL、AH、 BL、BH、CL、CH、DL、DH。由于操作数就在寄存器中,指令执行时不需要访问存储器,因此这是一种快速的寻址方式。

例 MOV  AX, BX
          如指令执行前(AX)= 1234H,(BX)= 5678H;
          则指令执行后(AX)= 5678H,(BX)保持不变。

  注意:源寄存器和目的寄存器的位数必须一致。

  例如:MOV CL, BX是一条错误指令。


  除上述两种寻址方式外,下面五种寻址方式的操作数都在除代码段以外的存储区中。
  这里先引入有效地址EA(Effective Address)的概念:在8086里,把操作数的偏移地址称为有效地址,下面五种计算EA的方法体现了五种寻址方式。

3 直接寻址方式(Direct addressing)

 在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过((DS)×16)再加上这个有效地址形成。
  
 在汇编语言指令中,可以用符号地址(变量名或标号)代替数值地址。
  例如: MOV AX, DATA
    或 MOV AX, [DATA]
    这里DATA是存放操作数单元的符号地址。

  直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。
  例如: MOV AX, ES:NUMBER
    或 MOV AX, ES:[NUMBER]
    这里NUMBER是附加段中的字变量。

  直接寻址方式适合于处理单个变量。

例 MOV AX, [2000H]
         如果(DS)= 3000H,则执行情况如图3.2所示。
         最后的执行结果为(AX)= 3050H。

4 寄存器相对寻址方式(Register indirect addressing)

  这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。  

  寄存器相对寻址方式也可以使用段跨越前缀。
  例如:MOV AX, ES:[DI+10]

  这种寻址方式同样可用于表格处理。
  表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。

例 MOV AX, COUNT[SI](也可表示为MOV AX, [COUNT+SI])
        其中COUNT为16位位移量的符号地址。
        如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H

        则物理地址 = 30000H + 2000H + 3000H = 35000H
        指令执行情况如图3.4所示,最后的执行结果是(AX)= 1234H。

5 基址变址寻址方式(Based indexed addressing)

  这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址是一个基址寄存器(BP或BX)和一个变址寄存器(SI或DI)的内容之和。 如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。如左图所示。  

  此种寻址方式也可使用段跨越前缀。
  例如:MOV AX, ES:[BX][SI]

  注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
  例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。

  这种寻址方式同样适用于数组或表格处理。
  首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。

例 MOV AX, [BX][DI] (或写为 MOV AX, [BX+DI])
        如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H
        则 EA = 0158H +10A5H = 11FDH


        物理地址 = 21000H +11FDH = 221FDH
        指令执行情况如图3.5所示,最后的执行结果是(AX)= 1234H。

6 相对基址变址寻址方式(Relative based indexed addressing)

  这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP组合。  

  这种寻址方式通常用于对二维数组的寻址。
  例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。

  这种寻址方式也为堆栈处理提供了方便。
  一般(BP)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。

  综上所述,有效地址可以由以下三种成分组成:
  · 位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。
  · 基址(Base)是存放在基址寄存器(BX或BP)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
  · 变址(Index)是存放在变址寄存器(SI或DI)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。

  有效地址的计算可用下式表示:
  EA = 基址 + 变址 + 位移量

  这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到不同的寻址方式。

例 MOV AX, MASK[BX][SI]
      (或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
      如(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,
      则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H
      指令执行情况如图3.6所示,最后的执行结果是(AX)= 1234H。

与转移地址有关的寻址方式

  前面的与数据有关的寻址方式最终确定的是一个数据的地址,而这里的与转移地址有关的寻址方式最终确定一条指令的地址。顺序执行的指令地址是由指令指针 寄存器IP自动增量形成的,而程序转移的地址必须由转移类指令和CALL指令指出,这类指令表示转向地址的寻址方式包括:段内直接寻址、段内间接寻址、段 间直接寻址、段间间接寻址。

  三个表示转移距离(称为位移量)的操作符:SHORT、NEA*、**R。

  SHORT表示位移量在-128~127字节之间。

  NEA*表示在同一段内转移,位移量在-32768~32767字节范围内。

  **R表示转移距离超过±32K字节,或是在不同段之间转移。
  因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。
 
  SHORT转移,称为短转移,位移量用一个字节(8位)来表示。

  NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。

  FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。

  与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的。

1 段内直接寻址(Intrasegment direct addressing)

  这种寻址方式在指令中直接指出转向地址,如:

    JMP SHORT NEXT
    JMP NEAR PTR AGAIN

  其中,NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。  

  注意:这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。

  例 段内直接寻址方式

            1060:000D EB04 JMP SHORT NEXT
      IP当前值→ 1060:000F … …
            1060:0011 … …
            1060:0013 0207 NEXT: ADD AL,[BX]

  CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMP SHORT NEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:
            000F + 0004 = 0013

  0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。

2 段内间接寻址(Intrasegment indirect addressing)

  这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:

    JMP BX
    JMP NEAR PTR [BX]
    JMP TABLE[SI]

  根据指令中的寻址方式,确定一个寄存器或一个存储单元,其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的。

  注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。

  条件转移指令只能使用段内直接寻址的8位位移量,而JMP和CALL指令则可用四种寻址方式中的任何一种。

  假设: (DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
      位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。

  例 JMP BX
        则执行该指令后(IP)= 1256H

  例 JMP [BX][SI]
        则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
                 =(20000H + 1256H + 528FH)
                 =(264E5H)
                 = 2450H

3 段间直接寻址(Intersegment direct addressing)

  段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的操作符FAR PTR。

  指令格式如下:
     JMP FAR PTR OUTSEG

  因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。

4 段间间接寻址(Intersegment indirect addressing)

  这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。

  为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。指令格式如下:
    JMP DWORD PTR [SI]
    JMP DWORD PTR[TABLE+BX]
第三章 8086/8088的寻址方式和指令系统 练习题 一.单项选择题 1.设BX=2000H,SI=3000H,指令MOV AX,[BX+SI+8]的源操作有效地址为( )。 A.5000H B.5008H C.23008H D.32008H 2.设DS=1000H,ES=2000H,BX=3000H,指令ADD AL,[BX]的源操作数的物理址为(  )。 A.13000H B.23000H C.33000H D. 3000H 3.设DS=2000H,ES=3000H,SI=200H,指令MOV ES:[SI],AL的目的操作数的物理地址为( )。 A.20200H B.30200H C.50200H D.200H 4.指令MOV MEM[BX],AX中的MEM是( )。 A.原码 B.反码 C.补码 D.移码 5.用来作为寄存器间接寻址的寄存器有( )个。 A.8 B.6 C.5 D.4 6.指令MOV [BX+SI],AL中的目的操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 7.指令MOV BX,[BP+5]中的源操作数使用( )段寄存器。 A.CS B.DS C.SS D.ES 8.段内间接寻址只改变( )中的内容。 A.CS B.IP C.CS和IP D.PSW 9.段间间接寻址只改变( )中的内容。 A.CS B.IP C.CS和IP D.PSW 10.下述指令中不改变PSW的指令是( )。 A.MOV AX,BX B.AND AL,0FH C.SHR BX,CL D.ADD AL,BL 11.下述指令中不影响CF的指令是( )。 A.SHL AL,1 B.INC CX C.ADD [BX],AL D.SUB AX,BX 12.两个整数补码9CH和7AH相加运算后,会产生( )。 A.无溢出且无进 B.无溢出但有进 C.有溢出且有进 D.有溢出但无进 13.指令JMP WORD PTR [BX]属于( )寻址。 A.段内直接 B.段内间接 C.段间直接 D.段间间接 14.指令MOV AX,[BX+SI+8]的源操作数属于( )寻址。 A.直接 B.寄存器相对 C.基址变址 D. 相对基址变址 15.指令( )不改变CF的内容。 A.DEC AL B.ADD AX,CX C.SUB [BX],CL D.SBB AL,DL 16.十进制数字74所对应的压缩型BCD码的形式是( )。 A.74 B.74H C.4AH D.4A 17.十进制数字85所对应的非压缩型BCD码的形式是( )。 A.0085 B.0085H C.0805 D.0805H 18.设AL=67H,执行“CMP AL,76H”后,AL=( )。 A.76H B.0DFH C.67H D.00 19.设AL=65H,BL=29H,执行下列指令后,AL=( )。 ADD AL,BL DAA A.8EH B.94 C.94H D.8E 20.压栈操作是( )数的操作。 A.8 B.16 C.32 D.任意 21.执行IMUL指令时,如果乘积的高部分不是低部分的符号扩展,则( )。 A.OF=0、CF=0 B.OF=0、CF=1 C.OF=1、CF=0 D.OF=1、CF=1 22.设AX=3762H,CL=5,执行“SHR AX,CL”后,AX=( )。 A.0376H B.01BBH C.01BB D.0376 23.若要在BUF缓冲区中寻找与AL中不相等的数据,应使用( )SCASB串操作指令。 A.REPNE B.REP C.REPE D.REPNZ 24.如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一条指令的操 作码,那么该条指令的移量是( )。 A.20H B.1EH C.0DEH D.0E0H 25.如果“JA P”指令的操作码放在0050H, 该指令的移量为34H,执行完此条指 令转移到取下一条指令的偏移地址为( ) A.0082H B.0084H C.0086H D.0088H 26.若DS=1000H,BX=2000H,(12000H)=56H,(12001H)=78H,AX=1000H,执行 “ADD AX,[BX]”指令后,AX=( )。 A.8856H B.6678H C.8800H D.6600H 27.设AX、BX寄存器中存放的是有符号的二进制数据,若执行“CMP AX,BX”指 令后,( )L表示大于则转L。 A.JZ B.JA C.JGE D.JG 28.执行“DIV BX”指令后,( )寄存器中存放商。 A.AL B.AH C.AX D.DX 29.执行“( )AX,BX”指令不改变AX寄存器中的内容。 A.CMP B.ADD C.XOR D.OR 30.若AX=1000H,执行“NEG AX”指令后,AX=( )。 A.1000H B.0E000H C.0F000H D.1001H 二.多项选择题 1.在下列寻址方式中,用来访问内存寻址方式有( )。 A.寄存器寻址 B.寄存器间接寻址 C.寄存器相对寻址 D.直接寻址 2.用来作为寄存器间接寻址的寄存器有( )。 A.AX B.BX C.BP CX 3.在下列指令中,源操作数使用DS段寄存器进行寄存器相对寻址的有( )。 A.MOV AX,[DI+4] B.MOV AX,ES:[SI+8] C.MOV AX,[BP+4] D.MOV AX,[BX+4] 4.在下列指令中,源操作数的寻址方式是错误的有( )。 A.MOV AX,[DI+BX] B.MOV AX,[SI+DI] C.MOV AX,[BP+BX] D.MOV AX,[DX] 5.在下列指令中,属于段内转移指令的有( )。 A.JMP SHORT A B.JMP [BX] C.JMP DWORD PTR [BX] D.JMP NEAR PTR [BX+SI] 6.在下列指令中,错误的指令有( )。 A.SUB 5,AL B.ADD AL,BX C.INC [BX] D.SHR AX,6 7.执行“CMP AX,8003H”指令后,当AX中的无符号数高于8003H时,下列指令中有效的转移指令有( )。 A.JNB L B.JA L C.JG L D.JNL L 8.可与串操作指令“CMPSW”指令配合使用的重复前缀有( )。 A.REP B.REPZ C.REPNZ D.REPE 9.在下列的输入/输出指令中,正确的指令有( )。 A.IN AX,80H B.OUT DX,AX C.IN AL,340 D.OUT DX,AL 10.在下列的指令中,错误的指令有( )。 A.PUSH AL B.MOV AL,BX C.PUSH 1000H D.CALL AX 11.可以用下列指令代替“LOOP L”指令的有( )。 A.DEC CX B.DEC CX JNZ L JNC L C.DEC CX D.DEC CX CMP CX,0 JE L JE L 三.填空题 1.在一条指令中,立即数只能作 操作数。 2.8086/8088 CPU形成的内存物理地址有 。 3.指令“MOV AX,[BX+SI]”的源操作数在内存的 段。 4.指令“MOV BX,[BP+DI]”的源操作数在内存的 段。 5.指令“MOV AX,ES:[SI]”的源操作数在内存的 段。 6.入栈指令使用的是 段。 7.指令“ADD [BX+SI],AL”的目的操作数是 寻址方式。 8.指令“SUB BX,A[SI]”的源操作数是 寻址方式。 9.指令“JMP DWORD PTR [BX]”属于 寻址方式。 10.可作为寄存器间接寻址的寄存器有 个。 11.堆栈是从 地址向 方向生长的。其操作遵循 的操作原则。 12.在进行弹栈操作时应该先将弹出的数据送 ,然后 。 13.在进行多精度加法运算时,一般使用 指令。 14.通用的数据传送指令不影响 。 15.“INC AL” 指令不影响标志16.若AL=11H,执行“NEG AL” 后,AL= 。 17.JMP指令的执行 PSW寄存器中的各。 18.两个无符号数进行比较时,可以根据 标志来判断大小。在编写程序时可使用 指令来实现。 19.若执行“DIV BX”,其被除数的高16必须放在 ,低16必须放在 。 20.DAA指令只对 寄存器中的内容进行调整。 21.若AL=84H,在执行CBW后,AL= 。 22.十进制数1234的压缩型BCD码为 。 23.执行 AND AL,0FH JNZ L 指令,是检测AL中的 ,当它为非零则转移。 24.若移指令的移数大于1时,其移数必须放在 中。 25.如果AL=85H,CL=4,执行“SAR AL,CL”时,AL= ,CF= 。 26.在串操作指令中,SI指向 串,DI指向 串。 27.如果要查找某串中与AL寄存器中有相同的字符(数),则在SCASB指令前应配合使用 重复前缀。 28.转移指令“JNZ L ”的转移范围(十进制)是 。该指令的第二个字节为移量,用 形式表示。 29.段内调用指令改变 中的内容。 30.段间调用指令改变 中的内容。 四、判断题(判断下列指令是否正确,如果是错误的,请指出错误的原因) 1.ADD AL,BX 2.MOV [BX],SI 3.SUB [BX],[SI] 4.CMP 5,AL 5.MOV CX,AX 6.LEA BL,A 7.SHR AL,6 8.MOV AL,[DI+SI] 9.MOV BL,200H 10.MOV AX,DATA 11.INC [BX] 12.CMP [BX],A ;A为变量 13.MOV AX,‘+’ 14.MOV AX, [BP+BX] 15.ADD AX,[CX] 16.OUT 400,AL 17.JNC P 18.MOV BX,,OFFSET A 19.LEA DI,A[SI] 20.CMP AX,5 五.改错题(按下列指令中的原意改正下列指令) 1.DEC [SI] 2.CMP AL,BX ;8无符号数比较 3.MOV [DX],AL 4.MOV AL,300H 5.MOV [BX],[DI] ;字节操作 6.ADD AL,[CX+SI] 7.ADD AL,BX ;16带符号数相加 8.PUSH AL 9.CMP [BX],5 ;字节比较 10.MOV DS,1234H 六.简答题 1.设BX=1000H,SI=2000H,移量D=3000H,请指出下列各种寻址方式的有效地址是什么? (1)使用D的直接寻址 (2)使用BX寄存器的间接寻址 (3)使用BX寄存器的相对寻址 (4)基址变址寻址 (5)相对基址变址寻址 2.请指出下列各条指令的源操作数的寻址方式是什么? (1)MOV AX,BUF (2)CMP AL,5 (3)ADD [BX+5],AX (4)SUB AX,[BX+SI] (5)ADC AH,A[SI] (6)MOV BX,[SI] (7)AND CX,B[BP+SI] (8)JMP WORD PTR [BX] (9)JMP P (10)JMP FAR PTR P 3.设 DS=2000H, BX=0100H, SI=0002H, (20100H)=12H, (20101H)=34H, (20102H)= 56H, (20103H)= 78H, (21200H)= 2AH, (21201H)= 4CH, (21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器中的内容是多少? (1)MOV AX,1200H (2)MOV AX,BX (3)MOV AX,[1200H] (4)MOV AX,[BX] (5)MOV AX,[BX+1100H] (6)MOV AX,[BX+SI] (7)MOV AX,[BX+SI+1100H] 4.按下列各小题的要求写出相应的一条汇编语言指令。 (1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中 (2)以BX和SI寄存器作基址变址寻址方式,把该单元中的一个字传送到AX。 (3)以SI和移量20H作寄存器相对寻址,将该单元中的内容与CX寄存器中的内容相加,结果存入CX寄存器中 (4)清除AX寄存器的内容,同时清除CF标志 (5)将字单元NUM与0B6H进行比较 5.按下列各小题的要求使用相应的几条指令完成其操作。 (1)将偏移量为200H的存储单元中的数与300H相加,结果存入AX寄存器中 (2)比较AX寄存器中与BX寄存器中的16有符号数,当AX中的内容大于BX中的内容时转移到L。 (3)将BUF1和BUF2中的16数据交换 (4)测试BUF字缓冲区中第15,如果为1则转移到P (5)将BUFI和BUF2的字相加,结果送S缓冲区 6.设BX=8234H,请说明下列两条指令的区别,执行下列各指令后BX中的内容是什么? SHR BX,1 SAR BX,1 7.分别说明下列每组指令中的两条指令的区别。 (1) MOV BX,BUF LEA BX,BUF (2) OR BL,0FH AND BL,0FH (3) JMP SHORT L JMP L (4) MOV AX,BX MOV AX,[BX] (5) MOV AX,[BX+DI] MOV AX,[BP+DI] 8.说明下列各指令的源操作数和目的操作数的存储地方。 (1)MOV [2000H],AX (2)ADD AX,[BX+5] (3)LEA SI,BUF (4)DAA (5)MUL BL 9.指出下列无条件转移指令的转移目标地址是什么?存放在何处? (1)JMP BX (2)JMP WORD PTR [BX] (3)JMP DWORD PTR [BX] (4)JMP P (5)JMP SHORT R 10.说明MOVSB和CMPSB各能使用哪些重复前缀? 七.程序分析题 1.现有程序段如下: MOV AX,1234H MOV BX,60H ADD AX,BX 请回答 :(1)该程序段完成的功能是什么? (2)程序段执行完后AX= 。 2.现有程序段如下: MOV AX,0603H MOV BL,8 AAD DIV BL 请回答 :(1)该程序段完成的功能是什么? (2)程序段执行完后AX= 。 3.设AX=0D023H,BX=9FD0H,试分析执行完如下程序段后程序转向何处? ADD AX,BX JNO L1 JNC L2 SUB AX,BX JNC L3 JNO L4 JMP L5 4. 程序段如下: MOV AX,X MOV DX,X+2 ADD AX,Y ADC DX,Y+2 ADD AX,36 ADC DX,0 SUB AX,Z SBB DX,Z+2 MOV W,AX MOV W+2,DX 请回答 :(1)该程序段完成的功能是什么? (2)该程序的操作数是何类型? (3)结果存放在何处? 5.设A为字节变量,变量中的内容分别为64H、52H;B为字节变量,变量中的内容分别为12H、46H,现有程序段如下: MOV AL,A SUB AL,B DAS MOV C,AL MOV AL,A+1 SBB AL,B+1 DAS MOV C+1,AL 请回答 :(1)该程序段完成的功能是什么? (2)最后结果是什么? 6.现有程序段如下: MOV BL,AL MOV CL,4 SHR BL,CL MOV A,BL AND AL,0FH MOV B,AL 请回答 :(1)该程序段完成的功能是什么? (2)如果AL的初值为56H,则A= ,B= 。 7.现有程序段如下: MOV AL,8 MOV BL,7 MUL BL AAM ADD AX,3030H XCHG AH,AL MOV BUF,AX 请回答 :(1)该程序段完成的功能是什么? (2)BUF两个单元中的值分别为 。 8.现有程序段如下: MOV AX,M MOV DX,N SHR DX,1 RCR AX,1 请回答 :(1)该程序段完成的功能是什么?     (2)若M=1234H,N=5678H,程序运行后DX= ,AX= 。 9.现有程序段如下: XOR AX,AX MOV AX,6342H MOV CX,0404H ROL AH,CL XCHG CH,CL ROR AL,CL 请回答 :(1)该程序段执行后AX= 。 (2)CF= 。 10.现有程序段如下: MOV AX,1 MOV BX,2 MOV CX,4 MOV DX,3 L: INC AX ADD BX,AX SHR DX,1 LOOPNZ L 请回答 :(1)该程序段的循环次数是多少? (2)该程序段执行完后AX= ,BX= ,CX= ,DX= 。 11.现有程序段如下: MOV CX,16 MOV BL,0 MOV DX,1 MOV AX,9AB8H L: TEST AX,DX JZ N INC BL N: SHL DX,1 LOOP L MOV M,BL 请回答 :(1)该程序段完成的功能是什么? (2)该程序段执行完后(M)= 。 12.现有程序段如下: CLD MOV SI,OFFSET BUF1 MOV DI,OFFSET BUF2 MOV CX,100 REP MOVSB 请回答:该程序段完成的功能是什么? 13. 现有程序段如下: CLD LEA DI,BUF MOV AL,20H MOV CX,100 REPNZ SCASB 请回答 :(1)该程序段完成的功能是什么? (2)若ZF=1,表示BUF中 值为20H数据 (3)若BUF的首地址为0,ZF=0,执行完该程序段后DI= 。 14.现有程序段如下: MOV AL,0 MOV BL,1 MOV CX,10 L: ADD AL,BL INC BL LOOP L 请回答 :(1)该程序段完成的功能是什么? (2)该程序执行完后,AL= 。 15.现有程序段如下: MOV AX,M CMP AX,N JA L MOV AX,M+2 CMP AX,N+2 JAZ L MOV BYTE PTR FLG , 0 JMP P L: MOV BYTE PTR FLG , 1 P: … 请回答 :(1)该程序段完成的功能是什么? (2)若M=1234H,N=5678H,则FLG= 。 16.现有程序段如下: MOV CX,100 LEA BX,BUF MOV DX,0 L1:MOV AL,[BX] CMP AL,10 JL L2 INC DX L2:INC BX LOOP L1 请回答 :(1)该程序段完成的功能是什么? (2)如果将JL改为JG,该程序段完成的功能又是什么? 17.设TAB中存放的数据为30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,现有程序段如下: LEA BX,TAB MOV AL,X ;X为数字0~9 XLAT 请回答 :(1)该程序段完成的功能是什么? (2)若X中的内容为4,则AL= 。 18.现有程序段如下: LEA SI,BUF1 LEA DI,BUF2 MOV CX,100 L: MOV AL,[SI+100] MOV [DI],AL INC DI DEC SI LOOP L 请回答:该程序段完成的功能是什么? 19.现有程序段如下: MOV AX,BUF CMP AX,0 JNS L MOV BX,BUF+2 NEG BX MOV BUF+2,BX NOT AX ADC AX,0 MOV BUF,AX L: … 请回答:该程序段完成的功能是什么? 20.现有程序段如下: MOV AL,X AND AL,0FH JZ L MOV BYTE PTR FLG,1 JMP M L: MOV BYTE PTR FLG,0 M: … 请回答:该程序段完成的功能是什么? 八.程序设计题 1.使用串操作指令,将BUF缓冲区中的100个字节清0。 2.比较5个字节的字符串A和B,若两个串相等则字节标志单元FLG置0;否则清1。 3.设BUF缓冲区中有100个字数据。编写程序段统计100个字数据中数据为0的个数,并将统计的结果存放在DL寄存器中。 4.计算Z=(X+5)*Y+30,(X,Y为无符号字节数据)。 5.将DX:AX:BX中的48数乘以2。 6.将有100个字符的缓冲区BUF中的$符号用空格(20H)代替。 7.将有符号的字数据A和B中的大者存入C中。 8.测字单元A中的第四是否为0,是则FLG置1,否则清0。 9.将DX:AX中的32数据逻辑左移2。 10.将100个元素的字数组A中的每个元素减1。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值