您的位置:首页 > 编程语言

汇编程序语言设计复习题整理

2011-11-27 14:57 148 查看
汇编复习题整理
1、80X86微型计算机的组织
1-10  写出下列十进制数的十六进制表示。
18  34  87  255  4095  62472
解:18=12H;34=22H;87=57H;
255=0FFH;4095=0FFFH; 62472=0F408H;

1-12	处理器的主要功能是实现所有指令的执行并处理数据。

1-14 指出处理器是如何存储的内存中的一个值
(a) hex 1234;       (b) hex 01c3b5
解:(a)高位地址  12H
低位地址   34H
地址	 内存
(b)高位地址    01H
0c3H
低位地址	0b5H
地址       内存

1-15:  说出段,偏移量,地址边界的定义:
解:
段:一个程序段边界上开始的部分,大小为64K,包含代码,数据,堆栈。
偏移量:是段边界上开始到段中其他位置的字节距离。
段边界:可以被16整除的位置;

1-18:  指出下列操作所需的寄存器:
(a) 段寻址; (b) 要执行的指令的偏移地址;
(c) 加法和减法操作;
(d) 乘法操作;
(d)乘法和除法操作;
(e)循环计数;
(f)标示结果为零。
解:(a)  CS,DS,SS;
(b)  IP;
(c)  AX,BX,CX,DX,DI,SI;
(d)  DX, AX;
(e)  CX;
f)  ZF

二、单选
1. 十六进制数88H可以被其他形式的数所表示, 下列哪种表示方法是错的?D
A. 无符号十进制136      C.压缩的BCD码 88
B. 带符号十进制–120      D. 带符号数据 –8
解:错误的是D选项,A选项 88=8*16^1+8=136,正确,B选项 带符号的十六进制
转换十进制方法:先将十六进制用二进制形式表示88H=10001000B,然后按位取反,末位加1 得01111000,再转换为十进制得-120,正确;C选项 正确。

2. 如果DH=10H, 执行NEG DH 指令, 正确的结果是(D. ).
A.  DH=10H   C=1           C. DH=10H    C=0
B.  DH=0F0H   C=0          D. DH=0F0H   C=1

3.哪个是指令指针寄存器? A
A.IP   B.SP  C.BP   D.PSW(program status word)

4.  如果 AX=1000H,
NEG  AX
NEG  AX
上面两条指令执行后, AX= (C ).
a.1001H    b.1002H    c.1000H    d.0F000H
解:指令NEG是取反的意思,两次取反自然为本身。故选C

2.2	有两个16位的字1EE5H 和 2A3CH 存储在IBM PC 的000B0H 和000B03H 的内存单元中,请以图表的形式说明内存中的存储情况。
解:
内存地址       内容
000B4H        2AH
000B3H        3CH
000B2H
000B1H        1EH
000B0H        E5H

2.3 如下图, 展示的是IBM PC的内存信息, 请说明30022H 字节单元和30024H字节单元的内容,和30021H 字单元和30022H 字单元的内容。
解:
存储器
30020H    12H       30022H字节单元的内容=0ABH
30021H    34H       30024H字节单元的内容=0EFH
30022H    ABH      30021H字单元的内容=0AB34H
30023H    CDH      30022H字单元的内容=0CDABH
30024H    EFH

2.4  3017:000A的段地址的物理地址和偏移量是什么? 3015:002A和3010:007A的段地址和偏移是什么?
解:段地址的物理地址是:3017AH;偏移量是:000AH
物理地址1:PA= 3017 × 10H + 000AH = 3017AH
物理地址2: PA= 3015 × 10H + 002AH = 3017AH
物理地址3: PA= 3010 × 10H + 007AH = 3017AH

2.5 运行程序之前, (CS)=0A7F0H,(IP)=2B40H, 程序的第一个字的物理地址是什么?
解:
PA=(CS)×10H+(IP)= 0A7F00H + 2B40H = 0AAA40H

2.8 哪类型的寄存器可以用来显示内存地址?
解:CS, DS, ES, SS, IP, SP, BP, BX, DI, SI,
EAX, EBX, ECX, EDX, EBP, EIP, ESP, EDI,

5. 假定DS = 5788H, 偏移量是94H, 字节的PA(物理地址) (A).
a.57974H    b.57914H
c. 5883H     d. 58ECH
解: PA=5788H*10H+94H=57974H

6.在段中寻址的时候,在8086CPU的寄存器中,哪些寄存器可以提供偏移地址(B)
A. AX, BX, CX, DX       C. SP, IP, BP, DX
B. BX, BP, SI, DI         D. CS, DS, ES, SS

