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

                                            IBM-PC汇编语言程序设计(第二版)课后习题答案

23。每條指令單獨執行完後的結果依次為:

(1) 9AH   (2)61H  (3)0FBH (4)1CH  (5)0  (6)0E3H

24。執行指令序列後,BX的內容為:0DAH

25。

(1)把53D乘以2的程序:

MOV AX,35H                     ;53D=35H

SHL AX ,1

(2)把53除以2 的程序:

MOV AX,35H

SHR AX,1

其他的同理~~

26。這段程序完成的功能是:把DX:AX中的雙字數據左移4位(相當於乘以16D)

27。各條指令單獨執行後,DX的值依次為:

(1) 5CH  (2)17H (3)05C8H  (4)72H  (5)2017H  (6)0CDH (7)0172H (8)05CCH

 (9)0DCH

28。 該程序段執行完後,BX寄存器的內容是:C02DH

29。(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:

LEA SI,CONAME        ;把CONAME中第一个字节的偏移地址送到SI中

LEA DI,PRLINE           ;把PRLINE中第一个字节 的偏移地址送到DI中

MOV CX,20                 ;把重复次数放到CX里

CLD                              ;让SI DI从低地址指向高地址(即从左到右传送)

REP  MOVSB                 ;传送

(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:

LEA SI ,CONAME

LEA DI,PRLINE

MOV CX,20

STD                               ;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址

REP MOVSB

(3)把CONAME中的第三和第四個字節裝入AX的程序實現:

LEA SI ,[CONAME+3]

LODSW

(4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:

LEA DI ,[PRLINE+5]

STOSW

(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:

LEA DI,CONAME                     ;把CONAME中第一個字符偏移地址放入DI中

MOV CX,20                             ;把重複次數放到CX中

MOV AL,20H                            ;把空格符的ASCII值放入AL中

CLD                                           ;從低到高

REPNE   SCASB                        ;比較

MOV BH,[DI-1]R                       ;把檢查到的空格符送到BH中

30。

MOV CX,12H                            ;把重複次數放到CX中。這裏用十六進制表示  

MOV SI,0                                 ;初始化SI

MOV AX,26H                           ;把&字符的ASCII值放入AX

CHECK: CMP AX,STRING[SI]   ;依次查找

INC SI

LOOPNE  CHECK                           ;找到了就退出

MOV AX,20H                               ;把空格符的ASCII值勤放入AX中

MOV STRING[SI-1],AX                ;用空格符代替&

31。(1)用空格符清除PRINT_LINE域的程序实现:

MOV AL,20H

LEA DI ,PRINT_LINE

MOV  CX,132

CLD

REP STOSB

(2)在STUDENT_ADDR中查找 第一个’_‘的程序实现:

MOV AX,2DH                                            ;把“—”的ASCII值放入AX 

MOV SI,0                                                  ;初始化SI

MOV CX,9                                                ;把重複次數放入CX中

;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来

CHECK:CMP AX ,STUDENT_ADDR[SI]  ;

INC SI

LOOPNZ CHECK

 (3)在STUDENT_ADDR中查找最后一个”_“的程序实现:

;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9

MOV AX,2DH

MOV SI ,9

MOV CX,9

CHECK :CMP AX,STUDENT_ADDR[SI]

DEC SI

LOOPNZ CHECK

(4)程序實現:

MOV AL,2OH                           ;把空格符的ASCII值放入AL中

LEA DI ,STUDENT_NAME         ;把STUDENT_NAME中第一个字符偏移地址放到DI中

MOV CX,30                               ;把重复次数放到CX中

CLD                                          ;让DI从低位移到高位

REPZ SCASB                             ;如果有不是空格符的,就退出

JZ  STORE                                ;如果全是空格符,就转到STORE中

;用*代替空格

STORE:MOV AL 2AH

MOV CX ,30

STD                                 ;注意,这里是把前面从低到高移动的DI再从高到低移上去~~

REP STOSB

(5)程序实现:

;把STUDENT_NAME 移到PRINT_LINE的前30个字节中

LEA SI, STUDENT_NAME

LEA DI,PRINT_LINE

MOV CX ,30

CLD

REP MOVSB

;把STUDENT_ADDR移到PRINT_LINE的后9个字节中

LEA SI ,[STUDENT_ADDR+9]

LEA DI,[PRINT_LINE+132]

MOV CX,9

STD

REP MOVSB

32。程序实现:

    。。。

LEA  SI,OLDS

LEA DI,NEWS

MOV CX,5

REPZ  CMPSB

JNZ  NEW_LESS

     。。。

33。

(1)CMP  DX,CX

        JA       EXCEED

(2)CMP BX,AX

       JG   EXCEED

 (3)CMP CX,0

      JZ  ZERO

(4)CMP BX,AX

         JO  OVERFLOW

(5)CMP BX,AX

         JLE  EQ_SMA

(6)    CMP DX,CX

       JBE   EQ_CX

34。(1)跳转到:L1

       (2)跳转到L1

         (3)跳转到L2

        (4)跳转到L5

        (5)跳转到L5

35。

(1)可以引起转移到L1的指令有:    NB  ,BE ,NL ,LE

(2)可以引起转移到L1的指令有:   同上

(3)可以引起转移到L1的指令有: B,BE ,L , LE

(4)可以引起转移到L1的指令有: NB  ,NBE ,NL ,NLE

(5)可以引起转移到L1的指令有: 同上

(6)可以引起转移 到L1的指令有:  同(3)

(7)可以引起转移 到L1的指令有: 同上 

36。

37。 程序流程图就不画了,呵呵,程序如下~~

MOV AL,STAUS[SI]               ;把要测试的字节放到AL中

AND AL,2AH                         ;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果  

                                                ;放到AL中 

JZ ROUTINE_4                         ;如果结果为0,则三位都为0

XOR AL,2AH                           ; 前面相与的结果再与2AH异或

JZ ROUTINE_1                       ;如果结果为0,则三位都为1

BSF BL,AL                             ;

BSR BL ,AL

CMP BL,CL

;如果向前和向后测试后,第一个1 的位置相同,说明只有一个1,则异或运算前有AL中有两个1

JE ROUTINE_2

ROUTINE_1

注:本题还有其他解法,请大家自己试试~~

38。(1)当括号内是:LOOP时,循环四次,程序结束后

(AX)=05  (BX)= 16   (CX)=0 (DX)=0

(2) 当括号内是: LOOPE 时,不循环,程序结束后

(AX)=02 (BX)=04 (CX)=03 (DX)=02

(3)当括号内是:LOOPNE 时:循环三次,程序结束后

(AX)=04 (BX)=11 (CX)=01 (DX)=0