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 CX,9 ;把重複次數放入CX中
;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来
CHECK:CMP AX ,STUDENT_ADDR[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
(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再从高到低移上去~~
(5)程序实现:
;把STUDENT_NAME 移到PRINT_LINE的前30个字节中
LEA SI, STUDENT_NAME
LEA DI,PRINT_LINE
;把STUDENT_ADDR移到PRINT_LINE的后9个字节中
LEA SI ,[STUDENT_ADDR+9]
LEA DI,[PRINT_LINE+132]
MOV CX,9
STD
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