2000H到200FH中的内容
2100H显示找3个0
问题回答:若需查找0FFH,只需修改语句JZ LOOP1,将该语句改为CJNZ R0, #0FFH, LOOP1即可,即数据等于0FFH时跳转到计数+1的程序段进行计数。
六、实验源程序
ORG 0000H LJMP S06 ORG 0AA0H S06: MOV DPTR, #2000H MOV R0, #10H MOV R1, #00H LOOP: MOVX A, @DPTR JZ LOOP1 INC DPTR DEC R0 AJMP LOOP2 LOOP1: INC DPTR DEC R0 INC R1
LOOP2: CJNE R0, #00H, LOOP MOV DPTR, #2100H MOV A, R1 MOVX @DPTR, A END
实验七 无符号双字节快速乘法子程序
一、实验目的
掌握MCS-51汇编语言程序设计方法。
-8-
二、实验内容
将(R2 R3)和(R6 R7)中双字节无符号整数相乘,乘积送R4 R5 R6 R7中。
三、程序框图
四、实验过程
本程序是利用单字节的乘法指令MUL,根据下面的公式实现双字节数的乘法。
(R2 R3)×(R6 R7)
= ((R2)×28+(R3))×((R6)×28+(R7))
= (R2)×(R6)×216+(R2)×(R7)+(R3)×(R6)×28+(R3)*(R7)
将乘数与被乘数高低字节拆开分别相乘,然后再将每个高字节因子向前移动8位进行调整,进行加权求和。利用ADDC语句可实现带进位的加法运算。得到的最终结果存入R4、R5、R6、R7寄存器中。
五、实验结果及分析
相乘前寄存器内容 相乘后寄存器内容
问题回答:寄存器R2、R3、R6、R7分别输入01、10、11、10,运行程序,即进行0110H×1110H的运算,得到结果为00122100H存放在R4、R5、R6、R7寄存器中,故R4、R6中的内容是00H和21H。
六、实验源程序
ORG 0000H LJMP S07 ORG 0970H S07: MOV R2, #02H MOV R3, #30H
-9-
MOV R6, #13H MOV R7, #16H MOV A, R3 MOV B, R7 MUL AB XCH A, R7 MOV R5, B MOV B, R2 MUL AB ADD A, R5 MOV R4, A CLR A ADDC A, B MOV R5, A MOV A, R6 MOV B, R3 MUL AB ADD A, R4 XCH A, R6 XCH A, B ADDC A, R5 MOV R5, A MOV F0, C MOV A, R2 MUL AB ADD A, R5 MOV R5, A CLR A MOV ACC.0, C MOV C, F0 ADDC A, B MOV R4, A END
-10-
实验八 多分支程序
一、实验目的
掌握汇编语言的编程。
二、实验内容
编写程序,根据送入的数据转移运行。
三、程序框图
四、实验过程
实验中利用散转指令JMP @A+DPTR实现程序的多分支跳转,这里A为变址寄存器,DPTR为基址寄存器。跳转到不同分支的运行结果由LED进行显示,每个分支对应的数码管上显示不同的数字。显示数字由数字七段码送至I/O口显示。在显示程序中利用循环左移加延时子程序调用,实现数字循环显示的效果。
编程中需要注意的是,A需乘以2即左移一位再加上A之后再作为变址寄存器,这是程序中由于分支跳转语句为3个字节所致。
五、实验结果及分析
实验中可以看到选择不同的数字进入不同分支,LED管上会出现不同数字的循环左移显示。
问题回答:如需将循环速度减慢,只要将延时子程序初值变大,即在调用延时子程序之前给R2传送一个更大的值,或增加循环嵌套层数,或者再加一段循环程序即可,如可以进行如下两种修改:
(1)、在主程序中将MOV R2, #20H改为MOV R2, #50H。 (2)、将延时子程序做如下修改:
DEYS: PUSH 02H 改为 DEYS: PUSH 02H DEY0: PUSH 02H DEY0: PUSH 02H DEY1: PUSH 02H DEY1: PUSH 02H DJNZ R2, $ DEY2: PUSH 02H POP 02H DJNZ R2, $ DJNZ R2, DEY1 POP 02H POP 02H DJNZ R2, DEY2 DJNZ R2, DEY0 POP 02H POP 02H DJNZ R2, DEY1 DJNZ R2, DEYS POP 02H RET DJNZ R2, DEY0
-11-