IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)解析 下载本文

MUL DATAY ;結果的高十六位保存在DX裏,低十六位保存在AX裏 (5) MOV AX,DATAX MOV DX,[DATAX+2]

MUL DWORD DATAY ;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏

(6)MOV AX,DATAX

DIV 17H ;結果商保存在AL中,余數在AH中 (7) MOV AX,DATAX CDW

DIV DATAY 21. NEG DX NEG AX SBB DX,0 22.

MOV AX,A ;把雙字長數的低字放到AX中 MOV DX,[A+2] ;把雙字長數的高字放到DX中 TEST DX,8000H ;測試雙字長數的符號 JZ RIGHT ;如果是非負數,則直接保存 NEG DX ;如果是負數,則求補 NEG AX

SBB DX,0 RIGHT: MOV B ,AX MOV [B+2],DX

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的指令有: 同上 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 39.P101

40.(1)0000 3100H (2)5100H (3)7100H

41.(1)目的地址:2004H 内容依次为: 56H F4H 23H 98H