概念总结:
CPU―-分析,控制并执行指令的部件,由算术逻辑部件ALU和寄存器组等组成。
存储器――存储程序,数据等信息的记忆装置,PC机有RAM和ROM两种。
堆栈――以后进先出方式工作的存储空间。
IP――指示 下一条要执行指令的地址。
SP――保存  当前栈顶地址的寄存器。
状态标志――记录指令操作结果的标志,共6位;OF,SF,ZF,AF,PF,CF.
控制标志――控制操作的标志,P机有三位,DF,IF,TF.
段寄存器――保存各逻辑段的起始地址的寄存器,PC机有4个:CS,DS,SS,ES.
物理地址――唯一代表存储空间中每个字节单元的地址。
汇编语言――用指令的助记符,符号地址,标号等符号书写程序的语言。
机器语言――能被计算机直接识别执行和的语言。
汇编程序――把汇编语言程序翻译成机器语言程序的系统程序。
连接程序――把若干个模块连接起来成为可执行文件的系统程序。
指令――告诉CPU要执行的操作(一般还要指出操作数的地址),在程序运行时执行。
伪指令――由汇编程序在汇编过程中执行的指令。

3.   调试
3-7  用DEBUG的E命令来进入下列的机器语言程序:
机器码(在00H中):A0 00 D0 E0 F6 26 01 02 A3 02 02 90
数据(在200H中):2A 12 00 00
程序的实现的功能如下:
把DS:0200(2A)中的一个字节的内容移到AL寄存器。
把Al 中的一个位移动到左边(结果是54。)
把在DS:0201中的一字节内容与AL相乘。
把结果从AX中移到 DS:0202的开始的字;
键入程序后,  键入D 命令来查看代码和数据。
键入R 和连续的T 命令来一步步运行程序直到到达NOP。
这时, AX 应该包含了结果05E8H。
键入另一个D DS:0200,且注意到在DS:0202 中的结果是E805。
调试:
-E CS:100  A0 00 02 D0 E0 F6 26 01 02 A3 02 02 90               ;输入E指令
-D CS:100 LC
1370:0100  A0 00 D0 E0 F6 26 01 02-A3 02 02 90               .....&......
-E DS:200 2A 12 00 00
-D DS:200 L4
1370:0200  2A 12 00 00
-R
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0100   NV UP EI PL NZ NA PO NC
0B41:0100 A00002        MOV     AL,[0200]                          DS:0200=2A
-T
AX=002A  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0103   NV UP EI PL NZ NA PO NC
0B41:0103 D0E0          SHL     AL,1
-T
AX=0054  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0105   NV UP EI PL NZ NA PO NC
0B41:0105 F6260102      MUL     BYTE PTR [0201]                    DS:0201=12
-0B41:0105 F6260102      MUL     BYTE PTR [0201]                   DS:0201=12
-T
AX=05E8  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0109   OV UP EI PL NZ NA PO CY
0B41:0109  A30202      MOV     [0202],AX                    DS:0202=0000
-T
AX=05E8  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=010C   OV UP EI PL NZ NA PO CY
0B41:010C 90            NOP
-D DS:202  L2
0B41:0200        E8 05

3-8  问题3-7, 键入命令进入写在硬盘上的程序HEXMULT.COM.
调试:
-U 100 10C
0B41:0100 A00002        MOV     AL,[0200]
0B41:0103 D0E0          SHL     AL,1
0B41:0105 F6260102      MUL     BYTE PTR [0201]
0B41:0109 A30202        MOV     [0202],AX
0B41:010C 90            NOP
-N HEXMULT.COM
-R BX
BX 0000
:0
-R CX
CX 0000
:000B
-W
Writing 0000A bytes

3-9. 用 DEBUG的A命令来进入下列指令:
MOV CX,3B
ADD CX,1C
SHL CX,01
SUB CX,36
NOP
反汇编这些指令跟踪指令的运行直到NOP. 并且对每条指令,都查看CX寄存器的值。
调试:
-A
0B41:0100 MOV CX,3B
0B41:0103 ADD CX,1C
0B41:0106 SHL CX,1
0B41:0108 SUB CX,36
0B41:010B NOP
-U 100 10B
0B41:0100 B93B00        MOV     CX,003B
0B41:0103 83C11C        ADD     CX,+1C
0B41:0106 D1E1          SHL     CX,1
0B41:0108 83E936        SUB     CX,+36
0B41:010B 90            NOP
-T
AX=0000  BX=0000  CX=003B  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0103   NV UP EI PL NZ NA PO NC
0B41:0103 83C11C        ADD     CX,+1C
-T
AX=0000  BX=0000  CX=0057  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0106   NV UP EI PL NZ AC PO NC
0B41:0106 D1E1          SHL     CX,1
-T
AX=0000  BX=0000  CX=00AE  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=0108   NV UP EI PL NZ AC PO NC
0B41:0108 83E936        SUB     CX,+36
-T
AX=0000  BX=0000  CX=0078  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B41  CS=0B41  IP=010B   NV UP EI PL NZ NA PE NC
0B41:010B 90            NOP

