试问程序段执行后(BL)=(0E4H),(AL)=(0DDH) 4.程序段如下:
BLK1 DB 46,84,34,-5,20,122,73
┆
MOV CX,7 LEA
SI,BLK1
NEXT: MOV AL,[SI]
INC SI
TEST AL,81H LOOPZ NEXT MOV BL,[SI]
请回答程序段运行后:(AL)=(0FB)H,(BL)=(14)H 四、用最少的程序编写下列程序段:
1.编写完成下列功能的小程序段:
? 将寄存器AL的第4,3位取反,其余位保持不变。 XOR AL, 00011000B
? 将寄存器AL的第4,3位清零,其余位保持不变。 AND AL, 11100111B
? 将寄存器AL的第4,3位置1,其余位保持不变。
OR AL, 00011000B
? 将寄存器AL的第4,3位写入MEN单元中的第4,3位,其余位保持不变。 AND AL,00011000B AND MEN,11100111B OR MEN,AL
? 将寄存器AL的第i位写入MEN单元的第i位,其余位保持不变,i值在CL中。
MOV BL, 1 SHL BL, CL AND AL, BL NOT BL
AND MEN, BL
OR MEN, AL
? 将寄存器AL的第i+1,i位写入MEN单元的第i+1,i位,其余位保持不变,i值在CL中。
MOV BL, 3 SHL BL, CL AND AL, BL NOT BL
AND MEN, BL
OR MEN, AL
? 如果寄存器AL的第6,5位为00,则将AH清0,否则置全1。
TEST JZ MOV
AL, 01100000B L1
AH,0FFH
JMP OK
L1: MOV AH,0 OK: NOP
? 如果寄存器AL的第6,5位为01,则将AH清0,否则置全1。
AND CMP JZ MOV JMP
L1:
MOV
AL,01100000B AL,00100000B L1
AH,0FFH OK AH,0
OK: NOP
? 如果寄存器AL的第6,5位为10,则将AH清0,否则置全1。
AND CMP JZ MOV
L1:
JMP MOV
AL,01100000B AL,01000000B L1
AH,0FFH OK AH,0
OK: NOP
? 如果寄存器AL的第6,5位为11,则将AH清0,否则置全1。
AND CMP JZ MOV JMP
AL,01100000B AL,01100000B L1
AH,0FFH OK
L1: MOV AH,0 OK: NOP
⑴ 如果寄存器AL的数据为偶数,则将AH清0,否则置全1。
TEST JZ MOV
L1:
JMP MOV
AL, 1 L1 AH,0FFH OK AH,0
OK: NOP
⑵ 如果寄存器AL的数据为正数,则将AH清0,否则置全1。
TEST JZ MOV JMP
L1: OK:
MOV NOP
AL, 80H L1
AH,0FFH OK AH,0
2.不允许使用乘法指令来完成AX与12的乘法运算。
SHL MOV SHL ADD
AX, 1 BX, AX
;将AX乘2(等于2倍) ;预存一份AX在BX内 ;将AX再乘2(等于4倍) ;加上原有2倍(等于6倍)
AX, 1 AX, BX
SHL AX, 1 ;再乘2(等于12倍)
3.写一指令序列,将DX与AX中的双字左移三位。
MOV
LOP: SHL
RCL
CX,3 AX,1 DX,1
LOOP LOP
4.内存单元MEMB存放着一个8位的数据,将它的高4位与低4位互换。
MOV CL, 4
ROL MEN, CL
5.将AL的第7位和第0位,第6位和第1位,第5位和2第位,第4位和第3位互换。
MOV
MOV
LOP: MOV
AND ADD SHR SAL LOOP ADD
五、简答题
CX,7 BL,0 AH,AL AH,1 BL,AH AL,1 BL,1 LOP AL,BL
1.至少使用三种方法(提示:MUL、SHL和SHR指令)实现将DATA中的字节数据乘以64的指令序列。
① ② ③
MOV MUL MOV SHL MOV MOV SHR MOV
AL,64 DATA CL,6 DATA,CL AH,DATA AL,0 AX,2 DATA,AL
第九章课外练习题
一、单项选择题:
1.已知CALL BX执行前SP=100H,执行后SP的内容为( D ) (A)100H (B)102H (C)98H (D)0FEH
2.已知SP=100H,指令RET(远返回)执行后SP的值为( B )
(A)106H (B)104H (C)0FCH (D)0FAH
3.已知SUBR是一个属性NEAR的子程序,下述调用SUBR子程序的指令序列中,哪一个不能
(B)CALL NEAR PTR SUBR
实现调用SUBR的目的( C )。
(A)CALL SUBR
(C)MOV BX,OFFSET SUBR (D)MOV BX,OFFSET SUBR
CALL NEAR PTR [BX] CALL BX
4.下面是将某存储区清0的宏定义,如将BUFF开始的100个存储单元清0,则其宏调用格式
C )。 CLEAR
MACRO DIR,DST,CNT DIR LEA MOV XOR REP
DI,DST CX,CNT AL,AL STOSB
(B)CLEAR STD,BUFF,100 (D)CLEAR BUFF,STD,100
为(
ENDM
(A)CLEAR BUFF,100 (C)CLEAR CLD,BUFF,100
5.宏指令库以( C )格式存放在磁盘上。
(A)可执行代码 (B)目标代码 (C)源代码
6.汇编程序使用( C )伪指令使重复块重复多次。 (A)LOOP (B)REPE (C)REPT (D)LOCAL
二、判断题(判断每题正误,对的在题后括号内划 “√”,错的划“×”)
1.CALL
2.CALL 3.CALL 4.CALL 5.CALL 6.CALL
WORD PTR[SI] [BX] [SI] AX [BX] NEAR FAR
PTR [SI] PTR [SI+2]
( × ) ( × ) ( × ) ( √ ) ( × ) ( × ) ( × ) ( √ )
7.宏的处理是在程序执行过程中处理的 8.宏定义中的形式参数可以多于宏调用的实在参数
三、填空题
1.调用程序与子程序之间的参数传递方法有三种,即堆栈法(寄存器法)(存储单元)。
2.LOCAL用于说明局部标号的伪指令,它只允许在(宏程序中)使用,其位置必须在(第一条指令前)。 四、简答题
1.指出CALL指令与JMP指令的异同?
答:相同----都可以无条件跳转到目标地址。不同---CALL指令有返回,而JMP没有;CALL指
令影响堆栈段的变化,而JMP不影响堆栈段。
2.指出子程序和宏指令的区别? 处理者 处理时间 处理方法 占用内存 运行速度 灵活性 宏 汇编程序 在汇编过程中 用宏体替换宏指令 占用内存空间多 运行速度较高 十分灵活 子程序 中央处理器 程序执行时 用CALL指令调用 占用内存空间少 运行速度较低 不够灵活 3.段内调用和段间调用的异同点是什么? 答:段内调用是指在调用和返回过程中,转返地址不涉及CS的变化,只通过IP内容的变化实现控制的转返;而段间调用需要CS,由CS和IP的变化共同决定控制的转返。
4.主程序和子程序之间有哪几类参数传递方法?
答:主程序与子程序之间的参数传递方法有三种,即堆栈法、寄存器法和存储单元。 5.子程序说明文件由哪几个部分组成?并分别说明各组成部分的含义? 答:编写子程序的目的在于减少源程序中某些相同功能程序段的重复书写,以利于自己和他人编写程序时使用。一般包含下述几项内容:
(1)子程序名称:用子程序定义伪指令定义该子程序时的名字;
(2)子程序功能:用自然语言或数学语言等形式简单清楚地描述子程序完成的任务; (3)入口参数:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置;
(4)出口参数:说明子程序要求有几个输出参数(运行结果),这些参数表示的意义及存放位置; (5)受影响的寄存器:说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。
五、程序分析题
1.下述程序段运行后,AL=( 88H ),CL=( 80H )
MOV AL,38H
MOV BL,49H CALL SUBO INC DEC ?
SUBO
AL CL
PROC
ADD AL,BL MOV CL,AL DAA RET
SUBO ENDP
2.宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)定义如下: GOTO MACRO L,X,REL,Y
IFB JMP
ELSE