2011-11-21
汇编语言第01章习题(80X86微型计算机的组织)
1-12 在实模式操作下,段寄存器的用途是什么?
答:段寄存器是用来定义数据段得起始地址的。在实模式下,它定义一个最大64KB存储段的起点。
1-15 实模式存储器地址允许访问低于哪个地址的存储区?
答:在实模式下,存储器寻址允许访问低于FFFF:FFFF地址的存储区。
1-18堆栈存储器由(堆栈)段加(堆栈指针)偏移的组合来寻址
1-19如果用基指针(BP)寻址存储器,则寻址的数据在(段)中
1-20 80286工作在实模式下,给出下列寄存器组合所寻址的存储单元地址。
(a)DS=1000H 和 DI=2000H 12000H
(b)DS=2000H 和 SI=1002H 21002H
(c)SS=2300H 和 BP=3200H 26200H
(d)DS=A000H 和 BX=1000H A1000H
(e)SS=2900H 和 SP=3A00H 2CA00H
▲十六进制数88H可以被其他形式的数所表示, 下列哪种表示方法是错的? D
A. 无符号十进制136 C. BCD码 88
B. 带符号十进制–120 D. 带符号数据 –8
▲如果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
▲哪个是指令指针寄存器?A
A.IP B.SP C.BP D.PSW (程序状态字)
▲如果 AX=1000H, NEG AX; NEG AX;
上面两条指令执行后, AX= ? C
a.1001H b.1002H c.1000H d.0F000H
[ 解释:NEG是汇编指令中的求补指令,NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1。]
汇编语言第02章习题(寻址方式与汇编语言程序的组织)
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
30021H 34H
30022H ABH
30023H CDH
30024H EFH
解:(遵照高高低低的原则)
字节:30022H字节单元的内容=0ABH
30024H字节单元的内容=0EFH
字:30021H字单元的内容=0AB34H
30022H字单元的内容=0 CDABH
2.4 3017:000A的段地址的物理地址和偏移量是什么?
3015:002A和3010:007A的段地址和偏移是什么?
解:(物理地址及偏移地址的计算方法)
物理地址1:PA= 3017 × 10H + 000AH = 3017AH
物理地址2: PA= 3015 × 10H + 002AH = 3017AH
物理地址3: PA= 3010 × 10H + 007AH = 3017AH
2.5 运行程序之前, (CS)=0A7F0H,(IP)=2B40H, 程序的第一个字的物理地址是什么?
解:(程序每次执行指令的地址的是CS:IP)
PA=(CS)×10H+(IP)= 0A7F00H + 2B40H = 0AAA40H
2.6 在内存中,每一段都顶多有10000H字节。下面是用DEBUG的命令“r”来在终端上展示寄存器的内容。请以图表的形式显示内存是如何划分成段的,还有OF,SF,ZF,CF的值。
终端显示的内容:
AX=0000 BX=0000 CX=0070 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=10E4 ES=10F4 SS=21F0 CS=31FF IP=0100 NV UP DI PL NZ NA PO NC
解:此时 OF,SF, ZF, CF 都为0。
(几乎是每10000H就划分一个段)
10E40-10F40-数据段
10F40-20F40-附加段
21F00-31F00-堆栈段
31FF00-41FF0-代码段
2.8哪类型的寄存器可以用来显示内存地址
解:CS, DS, ES, SS, EAX, EBX, ECX, EDX, EBP, EIP, ESP, EDI, IP, SP, BP, BX, DI, SI
2.9 CPU--分析,控制和运行指令的组件, 包含 算术逻辑单元和一组寄存器。
内存――内存存储过程,数据等等, PC中,有RAM 和ROM
Stack――存储空间,以后进先出的方式工作。
IP――存储下一条要运行的指令
SP――存储当前栈顶地址的寄存器
状态标志位――变址位记录指令运行的结果, 包含6 个位, OF,SF,ZF, AF,PF,CF。
控制标志位――控制指令的标志, PC中有三个位, 是DF,IF,TF.
段寄存器――寄存器存储每一个逻辑段起始地址, PC中有4种,分别是CS,DS,SS 和ES。
物理地址――显示存储空间中每一个字节的唯一的地址。
汇编语言――用指令的助记符,符号地址,标号等符号书写程序的语言。
机器语言――能被计算机直接识别的语言。
汇编程序――把汇编语言程序翻译成机器语言程序的系统程序。
连接程序――把若干个模块连接起来成为可执行文件的系统程序。
指令――告诉CPU要执行的操作(一般还要指出操作数的地址),在程序运行是执行。
伪指令――由汇编程序在汇编过程中执行的指令。
▲假定DS = 5788H, 偏移地址94H, 字节的PA(物理地址) 是(B ).
a.57974H b.57914H c. 5883H d. 58ECH
▲在段中寻址的时候,在8086CPU的寄存器中,哪些寄存器可以提供偏移地址(B )
A. AX, BX, CX, DX B. BX, BP, SI, DI C. SP, IP, BP, DX D. CS, DS, ES, SS
2-1下面的MOV指令完成什么操作?
(a)MOV AX,BX; (c)MOV BL,CH;
解:(mov指令的考察)
(a) 把BX的内容移动到AX中 (c) 把CH的内容移动到BL中
2-2 列出寄存器寻址使用的8位寄存器
解:(寄存器位数的考察)
AH、AL、BH、BL、CH、CL、DH和DL
2-3列出寄存器寻址使用的16位寄存器
解:(寄存器位数的考察)
AX、BX、CX、DX、SI、DI、SP、BP和段寄存器。
2-6 指令MOV BL,CX 错在哪里?
解:BL和CX的位数不一致。
2-7 指令MOV DS,SS 错在哪里?
解:两个寄存器之间是不能直接传送数据的。
2-13 指令 MOV [BX],[DL] 错在哪里
解:目标操作数寻址方式错误。
2-17给定DS=1200H,BX=0100H和SI=0250H。假定按实模式操作,确定下面每条指令寻址的地址:
解: (a)MOV [100H],DL; 12100H
(c)MOV DL,[BX+100H]; 12200H
2-18 给定DS=1100H,BX=0200H,LIST=0250和SI=0500H。假定按实模式操作,确定下面每条指令寻址的地址:
解:(b) MOV CL,LIST[BX+SI]; 11950H
2-19 给定DS=1300H,SS=1400H,BP=1500H和SI=0100H。假定按实模式操作,确定下面每条指令寻址的地址:
解:(b) MOV AL,[BP+SI+200H]; 14800H
2-20 哪些基址寄存器可以寻址堆栈段的数据?
解:SS, SP
3.1 给出(BX)=637DH,(SI)=2A9BH,偏移量D=7237H,尝试指出下列每一种寻址模式的有效地址。
(1) 立即寻址; 解: (1) 无
(2) 直接寻址 (2) EA=7237H
(3) 用BX的寄存器寻址; (3) 无
(4) 用BX的寄存器间接寻址; (4) EA=637DH
(5) 用BX的寄存器相对寻址; (5) EA=D+[BX]=7237H+637DH=0D5B4H
(6) 基址变址寻址 (6) EA=[BX]+[SI]=637DH+2A9BH=8E18H
(7) 相对基址变址寻址 (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寄存器。
解:(ADD指令的使用)
(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 解: (1) (AX)=1200H
(3) MOV AX, [1200H] (3) (AX)=4C2AH
(5) MOV AX, 1100[BX] (5) (AX)=4C2AH
(7) MOV AX, 1100[BX][SI] (7) (AX)=65B7H
3.8 给出(DS)=2000H,(ES)=2100H,(SS)=00A0H,(BX)=0100H,(BP)=0010H,数据段中VAL 的偏移地址是0050H,指出源操作数段的寻址方式和物理地址。
(2) MOV AX, BX 解:(2) 寄存器寻址
(4) MOV AX, VAL (4) 直接寻址,物理地址=20050H
(6) MOV AX, ES:[BX] (6) 寄存器间接寻址,物理地址=21100H
(8) MOV AX, [SI] (8) 寄存器间接寻址,物理地址=200A0H
(10)MOV AX, VAL[BX] (10) 寄存器相对寻址,物理地址=20150H
(12)MOV AX, VAL[BX][SI] (12) 相对基址变址寻址,物理地址=201F0H
▲ 当执行POP [BX] 和寻找目标操作数时,段地址跟偏移地址是在(B )中。
a. 无段地址也无偏移地址
b. DS 和BX中
c. ES 和 BX中
d. SS 和 SP中
▲下列指令中, 哪个是错的? 解:D错误: 立即数不能直接到段寄存器
a. MOV SS:[BX+DI],1000H
b. MOV DX, 1000H
c. MOV WORD PTR [BX],1000H
d. MOV DS, 2000H
1. 指出下列的错误:
1) MOV AH, BX ; 操作数大小不同
2) MOV [BX], [SI] ; 出错:不能内存与内存之间直接传输数据
3) MOV AX,[SI] [DI] ; 出错: [SI][DI]不能作为基址相对寻址的组合
4) MOV MYDAT [BX][SI], ES:AX ; 出错:不能内存与内存之间直接传输数据
5) MOV BYTE PTR[BX], 1000 ; 操作数大小不同
6) MOV BX, OFFSET MYDAT[SI] ; offset指令是获取标号处的地址,这里应删除[SI]
7) MOV CS, AX ; 出错: CS 段寄存器不能作为第一操作数
2. 给出DS = 6400h, BX = 0743h, SS=6500H, BP = CA40h, SI = 2100h 和 DI = 04A4h, 而且BETA是一个偏移量为0202h的数据项 (名称/变量), 对于下列每一条指令指出其寻址方式且计算出源操作数和目标操作数的20-位的物理地址:
• (i) MOV AL, [BP][SI] ; 基址变址寻址 72B40H
• (ii) MOV [BX + DI + 4], AX ; 相对基址变址寻址 64BEBH
• (iii) MOV BETA, BL ; 直接寻址 64202H
• (iv) MOV AH, [BP][DI + BETA] ; 相对基址变址变址 710E6
• (v) LODSB ; 寄存器寻址 66100H
汇编语言第03章习题(数据传送指令)
3.10 TABLE 是一个在数据段中0032上的符号, 它的内容是1234H, 下面指令有什么不同?执行指令后AX寄存器的内容是什么?
(1)MOV AX, TABLE
(2)LEA AX, TABLE
解:(1)mov指令是将内容放进目的操作数 (AX)=1234H
(2)而LEA指令是将偏移地址放入目的操作数 (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)=3000H
3.13 给出SS 寄存器的内容是0FFA0H, 和SP 寄存器的内容是00B0H。首先执行两个PUSH 指令把8057H 和0F79H 压入栈中, 然后执行POP 指令. 请以图表的形式给出栈的变化和SP的值 (用下划线划出内存单元的物理地址).
解:
第一步:PUSH 8057H
第二步:PUSH 0F79H
第三步:POP
第一步:压栈前:SS:SP = 0FFA0H:00B0H, 压栈后:SS:SP = 0FFA0H:00AFH
第二步:压栈前:SS:SP = 0FFA0H:00AFH, 压栈后:SS:SP = 0FFA0H:00ADH
第三步:出栈前:SS:SP = 0FFA0H:00ADH, 出栈后:SS:SP = 0FFA0H:00AFH
7.8下列指令中,符号ABCD 是一个变量。说出两条指令的不同。
MOV AX, OFFSET ABCD
LEA AX, ABCD
答:两条指令都是取ABCD的偏移地址,但MOV指令能以更少的时间完成同样的功能。
3. 回答执行指令后的问题:
A DW 1234H
B DW 5678H
……
PUSH A
PUSH B
POP A
POP B
解:
① 执行之后(A)=5678H , ( B)= 1234H
② 执行程序之前SP=200H, 执行之后SP= 200H
4. 读程序题:
DATA SEGMENT
A DB 12H,’12’
B DW 34H,45H
C DW B
DATA ENDS
…………
在下列的指令完成之后,排列主存储器中的数据段。
MOV AX, A+1; AX=3231H
LEA BX, B; BX=0003H
MOV CX, C; CX=0003H
解:00H_______高地址处_DATA+8
03H__C
00H
45H
00H
34H__B
32H
31H
12H_A_____低地址处_DATA+0
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
▲当在串指令之前使用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
▲.当在串指令之前使用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
▲下列哪条指令有合理和充分的意义? D
A. REP LODSB B. REP SCASB C. REP CMPSB D. REP MOVSB
3. 英特尔 8086 CPU中的每一个寄存器都是为在执行指令时的一些特定的功能而设计的. 描述使用或者修改下列寄存器的两条特别的指令。
• (i) SP,
• (ii) SI,
• (iii) DX.
解:PUSH DX;
POP SI ;
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
汇编语言第04章习题(算术与逻辑运算指令)
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的大小不一致。ECX为32位,而AX为16位。
4.3 可以用ADD 指令把CX 加到DS吗?
解: 不可以,因为DS是段寄存器。ADD指令不能直接对段寄存器进行操作。
4.4 给出AX=1001H,DX=20FFH,执行ADD AX,DX后,列出标志寄存器的总和和每一位的内容。
解:总和: AX=3100H = 1001H + 20FFH
标志寄存器的内容:C=0; 最高位没有进位
A=1; 第三和第四位没有进位
S=0; 结果为正
Z=0; 结果非零
O=0; 结果没有溢出
4.6 设计一个简短的程序,把AX,SX,CX,DX 和SP 累加在一起,把结果存进DI中。
解:LEIJIA PROC NEAR
ADD AX, SX
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, 2
MOV DX, AX
汇编语言第05章习题(程序控制语句)
▲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
▲假定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
▲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
答案:
1. JE K1 2. CLD
K1: MOV PLW, AX SUB SI,2
汇编语言第07章习题(汇编语言程序设计)
▲汇编程序的语句中,可以省略 (B)
A. 名称 B. 操作符 C. 操作数 d.注释
▲正确结束伪操作的句子是( C)
A. 汇编程序把伪操作翻译成机器代码。
B. 伪操作在程序执行期间完成它的功能。
C. 伪操作的功能是告诉汇编程序在汇编过程实现特殊的处理
▲执行下列指令后, 变量DAB 的内容是C
DAW DW 2A05H
DAB DB 0FAH
…
MOV AL, BYTE PTR DAW
SUB DAB, AL
a. 0DAH b. 0FAH c. 0F5H d. 0D0H
▲BUF DW 10H DUP (3 DUP (2, 10H), 3, 5)汇编了语句后, 变量BUF所分配的地址是(b).
a. 80H b. 100H c. 124H d. 192H
▲ARY DW 10 DUP(?)
…
MOV AL, TYPE ARY
MOV BL, LENGTH ARY
MOV AL, SIZE ARY
一系列MOV指令运行后,结果是 ?
答案: (AL)=2, (BL)=10D,(al)= 20D
▲可汇编语句中,有两种类型的语句( 指令语句 ) 和 (伪指令语句)。
▲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 伪操作, 那一句是对的? C
a. END 伪操作是一个可执行指令。
b. END 伪操作指明执行程序的终止之处。
c. END 伪操作指明整个源程序的终止。
d. END 伪操作会在汇编过程生成机器码。
▲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_
▲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的偏移量
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
▲编写指令:
1. D1 DB 20H DUP(?)
D2 DW D1
给出三种方式,使用一条指令来把D1的偏移量载入到SI中。
答案: LEA SI, D1
MOV SI, OFFSET D1
MOV SI, D2
▲.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
▲获取键盘输入 (一个定义为X, 另一个是Y) 然后计算此表达式(X2+Y2-2XY+1)/2 ,把结果存进Z中 (假定X,Y 在[0,9]的范围内)。
DATA SEGMENT ;数据段.
x DB 0
y DB 0
z DB 0
DATA ENDS
;----------------------------------------------
CODE SEGMENT ;代码段.
ASSUME CS: CODE,DS: DATA
START:
PUSH CS
POP DS
_INX:
MOV AH, 1 ;输入字符.
INT 21H
CMP AL, 30H
JB _INX
CMP AL, 3AH
JNB _INX
SUB AL, 30H
MOV AH, 0
MOV x, AL
CALL OUT_0D0A
_INY:
MOV AH, 1 ;输入字符.
INT 21H
CMP AL, 30H
JB _INY
CMP AL, 3AH
JNB _INY
SUB AL, 30H
MOV AH, 0
MOV y, AL
CALL OUT_0D0A
_INZ:
MOV AH,00H
MOV AL,x
MUL BYTE PTR x
MOV BX,AX
MOV AH,00H
MOV AL,y
MUL BYTE PTR y
ADD AX,BX
MOV BX,AX
MOV AH,00H
MOV AL,x
MUL BYTE PTR y
MOV CX,02H
MUL CX
SUB BX,AX
MOV AX,BX
MOV CL,02H
DIV CL
MOV z,AL
EXIT:
MOV AH, 4CH
INT 21H
;------------------------------
OUT_0D0A PROC ;回车换行.
MOV DL, 13
CALL PUTC
MOV DL, 10
CALL PUTC
RET
OUT_0D0A ENDP
CODE ENDS
END START
▲ 让 DAT 内存位置包含一个字节的数据–9-+9, 且SQRTAB 定义一个数据平方的列表–9-+9。写一个子程序从列表SQRTAB中取出DAT中数字的平方, 把平方数存入到SQR的位置上. 同时, 编写主程序来调用这个子程序。
DATA SEGMENT
DAT DB XXH
SQRTAB DB 0, 1, 4, 9, …, 81
SQR DB ?
DATA ENDS
DATA SEGMENT
DAT DB XXH
SQRTAB DB 0, 1, 4, 9, …, 81
SQR DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS : CODE
Main PROC FAR
MOV AX, DATA
MOV DS,AX
CALL get square
MOV AX, 4C00H
INT 21H
Main ENDP
CODE ENDS
END Main
Get square PROC NEAR
TEST DAT, 80H
JZ positive
NEG DAT
Positive MOV SI, DAT
AND SI, 0FH
MOV AL, SQUTAB[SI]
MOV SQR, AL
RET
Get square ENDP