MCS-51汇编软件实验
实验一 内存块移动
将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去。移动3000H起始的256个字节到4000H起始的256个字节。
代码示例:
ORG 0000H
MOV DPTR,#3000H ;起始指定源地址
MOV A,#0 ;累加器A赋初值值
MOV R4,#0 ;循环判断,初值为0,减一后借位变FFH,总循环256次
LOOP:
MOVX @DPTR,A ;累加器A赋值给地址为DPTR内容的单元
INC DPTR ;DPTR内容加一,即地址从3000H移动
INC A ;累加器加一,
DJNZ R4,LOOP ;R4减一后不为,则跳转到LOOP继续执行
;即完成3000H,3001H等单元依次赋值为00H,01H等
MOV R0,#30H ;给R0~R3赋值
MOV R1,#00H
MOV R2,#40H
MOV R3,#00H
MOV R5,#0
LOOP1:
MOV DPH,R0 ;将R0的内容赋给DPTR寄存器的高八位
MOV DPL,R1 ;将R1的内容赋给DPTR寄存器的低八位,(DPTR)=3000H
MOVX A,@DPTR ;3000H单元的内容赋给累加器
MOV DPH,R2
MOV DPL,R3 ;(DPTR)=4000H
MOVX @DPTR,A ;累加器A(3000H单元)的内容赋给4000H单元
CJNE R1,#0FFH,LOOP2 ;R1不为FFH则跳到LOOP2
LOOP2:
INC R1 ;R1加一,即源地址加一
CJNE R3,#0FFH,LOOP3 ;R3不为FFH则跳转到LOOP3
LOOP3:
INC R3 ;R3加一,即目标地址加一
DJNZ R5,LOOP1 ;R5减一后不为,则跳转到LOOP1继续执行
LJMP $
END
结果:
3000H起始存储块内容:
4000H起始存储块内容:
实验二 数据排序
本例程采用冒泡排序法将内部RAM中的50~59H单元中的10个单字节无符号二进制数按从小到大的次序排列,并将这一列排序后的数据从小到大依次存贮到外部RAM 1000H开始处。
代码示例:
ORG 0000H
JMP MAIN
ORG 0100H
MAIN: ;从50H单元开始赋值
MOV 50H,#5FH
MOV 51H,#56H
MOV 52H,#5AH
MOV 53H,#5EH
MOV 54H,#51H
MOV 55H,#5BH
MOV 56H,#53H
MOV 57H,#58H
MOV 58H,#57H
MOV 59H,#55H
MOV R2,#9 ;判断内循环
MOV R3,#10 ;判断外循环
MOV R1,#50H ;内部RAM地址
MOV R5,#10 ;内部RAM转移到外部RAM循环判断
MOV DPTR,#1000H ;外部RAM地址
NOP ;用于设置断点查看赋值是否成功
LOOP1: ;一次外循环结束后跳到这里重新赋值,执行内循环
MOV R2,#9
MOV R0,#50H
LOOP2: ;比较两个数是否相等
MOV A,@R0 ;A存放前面一个单元的内容
INC R0
MOV B,@R0 ;B存放后一个单元的内容
CLR C ;清除进位标志
CJNE A,B,LOOP4 ;两个数不相等则跳转,并且CY有值
LOOP3:
DJNZ R2,LOOP2 ;内循环条件,R2不等于0跳回LOOP2执行
DJNZ R3,LOOP1 ;外循环条件
LJMP LOOP
LOOP4: ;若A大于B,则交换位置
JC LOOP3 ;A小于B,有借位,不交换位置,跳转
XCH A,B ;交换A,B的内容
DEC R0 ;R0寄存器减一
MOV @R0,A ;A(较小)的值放到前一个单元
INC R0 ;R0寄存器加一
MOV @R0,B ;B(较大)的值放到后一个单元
LJMP LOOP3 ;跳到循环判断LOOP3
LOOP: ;内部RAM50H转移到外部RAM1000H
MOV A,@R1
MOVX @DPTR,A
INC R1 ;地址加一
INC DPTR
DJNZ R5,LOOP ;循环10次转移
SJMP $
END
结果:
50H起始单元赋值乱序结果:
50H起始单元赋值后排序结果:
片外1000H起始单元排序结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)