ORG 0000H NUM EQU 10 RAM_BEGIN_ADDR EQU 30H MOV R0,#NUM MOV R1,#RAM_BEGIN_ADDR MOV R2,#00H CLR A MOV DPTR,#NUM_TAB ROM_TO_RAM:MOVC A,@A+DPTR MOV @R1,A INC R1 INC R2 MOV A,R2 DJNZ R0,ROM_TO_RAM START_NUM_ADDR EQU 30H NEXT_NUM_ADDR EQU START_NUM_ADDR+1 EXCHANGE_NUM_MAX EQU 09H TEMP_ADDR EQU 10H MOV TEMP_ADDR,#EXCHANGE_NUM_MAX SORT0:MOV R2,TEMP_ADDR MOV R0,#START_NUM_ADDR MOV R1,#NEXT_NUM_ADDR SORT1: MOV A,@R1 CLR C SUBB A,@R0 JNC NEXT MOV A,@R0 XCH A,@R1 XCH A,@R0 NEXT: INC R0 INC R1 DJNZ R2,SORT1 DJNZ TEMP_ADDR,SORT0 SJMP $ NUM_TAB:DB 0,15,16,64,84,100,156,211,200,18 END解释每一条语句
时间: 2024-02-14 08:20:36 浏览: 78
ORG 0000H ;将程序的起始地址设置为0000H
NUM EQU 10 ;定义常量NUM为10
RAM_BEGIN_ADDR EQU 30H ;定义常量RAM_BEGIN_ADDR为30H
MOV R0,#NUM ;将NUM的值10存入寄存器R0中
MOV R1,#RAM_BEGIN_ADDR ;将RAM_BEGIN_ADDR的值30H存入寄存器R1中
MOV R2,#00H ;将00H存入寄存器R2中
CLR A ;将累加器A清零
MOV DPTR,#NUM_TAB ;将NUM_TAB的地址存入数据指针DPTR中
ROM_TO_RAM: ;标签ROM_TO_RAM
MOVC A,@A+DPTR ;将DPTR+A的值所指向的数据存入累加器A中
MOV @R1,A ;将累加器A中的值存入R1所指向的RAM中
INC R1 ;将R1的值加1
INC R2 ;将R2的值加1
MOV A,R2 ;将寄存器R2中的值存入累加器A中
DJNZ R0,ROM_TO_RAM ;如果R0不为0,则跳转到标签ROM_TO_RAM处继续执行
START_NUM_ADDR EQU 30H ;定义常量START_NUM_ADDR为30H
NEXT_NUM_ADDR EQU START_NUM_ADDR+1 ;定义常量NEXT_NUM_ADDR为START_NUM_ADDR+1
EXCHANGE_NUM_MAX EQU 09H ;定义常量EXCHANGE_NUM_MAX为09H
TEMP_ADDR EQU 10H ;定义常量TEMP_ADDR为10H
MOV TEMP_ADDR,#EXCHANGE_NUM_MAX ;将EXCHANGE_NUM_MAX的值09H存入TEMP_ADDR中
SORT0: ;标签SORT0
MOV R2,TEMP_ADDR ;将TEMP_ADDR的值存入R2中
MOV R0,#START_NUM_ADDR ;将START_NUM_ADDR的值30H存入R0中
MOV R1,#NEXT_NUM_ADDR ;将NEXT_NUM_ADDR的值(即31H)存入R1中
SORT1: ;标签SORT1
MOV A,@R1 ;将R1所指向的RAM中的值存入累加器A中
CLR C ;清除进位标志位C
SUBB A,@R0 ;将R0所指向的RAM中的值减去累加器A中的值,并将结果存入累加器A中
JNC NEXT ;如果无进位标志位,则跳转到标签NEXT处继续执行
MOV A,@R0 ;将R0所指向的RAM中的值存入累加器A中
XCH A,@R1 ;将R1所指向的RAM中的值存入累加器A中,并将累加器A中原有的值存入R1所指向的RAM中
XCH A,@R0 ;将R0所指向的RAM中的值存入累加器A中,并将累加器A中原有的值存入R0所指向的RAM中
NEXT: ;标签NEXT
INC R0 ;将R0的值加1
INC R1 ;将R1的值加1
DJNZ R2,SORT1 ;如果R2不为0,则跳转到标签SORT1处继续执行
DJNZ TEMP_ADDR,SORT0 ;如果TEMP_ADDR不为0,则跳转到标签SORT0处继续执行
SJMP $ ;无条件跳转到当前指令处继续执行
NUM_TAB:DB 0,15,16,64,84,100,156,211,200,18 ;定义一个字节数组NUM_TAB,并初始化
END ;程序结束
阅读全文