汇编复习题整理
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