4. 语句
4-3. 两种类型的标示符是什么?
答案:是标号和名称。

4-4.下列哪些命名是正确的:
(a)  CX;  (b)25C4;  (c) @$_X;  (d)$25;  (e)AT&T.
如果不正确,解释原因
答案: 正确的命名是:
(c) @$_X  (d)$25
不正确:
(b)25C4 以数字开头
(e)AT&T &是非法字符
(a)CX 只再与CX 寄存器关联时是对的

4-9. (a) 解释过程的作用
(b) 怎么样定义一个过程的起始和结尾?
(c) 什么时候应该定义FAR过程?
(d)什么时候应该定义NEAR过程?
答案:
(a) 过程提供了相关的代码部分。
(b) 过程名 PROC
过程名 ENDP
(c) 在另一段中调用代码
(d)在同一段中调用代码

4-10. 哪些END语句与结束
(a)一个过程; (b)一个段; (c) 一个程序 相关?
答案: (a)ENDP 	(b)	ENDS	(c)	END

4-11.区分结束汇编过程和结束程序执行的语句.
答案: END表示汇编结束
MOV AX,4C00H  和 INT 21H 结束CPU的运行。

4-12. 把名称STKSEG, DATSEG, 和CDSEG分别分配给堆栈,数据段, 和代码段, 编写所需的ASSUME 语句.
答案:
ASSUME  SS:STKSEG, DS:DATSEG, CS:CDSEG

4-17.通过AREA5定义下列数据项中的名称为ARE1的数值。
分别是:
(a)一个1字节项包含的二进制数相当于十进制数35。
(b)一个双字包好着连续的数12,14,22,28,33和 41。
(c)一个 2字节的项 包含着未定义的值。
(d)一个 1字节的项 包含的十六进制相当于十进制数58。
(e)一个4字节的项包含的十六进制相当于十进制数436。
答案: (a) AREA1	DB	0010 0011B
(b) AREA2	DW	12,14,22,28,33,41
(c) AREA3	DW	?
(d) AREA4	DB	3AH
(e) AREA5	DD	1B4H

单选:
1.汇编程序的语句中,可以省略 (B  )
A. 名称    B. 操作符   C. 操作数   d.注释
2.正确结束伪指令的句子是( C):
A.汇编程序把伪指令翻译成机器代码。
B.伪指令在程序执行期间完成它的功能。
C.伪指令的功能是告诉汇编程序在汇编过程实现特殊的处理

3. 对于END 伪指令, 哪句话是对的?      C.
a.  END 伪指令是一个可执行指令。
b.  END 伪指令指明执行程序的终止之处。
c.  END 伪指令指明整个源程序的终止。
d. END 伪指令会在汇编过程生成机器码。

4.  执行下列指令后, 变量DAB 的内容是C
DAW   DW   2A05H
DAB   DB    0FAH
…
MOV  AL, BYTE  PTR  DAW
SUB  DAB,  AL
a. 0DAH     b. 0FAH     c.  0F5H    d.  0D0H

7.  BUF  DW  10H  DUP (3 DUP (2, 10H), 3, 5)
汇编了语句后, 变量BUF所分配的地址是  ( b).
a.  80H     b. 100H      c. 124H      d.  192H

1.  ARY  DW  10 DUP(?)
…
MOV  AL, TYPE ARY
MOV    BL, LENGTH  ARY
MOV    AL,  SIZE  ARY
一系列MOV指令运行后,结果是 ?
答案:    (AL)=2,   (BL)=10D,     (al)= 20D

填空:
1.	可汇编语句中,有两种类型的语句(指令语句) 和 (伪指令语句)
2.	ARY  DW  10DUP(?)
……
MOV  AL, TYPE  ARY   ;执行后(AL)= 2
MOV  CL, SIZE   ARY   ; 执行后(CL)= 20

分析程序
DA_BY  DB    83H, 73H, 61H, 94H, 5AH
MOV  CX, WORD  PTR  DA_BY
AND  CX, 0FH
MOV  AL, DA_BY+3
SHL  AL, CL
上述指令执行后,
AL=  A0H  ,CL=  03H

7.1 指令和伪指令的不同点?伪指令的功能是什么?
答案: 指令和伪指令的不同是是否生成可执行的机器码。
伪指令只是用来告诉汇编程序采取特殊的处理,不生成机器码。

7.3   数值表达式跟地址表达式的不同点?
答案: 数值表达式是一个值可以在汇编过程中被汇编程序计算的表达式。
地址表达式表征着操作数内存项的地址。

