复习题1:
1、指出下列指令的错误
(1)MOV AH,BX
(2)MOV [BX],[SI]
(3)MOV AX,[SI] [DI]
(4)MOV MYDAT [BX] [SI],ES:AX
(5)MOV BYTE PTR [BX],1000
(6)MOV BX,OFFSET MYDAT[SI] 
(7)MOV CS,AX
(8)SAL AL, 5
答案:
(1)MOV AH,BX 源操作数与目的操作数长度不相同
(2)MOV [BX],[SI] 这是两个内存单元在传递数据,而这在汇编语言中是不允许的。不允
许两内存单元同时作为源操作数和目的操作数进行运算
(3)MOV AX,[SI] [DI] 不能用两个变址连用,其中一个应为基址BX或BP
(4)MOV MYDAT [BX] [SI],ES:AX 同(2)
(5) MOV BYTE PTR [BX],1000源操作数与目的操作数长度不相同,1000D=3E8H
(6)MOV BX,OFFSET MYDAT [SI]  OFFSET不能与复杂操作数相连
(7)MOV CS,AX ,不能对CS赋值
(8)MOV CL,5
      SAL AL,CL
2、下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量)
(1)CMP 15,BX
(2)CMP OP1,25
(3)CMP OP1,OP2
(4)CMP AX,OP1
答案
(1)非法  (2)合法  (3)非法  (4)非法
3、假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么?
(1)MOV  BP,AL
(2)MOV  WORD_OP [BX+4*3] [DI],SP
(3)MOV  WORD_OP1, WORD_OP2
(4)MOV  AX, WORD_OP1 [DX]
(5)MOV  SAVE_WORD, DS
(6)MOV  SP, SS:DATA_WORD [BX] [SI]
(7)MOV  AX, [WORD_OP1+WORD_OP2]
(8)MOV  AX, [WORD_OP1-WORD_OP2+100]
(9)MOV [WORD_OP1], [WORD_OP1-WORD_OP2]
答案:
(1)非法,操作数类型不同。
(2)合法。
(3)非法,不允许两个内存单元直接传递数据。
(4)非法,DX不可以用作基址。
(5)合法。
(6)非法,SS不可以作段跨越前缀。
(7)合法。
(8)合法。
(9)非法,不允许两个内存单元直接传递数据。不允许两内存单元同时作为源操作数和目的操作数进行运算
4、假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。
(1)ADD  VAR1,VAR2
(2)SUB  AL,VAR1
(3)JMP  LAB [SI]
(4)JNZ  VAR1
(5)JMP  NEAR  LAB
答案:
(1)不允许两内存单元同时作为源操作数和目的操作数进行运算
(2)操作数类型不同
(3)跳转指令只能转到符号地址
(4)转移指令后不能为变量,只能为标号
(5)格式不对,应为 NEAR PTR。
补充题
5、指出下列指令中的错误,并改正。
(1) MOV BL, 30A0H            (2) MOV 0010H, AL
(3) XCHG AL, BX              (4) MOV [AX], 3456H
(5) PUSH AL                  (6) POP CS
(7) MOV DS, 1000H            (8) MOV [BX], [1000H]
(9) LDS (BX), [1000H]          (10) LEA BX, CX
答:
(1)数据类型不一致,改为:MOV BX,30A0H
(2)0010H是个立即数,既不是一个内存单元的地址,也不是个寄存器
    改为:MOV [0010H],AL
(3)数据类型不一致,改为:XCHG AX, BX
(4)这是寄存器间接寻址,只能使用基址变址寄存器。而且需要指定为字类型
改为:MOV WORD PTR [SI], 3456H
(5)PUSH指令是压入堆栈两个字节的操作。改为: PUSH AX
(6)不能对CS进行直接修改, 改为:POP CX
(7)不能对段寄存器直接赋值,而只能通过累加器来赋值
    改为: MOV AX, 1000H
              MOV DS, AX
(8)存储器的两个单元之间不能同时作为源操作数和目的操作数参与运算
        改为:MOV AX, [1000H]
                MOV [BX], AX
(9)没有()这种指令
        改为:LDS BX, [1000H]
(10)源操作数必须是内存单元,寄存器不能给出地址
      改为:LEA BX, [CX]  = MOV BX,CX
