IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第四章答案
2006-11-04 21:59

1。指令下列指令的错误

(1) MOV AH,BX     源操作数与目的操作数长度不相同~

(2)  MOV [BX],[SI]   这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~

 (3)     MOV AX,[SI][DI]    不能用两个变址连用,其中一个应为基址~

(4) MOV MYDAT[BX][SI],ES:AX     同(2)

(5) MOV BYTE PTR[BX],1000  必须有一个为寄存器

(6)MOV BX,OFFSET MYDAT[SI]     OFFSET 不能与复杂操作数相连~

(7)MOV CS,AX    不能对CS赋值~

(8)MOV ECX,AX     操作数类型不同~

2。(1)合法   (2)非法    (3)非法   (4)非法

3。(1)非法,操作数类型不同

      (2)合法

      (3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~

       (4)合法~

     (5)合法~

    (6)合法

  (7) 非法~,必须有一个寄存器~~把CPU放哪了?~~

  (8)非法,两个内存单元地址相加没有意义~

   (9)合法

   (10)非法,同(3)

 4。(1)两内存单元传递数据

     (2)操作数类型不同

     (3)跳转指令只能跳转到符号地址

     (4)转移指令后不能为变量,只能为标号

     (5)格式不对,  应为   NEAR PTR 。。。

5。图,就不画了~~

6。(1)DW  5150H

(2)MOV AX,5150H

         MOV  ADDRESS   ,AX

等,写出几个就可以~~

7。DATASG    SEGMENT

    FLD1B  DB   'personal computer'

   FLD2B   DB  10 DUP (32)

  FLD3B    DB  20H

 FLD4B    DB  01011001B

 FLD5B  DB  '32654'

 FLD6B  DB  10 DUP (0)

 FLD7B   DB  'PART1',DUP 20  (?),'PART2',DUP 50 (?),'PART3',DUP 14 (?)

FLD1W   DW  0FFF0H

FLD2W   DW  01011001B

FLD3W  DW   FLD7B

FLD4W   DW    5,6,7,8,9

FLD5W   DW  5 DUP (0)

FLD6W  DW    (FLD6W-FLD1W)-(FLD7B-FLD1B)

8。PLENTH 的值为22,GE表示该数据段的长度~

9。L的值为7

10。(1)MOV AX,OFFSET  LNAME

        (2)MOV SI,WORD PTR CODE_LIST

         (3)CODE_LENGHT   EQU   $-CODE_LIST

11。代码如下:

DATA_SEG  SEGMENT

   DB  5

  DATA_LIST  DW 0FFFFH,0,2,5,4, 5 DUP (?)

DATA_SEG  ENDS

CODE_SEG  SEGMENT

ASSUME CS:CODE_SEG,DS:DATA_SEG

MOV AX,5

MOV MAX,AX

MOV AX,0FFFFH

MOV MIN,AX 

CODE_SEG   ENDS

12。(1)10025

   (2)19

   (3)2548

    (4)3

    (5)103

    (6)0FFFFH

    (7)1

     (8)3 

13。分别汇编成为:

MOV AX,0AH

MOV BL,0AH

MOV  CL,1

14。(1)(AX)=1     (2)(AX)=2    (3)(CX)=14H  (4)(DX)=32H   (5)(CX)=1]

15。(1)操作符错误     改为:  DATA_SEG   SEGMENT

      (2)缺少段名        在前面加个段名

    (3)引用应该从;开始       把那个“/”改成“;”

    (4)结构混乱   改为:

   MAIN_PROC PROC FAR

      。。。。

MAIN_PROC    ENDP

END  

16。程序框架如下:

DATA_SEG   SEGMENT                              ;定義數據段

ORG 0E000H                                               ;讓下一字節地址為0E000H

FIRST_TYPE  EQU THIS WORD          ;建立一個與下一存儲單元有相同段地址和偏移地址的操作數

DATA_GROUP DB 100 DUP(?)                  ;給DATA_GROUP 分配100個字節的空間

DATA_SEG  ENDS                                       ;數據段結束

STACK_SEG  SEGMENT                            ;定義堆棧段

ALIGN 16                                                      ;讓下一字節從小段首地址開始

STACK DB 100 DUP (?)                                ;為堆棧分配空間

STACK_SEG   ENDS                                      ;

CODE_SEG SEGMENT

ASSUME  CS:CODE_SEG ,DS:DATA_SEG ,SS:STACK_SEG

ORG 1000H                                                     ;讓下條指令的第一個字節從1000H開始

START :  MOV AX,DATA_SEG

                MOV DS,AX

              MOV AX,STACK_SEG

                MOV SS,AX

              .......

CODE_SEG  ENDS

END START                                                   ;結束~

17。程序如下:

D_SEG    SEGMENT                               ;数据段定义

 AUGEND   DD  99251

D_SEG  ENDS

E_SEG  SEGMENT                                    ;附加段定义

ADDEND  DD -15926

E_SEG   ENDS

C_SEG    SEGMENT                                   ;代码段定义

ASSUME   CS:C_SEG ,  DS:D_SEG,ES:E_SEG

START:  MOV AX,D_SEG

               MOV DS,AX

               MOV AX,E_SEG

               MOV ES,AX

              MOV EAX,DS:AUGEND

             ADD EAX,ES:ADDEND

              MOV  DS:SUM,EAX

C_SEG  ENDS

END  START                                             ;结束

18。

 19。需要加上PTR伪操作的有:  (2)(3)(4)