7.4   在汇编程序中,变量和标号的不同点?
答案:
标号表示机器指令码所在的内存位置;
变量表示着数值所在的内存位置;

7.5 计算下面表达式的值
①23H AND 45H OR 67		②1234H/16+10H
⑤LOW 1234H OR HIGH 5678H  ⑥23H SHL 4
答案:
① 43H       ②	133H
⑤ 76H	      ⑥	230H

7.7 如果有如下的一个程序段. 写出运行后AX寄存器的内容
ORG	100H
100 VARW	DW		1234H,5678H
104 VARB 	DB		3,4
106 VARD 	DD		12345678H
10A BUFF 	DB		10 DUP(?)
114 MESS 	DB		‘HELLO’
119 BEGIN:      MOV  AX,OFFSET VARB+OFFSET MESS	;218H
MOV  AX,TYPE BUFF+TYPE MESS+TYPE VARD ;6H
MOV  AX,SIZE VARW+SIZE BUFF+SIZE MESS ;0DH
MOV  AX,LENGTH VARW+LENGTH VARD ;2H
MOV  AX,LENGTH BUFF+SIZE VARW	 ;CH
MOV  AX,  TYPE  BEGIN	         ;-1
MOV  AX,  OFFSET BEGIN	         ;119H

选择:
3.  对于END 伪指令, 那一句是对的?
a.  END 伪指令是一个可执行指令。
b.  END 伪指令指明执行程序的终止之处。
c.  END 伪指令指明整个源程序的终止。
d. END 伪指令会在汇编过程生成机器码
答案:C

3. DATA    SEGMENT
ORG  20H
NUM1 =  8
NUM2 =  NUM1 + 10H
DA1       DB  ‘COMPUTER’
DB	 0AH, 0DH
COUNT    EQU  $-DA1
DA2      DW   ‘CO’, ‘MP’, ‘UT’, ‘ER’
DATA     ENDS
答案:   (1) DA1的偏移量是20H
(2) COUNT的值是10D
(3) DA2的内容+2 字节的位置是 P

4.  DA3	    EQU    WORD PTR	 DA4
DA4	    DB 	   0ABH, 89H
…
SHR    DA3, 1
MOV  DX,   DA3
SHL    DA4, 1
MOV  CX, DA3
程序执行之后:
CX= 44AAH,  DX=44D5H

7.12如下程序段中有几个语句. 解释每一个符号的属性。

SYMB1  LABEL  BYTE
SYM2   EQU  THIS  BYTE
SYMB3  DW ?
SYMB4  EQU  BYTE  PTR  SYMB3

答案:  SYMB1     BYTE
SYM2      BYTE
SYMB3     WORD
SYMB4     BYTE

4.7 请定义一个数据段DATASG, 在段中定义字符变量和数据变量,要求如下:
(1) FLD1B 是一个字符变量: ’personal computer’;
(2) FLD2B十进制数的字节变量 32;
(3) FLD6B 10 个0的字节变量;
(4) FLD7B 是一个硬件名称的列表 (ASCII code) 和数量(十进制数)
(10)FLD3W 是(7)中硬件列表地址变量。
(11)FLD4W 是一个字变量包含5 个十进制数:5,6,7,8,9;
(13)FLD6W 是段中字节数据变量地址和字数据变量地址之差。

答案:	DATASG		SEGMENT
FLD1B	DB	‘personal computer’
FLD2B	DB	32
FLD6B  DB	10 DUP(0)
FLD7B	DB	‘PART1’,20,’PART2’,50,’PART3’,14
FLD3W	DW	FLD7B
FLD4W	DW	5,6,7,8,9
FLD6W	DW	FLD3W-FLD1B

4.8  有一个数据段如下定义,PLENTH的值是多少? 意味着什么?
PARTNO	DW		?
PNAME	DB		16	DUP(?)
COUNT	    DD		?
PLENTH	EQU	$-PARTNO

答案: 值是22.相对PARTNO的偏移量

4.9  如下有几个语句,问: L的值?
BUFF	DB	1,2,3,’123’
EBUFF 	DB	0
L       EQU	EBUFF-BUFF

答案:L的值是6

4.10    有如下数据段。
(1) 用MOV 指令把LNAME的有效地址移到AX。
(2) 用一条指令来移动CODE_LIST前两个字节的内容到SI。
(3) 编写伪指令让CODE_LIST的与段得长度相等.
LNAME       DB  30 DUP (?)
ADDRESS     DB  30 DUP(?)
CITY         DB  15 DUP(?)
CODE_LIST   DB  1,7,8,3,2
答案:
(1) MOV  AX, OFFSET  LNAME
(2) MOV  SI , WORD PTR CODE_LIST
(3) CODE_LENTH  EQU   $-CODE_LIST