复习题2
5、假设程序中的数值数据定义如下,
DATA1  DW  25D3H
DATA2  DB  16  DUP(?)
DATA3  DD  2A004455H
DATA4  EQU  $ - DATA1
试画出这些数值数据在内存中的存储示意图,并DATA4的值是多少?它表示什么意义?
答案:
DATA1
DATA2
DATA3
D3H
25H
?
16个 ?
?
55H
44H
00H
$  
2AH
DATA4 的值为22,表示该数据段的长度.
注意:$ 为地址计数器的值,用来保存当前正在汇编的指令的偏移地址。
6、有字符型数据定义语句如下 :
K1  DB  ?,?,?,‘123’
K2  DB  ‘ABC
L  EQU  K2 K1
试画出这些字符数据在内存中的存储示意图,并L的值是多少?它表示什么意义?
答案:
K1
K2
?
?
?
31H
32H
33H
41H
42H
43H
L的值为6,即为K1数据区的长度。
注意:请考试时准备一个ASCII码表
7. 定义数据段如下,试画出数据存储示意图,并说明X1和X2所对应的逻辑地址各是多少?
DATA SEGMENT AT 10A0H
  ORG 0010H
  X1 DB 22, 33
  ORG $+0020H
  X2 DB ‘AB12CD’
DATA ENDS
答: 
22H
33H
$
X2  10A0H:0032H
41H
42H
31H
32H
43H
44H
8.定义数据段如下,写出执行以下指令后的结果
DATA SEGMENT
    DA1  DW  2437H, 14A2H
    DA2  DB    ‘ABCD’
    DA3  DB  10 DUP(?)
DATA ENDS
(1)MOV BX, DA1                ; (BX)=   2437H   
(2)MOV SI, OFFSET DA1          ; (SI)=   0000H   
(3)MOV AL, TYPE DA1            ; (AL)=     2     
(4)MOV AL, [DA2+02H]          ; (AL)=       43H     
(5)MOV AL, LENGTH DA3        ; (AL)=     10     
(6)MOV AL, SIZE DA3            ; (AL)=     10       
9. 程序中数据段定义的数据如下:
DATA SEGMENT
汇编指令有多少个
NAMES  DB ‘GOOD MORNING’
DW 2050H, 78H, 3080H
DATA ENDS
请指出下列指令系列执行后累加器中的结果是多少?
(1)MOV BX, OFFSET NAMES
MOV AL, [BX+03H]
(2)MOV BX, 12
MOV SI, 3
      MOV AX, NAMES [BX+SI]
(3)MOV BX, 12
MOV SI, 3
LEA AX, NAMES [BX+SI]
答:
(1)(AL)=44H
(2)(AX)=0078H
(3)(AX)=000FH
复习题3
10. 试分析下列两个程序段执行的功能
(1)  CLD            ;方向标志置为加1
        LEA DI, [0406H]        ;(DI)=0406H
        MOV CX, 0010H        ; 设置循环次数为16次
        XOR AX, AX        ;AX清零
        REP STOW        ;循环传送AX的值到DI所指向的内存空间
(2)  CLD                    ;方向标志置为加1
        MOV CX, 10            ; 设置循环次数为10次
        LEA SI, FIRST            ;把FIRST数据区的首地址 SI
        LEA DI, SECOND        ;把SECOND数据区的首地址 DI
        REP MOVSB        ;循环传送10次
答:(1)功能:将起始偏移地址为0406H的16个内存单元清零。
  (2)功能:将FIRST数据区的10个数据拷贝到SECOND数据区中去
11. 阅读下列程序段,并说明程序的功能
        LEA BX, ARRAY        ;
        LEA DI, RESULT
        MOV CL, 4
AGAIN:    MOV AL, [BX]
        TEST AL, 80H
        JZ NEXT
        XOR AL, 0FFH     
      INC AL
NEXT:    MOV [DI], AL
        INC BX
        INC DI
        DEC CL
        JNZ AGAIN
答:把ARRAY数据区里的四个字节取出来,判断是不是负数,如果是负数就把它变成正数,如果是正数就不处理,最后把这些数再存放到RESULT数据区里去。
注意:这里负数是按照补码来表示
12. 阅读下列程序,写出程序执行后的结果。
DATA SEGMENT AT 3000H
BLOCK DB 00H,12H,35H,64H,41H

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。