LEA DI,0200H MOV CX,0080H MOV AL,0 N: MOV [DI],AL INC DI DEC CX JNZ N HLT
7、试编写一程序段,将字符串CHR1中的20个字符传送到CHR2中。
LEA SI,CHR1 或
LEA DI,CHR2 LEA SI,CHR1 MOV CX,20 LEA DI,CHR2 NEXT: MOV AL,[SI] MOV CX,20 MOV [DI],AL REP MOVSB INC SI HLT INC DI LOOP NEXT HLT 8、某工厂8种产品的加工程序R0、R1、…、S7分别存
放在以S0、S1、…、S7为首地址的内存区域中,而这8个首地址偏移量连续存放在以BASE为首地址的跳转表内。
假设8种产品的编号分别为0、1、2、…、7,请编程实现根据产品编号跳转到相应的执行程序。
9、统计一个20字数据块中负元素的个数,数据块的首地址为BASE,负元素的个数存放在这20字数据块之后的单元中。 LEA BX,BASE MOV CX,20
MOV DX,0
LOP1: MOV AX,[BX]
CMP AX,0 ;可用AND AX,AX JGE JUS
INC DX JUS: INC BX INC BX DEC CX JNZ LOP1 ;或LOOP LOP1
INC BX MOV [BX],DX
HLT
10、已知存储器中存放有100个8位带符号数,存储区的首地址为ARRAY,试将其中的最大值和最小值找出来,分别存放在MAX和MIN单元中。
LEA SI,ARRAY
MOV CX,100
MOV AL,80H ;-128送AL
LP1:
CLC
5
CMP AL,[SI] JL BB
JMP AA BB: MOV AL,[SI] AA:
INC SI
LOOP LP1 MOV MAX,AL
;找出最大数
;------------------------------------ LEA SI,ARRAY MOV CX,100
MOV AL,07FH ;+127送AL
LP2: CLC CMP AL,[SI] JG CC
JMP DD CC: MOV AL,[SI] DD:
INC SI
LOOP LP2 MOV MIN,AL ;找出最小数
HLT
11、统计寄存器AX内16位二进制数中0、1的个数,0的个数存CH,1的个数存CL。
MOV CX,0 ;清CH、CL
MOV DL,16 ;循环16次
CLC
;清进位位 LP: RCL AX,1
;带CF循环左移
JC NEXT ;CF=1转NEXT INC CH ;CF=0则CH内容加1
JMP AA
NEXT: INC CL ;CF=1则CL内容加1
AA: DEC DL
JNZ LP
HLT
12、数据段中有两个字符串,分别存在STR1和STR2开始的单元中。比较两个字符串是否相同,若相同使DX为0,否则使DX为0FFFFH。
LEA SI,STR1
;取源串首地址 LEA DI,STR2
;取目的串首地址
MOV CX,N ;字符串长度送计数寄存器 CLD
;增地址 REPE CMPSB ;串比较
AND CX,0FFH
;是否比较到最后字节
JZ EQQ
;串相等转EQQ MOV DX,0 否则0送DX寄存器
JMP END
EQQ: MOV DX,0FFFFH ;0FFFFH送DX寄存器
END:
HLT
13、编制一个程序,对DAT字节单元中的数(255)分别统计出有多少个10,余下有多少个5,再余下有多少个2,再余下有多少个1。统计得到的各数分别存在DAT0、DAT1、DAT2、DAT3中。 方法一:
LEA BX,DAT ;取首址 MOV AL,[BX]
;取这个字节数
6
MOV AH,0 ;AH清0 MOV DL,10 ; DIV DL
;除10
MOV DAT0,AL ;商即10的个数
MOV AL,AH MOV AH,0 MOV DL,5 DIV DL
;余数除5
MOV DAT1,AL ;商即5的个数 MOV AL,AH MOV AH,0 MOV DL,2 DIV DL
;余数除2
MOV DAT2,AL ;商即2的个数 MOV DAT3,AH
;余数即1的个数方法二: MOV BL,DAT ;取数
MOV CL,0 ;计数个数 AA: SUB BL,10 ;减10 JC BB
;借位转BB INC CL ;否则CL加1
JMP AA
BB: MOV DAT0,CL ;存10个数 MOV CL,0
ADD BL,10 ;恢复BL差值
BB1: SUB BL,5
JC CC INC CL
JMP BB1
CC: MOV DAT1,CL ;存5个数
MOV CL,0 ADD BL,5 ;恢复
DD1: SUB BL,2
JC DD INC CL
JMP DD1
DD: MOV DAT2,CL ;存2个数 ADD BL,2
MOV DAT3,BL ;存1个数
HLT
14、写出实现下列功能的指令组: (1)传送10H到AL寄存器 (2)将AL的内容乘以2 (3)传送15H到BL寄存器 (4)AL的内容乘以BL的内容 问:最后结果AX=?
15、计算Z=((X+Y)×5-Y)/2。设X的值为2,Y的值为1,结果存入数据段中的DATA单元。
7
16、编程检测50H端口输入的字节数据,若为正,将BL清0;若为负,将BL置为 FFH。
VR3 DD CONT DUP(?)
VR4 DB 2 DUP(?,CONT DUP(0)) VR5 DB ?HOW ARE YOU ??
解:为VR1分配2字节;为VR2分配10字节;为VR3分配40字节;为VR4分配22字节;为VR5分配12字节。 2、下面语句有何区别?
X1 EQU 1000H 和 X2= 1000H
解:为X1赋值1000H,之后,不能再对X1重新赋值;为X2赋值1000H,之后,可
17、寄存器DX和AX的内容构成32位数,DX内容为高16位,AX内容为低16位,以再对X2重新赋值。 编写程序段:
1)将该32位数左移两位,并将移出的高位保存在CL的低两位中; 2)将该32位数右移两位,并将移出的低位保存在BL的低两位中。
3、分析操作符有哪几种?分别举例加以说明。
解:(1)SEG [符号名] 如:MOV AX,SEG DATA (2)OFFSET [符号名] 如:MOV AX,OFFSET DAT
数据段中以变址寄存器SI为偏移地址的内存单元中连续存放着十个字节压缩型BCD (3)TYPE [符号名] 如:MOV AX,TYPE A 码,编程求它们的BCD和,要求结果存放到AX中。
(4)SIZE [符号名] 如:MOV AX,SIZE D1 (5)LENGTH [符号名] 如:MOV AX,LENGTH D1
注:DATA 是段名;DAT是定义的变量名;A是定义的数据类型变量名;D1是用DUP()定义的变量名。
4、8086/8088汇编语言程序中段的类型有几种,各段如何定义?段定义中,定位类型、组合类型、类别名各起什么作用,各有什么含义?
第五章 习题
1、下列语句在存储器中分别为变量分配多少字节?
VR1 DW 9
VR2 DW 4 DUP(?),2 CONT EQU 10
5、宏定义如下,请问要把BX寄存器左移4位,如何进行宏调用?
SHIFT MACRO X,Y,Z MOV CL,X SA&Y Z,CL ENDM
8