4.11 尝试写出整个数据段DATA_SEG, 它把5赋给一个字节, 且把整数–1,0,2,5 和4 放入10个字的数组DATA_LIST的前5个单元 。然后写出整个代码段, 功能是把DATA_LIST的前5 个数中的最大值和最小值放到 MAX 和 MIN。
答案:    DATA_SEG     SEGMENT
DATA1        DB  5
DATA_LIST    DW  -1,0,2,5,4, 5 DUP(?)
MAX          DB  ?
MIN          DB  ?
DATA_SEG    ENDS
CODE_SEG    SEGMENT
ASSUME   DS:DATA_SEG,CS:CODE_SEG
BEGIN:      MOV  MAX, 5
MOV  MIN, -1
CODE_SEG    ENDS
END  BEGIN

6-1.寻址
3.1 给出(BX)=637DH,(SI)=2A9BH,偏移量D=7237H,尝试指出下列每一种寻址模式的有效地址。
(1) 立即寻址;
(2) 直接寻址
(3) 用BX的寄存器寻址;
(4) 用BX的寄存器间接寻址;
(5) 用BX的寄存器相对寻址;
(6) 基址变址寻
(7)相对基址变址寻
答案:(1)无
(2)EA=7237H
(3)无
(4)EA=637DH
(5)EA=D+[BX]=7237H+637DH=0D5B4H
(6)EA=[BX]+[SI]=637DH+2A9BH=8E18H
(7)EA=D+[BX]+[SI]=7237H+637DH+2A9BH=1004FH

3.2  根据下列要求, 写出相关的汇编语言指令。
(1) 把BX 的内容和DX 的内容相加,结果放入DX 中。
(2) 把AL的内容加上内存地址的内容,并把结果放到AL中。内存地址由BX和SI进行基址变址寻址所得。
(3)把CX的内容加上内存地址的一个字,并把结果放到内存地址中。内存地址由BX和偏移量0B2H进行寄存器相对寻址所得。
(4) 把内存地址的内容与数2A59H相加,并把结果放入内存地址。内存地址由偏移量0524H进行直接寻址所得。
(5) 把数值0B5H 与AL 寄存器的内容相加, 结果放入AL寄存器。
答案:  (1)ADD  DX, BX
(2)ADD  AL, BX[SI]
(3)ADD  WORD PTR 0B2H [BX], CX
(4)ADD  WORD PTR [0524H], 2A59H
(5)ADD  AL, 0B5H

3.3 写出指令,把首址是BLOCK的字数组中的第六个字移入DX寄存器。使用如下的寻址方式。
(1) 寄存器间接寻址
(2) 寄存器相对寻址
(3) 基址变址寻址

答案:
(1) LEA  BX, BLOCK+10
MOV  DX, WORD PTR [BX]
(2) LEA  SI, BLOCK
MOV  DX, WORD PTR 0AH[SI]
(3)LEA  BX, BLOCK
MOV  SI, 0AH
MOV  DX, WORD PTR [BX][SI]

3.4给出(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
(3) MOV  AX, [1200H]
(5) MOV  AX, 1100[BX]
(7) MOV  AX, 1100[BX][SI]

答案:
(1) (AX)=1200H
(3)(AX)=4C2AH
(5)(AX)=4C2AH
(7)(AX)=65B7H

3.8 给出(DS)=2000H,(ES)=2100H,(SS)=00A0H,(BX)=0100H,(BP)=0010H,数据段中VAL 的偏移地址是0050H,指出源操作数段得寻址方式和物理地址。
(2) MOV  AX, BX
(4) MOV  AX, VAL
(6) MOV  AX, ES:[BX]
(8) MOV  AX, [SI]
(10)MOV  AX, VAL[BX]
(12)MOV  AX, VAL[BX][SI]

答案:
(2)寄存器寻址
(4)直接寻址,物理地址=20050H
(6)寄存器间接寻址,物理地址=21100H
(8)寄存器间接寻址,物理地址=200A0H
(10)寄存器相对寻址,物理地址=20150H
(12)相对基址变址寻址,物理地址=201F0H

6-2
单选:
1.当执行POP [BX] 和寻找目标操作数时,段地址跟偏移地址是在( B )中。
a. 无段地址也无偏移地址
b. DS 和BX中
c. ES 和 BX中
d. SS 和 SP中

2.下列指令中, 哪个是错的?
a.  MOV  SS:[BX+DI],1000H
b.  MOV  DX, 1000H
c.  MOV  WORD PTR [BX],1000H
d.  MOV  DS, 2000H

答案:
d. 错误:  立即数到段寄存器

编写指令:
1. D1   DB  20H  DUP(?)
D2   DW  D1
给出三种方式,使用一条指令来把D1的偏移量载入到SI中。
答案:
1. LEA    SI,   D1
2. MOV   SI,  OFFSET  D1
3. MOV   SI, D2

简答:

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
解:
1)MOV  AH, BX                ;操作数大小不同
2)MOV  [BX], [SI]              ;出错:内存到内存
3)MOV  AX,[SI] [DI]           ;出错: 把[SI][DI]放到一起
4)MOV  MYDAT [BX][SI], ES:AX    ; 与2同,
5)MOV  BYTE  PTR[BX], 1000      ; 与1同,
6)MOV  BX, OFFSET MYDAT[SI]     ;删除[SI]
7)MOV  CS, AX                ;出错: CS 是第一操作数

