汇编语言程序设计复习题

时间:2022-12-26 01:17:09

2011-11-21

汇编语言第01章习题(80X86微型计算机的组织)

1-12 在实模式操作下,段寄存器的用途是什么?

答:段寄存器是用来定义数据段得起始地址的。在实模式下,它定义一个最大64KB存储段的起点。

1-15 实模式存储器地址允许访问低于哪个地址的存储区?

答:在实模式下,存储器寻址允许访问低于FFFF:FFFF地址的存储区。

1-18堆栈存储器由(堆栈)段加(堆栈指针)偏移的组合来寻址

1-19如果用基指针(BP)寻址存储器,则寻址的数据在(段)中

1-20 80286工作在实模式下,给出下列寄存器组合所寻址的存储单元地址。

aDS=1000H  和 DI=2000H      12000H

bDS=2000H  和 SI=1002H      21002H

cSS=2300H   和 BP=3200H     26200H

dDS=A000H  和 BX=1000H      A1000H

eSS=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中。内存地址由BXSI进行基址变址寻址所得。

(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寄存器的内容是什么?

1MOV AX, TABLE

2LEA AX, TABLE

解:(1mov指令是将内容放进目的操作数   (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

② 执行程序之前SP200H,  执行之后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 AX6540H

MOV DX3210H

MOV CL04

SHL DXCL

MOV BLAH

SHL AXCL

SHR BLCL

OR DLBL                 解:执行指令后:(AX)=5400H,BL)=06H,DX)=2106H

2. 程序分析

MOV AL200

SAR AL1

MOV BLAL

MOV CL2

SAR ALCL

ADD ALBL

解:执行指令之后(BL)=0E4H,(AL)=0DDH

▲当在串指令之前使用REPE立即前缀时当 (),串指令将会停止。 

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 立即前缀时,当 ( ),串指令将会停止。

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的大小不一致。ECX32位,而AX16位。

4.3 可以用ADD 指令把CX 加到DS

不可以,因为DS是段寄存器。ADD指令不能直接对段寄存器进行操作。

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

解:总和:            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,最后的结果存在 DX16-位数。

解:MOV AL, BL

    MOV AH, 0

DIV CL

MOV AH, 0

ADD AX, 2

MOV DX, AX

汇编语言第05章习题(程序控制语句)

▲BLK1 DB 468434,-52012273

  MOV CX7

  LEA S1BLK1

  NEXT: MOV AL[SI]

  INC SI

  TEST AL81H

  LOOPZ NEXT

  MOV BL[SI]

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

▲假定VAR1 和 VAR2 是字变量, LAB 是标签, 指出下列的错误:

ADD VAR1,VAR2            

SUB  AL, VAR1

JMP   LAB[SI]

JNZ   VAR1

JMP   NEAR  LAB

错误: 

1ADD 内存, 内存

2. 两个操作数大小不同

3.删除[SI] 或者 删除 LAB

4. 条件跳转范围<= 字节, 不是字

5. 应该是JMP NEAR PTR LAB

 

▲AND ALAL

  JZ BRCH1

  RCR AL1

  JZ BRCH2

  RCL AL1

  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的值是

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