填空:
.MODE  SMALL
.DATA
DFATA1   DW	2000H
DATA2    DW	3000H
.CODE
.STARTUP
LEA     SI,DATA1
MOV	DI,  OFFSET	DATA2
MOV	BX,	[SI]
MOV	CX,	[DI]
MOV	[SI],	CX
MOV	[DI],	BX
.EXIT
END
程序执行之后, (DATA1) = 3000H
(DATA2) = 2000H

3.10 TABLE 是一个在数据段中0032上的符号, 它的内容是1234H, 下面指令有什么不同?执行指令后AX寄存器的内容是什么?

MOV  AX, TABLE
LEA  AX,TABLE

答案:    (AX)=1234H
(AX)=0032H

3.11  执行下列指令后AX 寄存器的内容是什么?
TABLE 	DW		10,20,30,40,50
ENTRY  DW 	3
…
……
MOV   BX,OFFSET TABLE
ADD	BX ENTRY
MOV	AX [BX]
(BX)=0000H
(BX)=0003H
答案:   (AX)=1E00H

7.8 下列指令中,符号ABCD 是一个变量。说出两条指令的不同。
MOV  AX,OFFSET ABCD
LEA   AX,ABCD
答:两条指令都是取ABCD的偏移地址
但MOV指令能以更少的时间完成同样的功能。

7.10 如下的一个程序段。请改正错误的指令。
VARW	DW	 1234, 5678H
VARB	DB	 3,4
VARD	DD	 12345678
……
MOV	AX,VARB
MOV	VARD,BX
MOV	VARD+2,ES
MOV	CL,VARW+3
LES		DI,VAFW
改正如下:
MOV  AX , WORD PTR VARB
MOV  WORD PTR VARD ,  BX
MOV  WORD PTR VARD+2 , ES
MOV  CL , BYTE PTR WARW +3

8-1 、编程逻辑和控制要求
8-2
(a) 一个近 JMP, LOOP, 和条件跳转指令可以跳转的字节的最大值是什么?  (b) 机器代码的操作数的什么特点导致了这种限制??
答案:
(a)JMP:两操作数字节.
LOOP:一个操作数字节
条件跳转:一个操作数字节

8-3一条JMP指令从偏移位置05C8H开始。指出JMP 的操作数跳转的偏移地址, 基于下列目标代码: (a) 14H;(b)  7DH;(c)  A3H
答案:
(a)05C8H+0014H+2H=05DEH.
(b)05C8H+007DH+2H=0647H.
(c)05C8H+FFA3H+2H=056DH.

8-5 假定AX 和BX 包含了无符号数据且 CX 和 DX包含了带符号数据。指出下列所需的CMP (必要时)和条件跳转指令 :
(a) AX 等于或小于BX ?
(b) CX等于或小于DX?
(c) CX 的值大于 DX?
(d) AX 的值大于BX?
(e) DX 包含零吗?
(f)有溢出吗?
答案:
(a)CMP AX, BX
JBE   Address
(b)CMP  CX, DX
JLE   Address
(c)CMP  CX, DX
JG    Address
(d)CMP AX, BX
JA   Address
(e)CMP  DX, 0
JE    Address

(f)JO    Address

8-10 在一个.EXE 程序中, F10 调用G10, G10 调用H10, H10 调用J10.因为这些调用,堆栈中现在包含多少个地址?
答案:3 个地址

8-13 假定BX 包含二进制10111001 10111001 和CL 包含3. 指出下列指令运行后BX的十六进制值 :
a) SHL BL 1;
b) SHL BX,CL;
c) SHR BX,CL;
d) SHR BX,1;
e) SAL BH,1;
f) ROR BX,CL;
g) ROR BL,CL
答案:
a)B972H(BL逻辑左移一位)
b)0CDC8H(BX逻辑左移3位)
c)1737H(BX逻辑右移3位)
d)5CDCH(BX逻辑右移1位)
e)72B9H(BX算术左移1位)
f)3737H(BX循环右移3位)
g)B937H(BL循环右移3位)

8-14 用移位, 移动, 和加法指令来以40H初始化CX 并且乘于10.
答案:
MOV CX, 40H
MOV AX, CX
MOV BX, CX
MOV  CL, 3
SHL  AX, CL
SHL  BX, 1
ADD AX, BX

8-15    命名为“旋转位”的章节末尾有一个例子,把DX:AX乘于2。修改这个程序a) 乘于4 b) 除于4 c) 把DX:AX:BX中的48位乘于2。
答案:
a)  SHL AX, 1
RCL DX, 1
SHL AX, 1
RCL DX, 1
b)  SAR DX, 1
RCR AX, 1
SAR DX, 1
RCR AX, 1
c)  SHL BX, 1
RCL AX, 1
RCL DX, 1

2.假定VAR1 和 VAR2 是字变量, LAB 是标号, 指出下列的错误:
ADD VAR1,VAR2
SUB  AL, VAR1
JMP   LAB[SI]
JNZ   VAR1
JMP   NEAR  LAB
错误:
1.ADD 内存, 内存
2. 两个操作数大小不同
3.删除[SI] 或者 删除 LAB
4. 条件跳转范围<= 字节, 不是字
5.  应该是JMP NEAR PTR LAB

3、A DW 1234H
B DW 5678H
……
PUSH A
PUSH B
POP A
POP B
回答:
① 执行之后(A)=5678H ,( B)= 1234H
② 执行程序之前SP=200H,
执行之后SP= 200H

8-2
分析指令:
1、MOV AX,6540H
MOV DX,3210H
MOV CL,04
SHL DX,CL
MOV BL,AH
SHL AX,CL
SHR BL,CL
OR DL,BL

执行指令之后,
(AX)=5400H,(BL)=06H,
(DX)=2106H

2、MOV AL,200
SAR AL,1
MOV BL,AL
MOV CL,2
SAR AL,CL
ADD AL,BL
执行指令之后
(BL)=0E4H
(AL)=0DDH

3 .BLK1 DB 46,84,34,-5,20,122,73
MOV CX,7
LEA S1,BLK1
NEXT: MOV AL,[SI]
INC SI
TEST AL,81H
LOOPZ NEXT
MOV BL,[SI]

执行指令之后:
(AL)=0FBH(BL)=20 / 14H

6、
AND  AL,AL
JZ    BRCH1
RCR  AL,1
JZ    BRCH2
RCL  AL,1
INC  AL
JZ   BRCH3
执行指令之后, 回答:
(1)当(AL)=0时,程序跳到BRCH1
(2)当(AL)=1时,程序跳到BRCH2
(3)当(AL)=0FFH时,程序跳到BRCH3

12.串
单选:
1.当在串指令之前使用REPE 立即前缀时,当 (C),串指令将会停止。
A.   CX=0 and ZF=0		B. CX=0 and ZF=1
C.   CX=0  or  ZF=0		D. CX=0  or  ZF=1
2.下列哪条指令有合理和充分的意义?   D
A.   REP LODSB			B.  REP SCASB
C.   REP CMPSB      		D.  REP MOVSB

13.算术
13.1
对于无符号和带符号的数据。(a)字节的最大值是什么(b)字的最大值是什么?
答案:
(a):对于带符号数据:+127and128;
对于无符号数据:0 and 255
(b):对于带符号数据:-32768 and 32767
对于无符号数据:0 and 65535:

13-2 区分算术操作的进位和溢出。
答案:
C 位代表无符号数据的溢出;
C=1,有进位/借位;  其他情况C=0。
O 代表带符号数据的溢出。
加法: 当两个操作数的符号相同,但是结果的符号与操作数不同时,O 位被置位 (O=1)。其他情况O = 0。
减法: 如果两个操作数符号不同, 结果和减数的符号相同,那么O =1;其他情况 O = 0。

13-3     对于下列的二进制加法, 指出二进制的和作为带符号和无符号的十进制的和, 指出溢出标志和进位标志的值:
a)   0011 0011 + 0001 1000
b)   0111 0110 + 0001 1001
c)   1101 0110 + 0101 1001

答案:
a          b              C
Sum   0100 1011    1000 1111     0010 1111
CF       0		 0         1
OF       0	         1	   0

13.5编写代码:
a): 字VALUE1 和字VALUE2相加;
MOV AX, VALUE2
ADD AX, VALUE1

(b): 以VALUE1开始的双字 和双字VALUE2相加;
MOV EAX, VALUE1
ADD EAX, VALUE2

13.7 编写代码(MUL)
(a)  字VALUE1 和VALUE2相乘;
MOV AX, VALUE1
MUL VALUE2
(b) 以VALLE1开始的双字 与字VALUE2相乘;
MOV  AX, VALUE1
MUL  VALUE2
MOV  RESULT, AX
MOV  RESULT+2, DX
MOV  AX, VALUE1+2
MUL  VALUE2
ADD  RESULT+2, AX
ADC   RESULT+4, DX
ADC   RESULT+6, 0

13.8编写代码(DIV) :
(a): 字VALUE1 除于36;
MOV AX, VALUE1
MOV BL, 36
DIV BL
(b): 以双字开始的VALUE1 除于字VALUE2;
MOV   AX, VALUE1
MOV   DX, VALUE1+2
DIV     VALUE2

13.9
除了除以零之后,除以什么数会导致溢出错误?
答案: 除数必须比被除数小。例如除于1,如除以1生成一个商数,是与被除数相同,也可能导致中断和溢出错误。

3.40   分析下列代码段:
ADD  AX, BX
JNO   L1
JNC   L2
SUB   AX, BX
JNC   L3
JNO   L4
JMP   SHORT L5
AX的内容和CX的内容如下 :
AX       BX
B568      54B7
程序执行后,会跳转到哪里?
答案:
L1
L3

3.47           指令填空:
(1) LOOP  L20    (2)LOOPE  L20      (3)LOOPNE  L20
尝试指出在3个不同情况下,程序执行之后AX,BX,CX,DX 寄存器的内容 ?
TITLE          EXLOOP.COM
CODESG      SEGMENT
ASSUME CS: CODESG, DS: CODESG,SS:CODESG
OGR     100H
BEGIN:      MOV   AX, 01
MOV   BX, 02
MOV   DX, 03
MOV   CX, 04
L20:        INC   AX
ADD   BX, AX
SHR   DX, 1
(   )
RET
CODESG     ENDS
END     BEGIN
答案: (1) LOOP  L20 :AX=05H ; BX=10H ; CX=00H ; DX= 00H
(2) LOOPNE  L20: AX=03H; BX=7H; CX=2H ; DX=00H
(3)LOOPE  L20:没有进行循环
AX=02H; BX=4H; CX=3H; DX=1H

4-1  写出ADD指令,完成如下操作:
(a)  把BX 加到AX
ADD AX, BX
(b) 把 12H加到AL
ADD AL, 12H
(c ) 把 EDI 加到 EDP
ADD EDP, EDI
(d) 把22H 加到 CX
ADD CX. 22H
(e) 把SI的地址数据加到AL
ADD AL, [SI]
(f)把CX 加到FROG地址的数据上
ADD FROG, CX

4.2 指出指令ADD ECX,AX的错误?
答案:  ECX 和AX的大小不一致。

4.3 可以用ADD 指令把CX 加到DS吗?
答案:  不可以,因为DS是段寄存器。

4.4   给出AX=1001H,DX=20FFH,执行ADD AX,DX后,列出标志寄存器的总和和每一位的内容。

答案:
AX=3100H;
C=0;最高位没有进位
A=1;第三和第四位没有进位
S=0;结果为正
Z=0;结果非零
O=0;结果没有溢出

4.6 设计一个简短的程序,把AX,SX,CX,DX 和SP 累加在一起,把结果存进DI中。

LEIJIA  PROC  NEAR
ADD  AX, BX
ADD  AX, CX
ADD  AX, DX
ADD  AX, SP
MOV  DI, AX
RET
LEIJIA ENDP

4.9	写出把sp的内容加1的指令。
指令:INC SP

4.10 写出SUB 指令,完成如下操作。

(a) 从AX中减去BX
指令:SUB AX, BX
(b) 从 DH中减去 0EEH
指令:SUB DH, 0EEH

4.11 解释SBB [DI-4],DX的结果
答案: 从由DI-4寻址的内存单元中,减去CX,同时也减去借位。

4.12 解释SUB 和CMP指令的不同
答案: 指令SUB的功能是 从源操作数减去目标操作数,然后把结果存储到目标操作数,
而CMP指令并不会改变两个操作数的内容,只会改变标志位 。

4.13 当8-位 操作数加上另外一个数,结果存在哪里?
答案: 在AX 寄存器中。

4.14 MUL EDI 的结果存在哪里?
答案 :在EDX-EAX中。

4.15 当8-bit 操作数被除时,结果存在哪里?
答案: AX.

4.16    写一个简短的程序, 把BL中的数据除以CL中的数据, 然后把结果加上2,最后的结果存在 DX中, 是16-位数。

答案:
MOV AL, BL
MOV AH, 0
DIV CL
MOV AH, 0
ADD AX, AX
MOV DX, AX
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: