15年初出了个差,到现在才回到园子里……工作忙一方面,另外确实好久没搞这些东西了。
原本想在8051单片机上搞个分时操作系统,所以看了下8051汇编下代码,总结记录如下:
LJMP C:0149 //长跳转到0x0149地址开始执行命令,这条命令位于0x0000地址,是第一条命令。
MOV R0,#0x7F //把立即数赋值给R0寄存器
CLR A //目前看是清空寄存器A
MOV @R0,A //把R0作为地址,对其内容赋值为0.
DJNZ R0,C:014C //如果R0减1后不为0,就跳转到014C的地址执行命令,目前看这条命令的配合上一条命令能轻松完成指定内存段的初始化工作,按字节完成。但是目前看0地址是不会初始化的。
MOV SP,#0x17 //SP是栈指针寄存器,指向栈顶。将0x17的值赋给SP
LJMP C:0190 //跳转到0x0190的地址执行命令。
MOV DPTR,#0x028E //DPTR是16位寄存器,用于保存片外RAM的地址。
CLR A //目前看是清空寄存器A
MOV R6,#0x01 //把立即数赋值给R6寄存器
MOVC A,@A+DPTR //MOVC用于从ROM中获取数据,A+DPTR的值作为地址,然后将这个地址的存储的值赋值给A
JZ C:0155 //根据寄存器(累加器结果,也就是A)标志位决定跳转结果,为0跳转,非0不跳转。
INC DPTR //为DPTR寄存器的值+1
MOV R7,A //将A的值赋给R7
ANL A,#0x3F //将寄存器A中的值和立即数进行与操作,结果保存在A中
JNB 0xE0.5,01A9 //E0是ACC寄存器的地址,如果ACC的第5位是0的时候,就跳转01A9执行,否则顺序执行。
XCH A,R7 //将A和R7中的数值互换
ANL A,#0xC0 //将寄存器A中的值和立即数进行与操作,结果保存在A中
ADD A,ACC //A的自加操作
JZ C:0158 //在A寄存器=0的时候,跳转到0158地址执行命令。
JC C:016A //进位位为1则跳转,否则不跳转
CLR A
MOVC A,@A+DPTR //MOVC用于从ROM中获取数据,A+DPTR的值作为地址,然后将这个地址的存储的值赋值给A
INC DPTR //DPTR+1
MOV R2,A //将A的值赋值到R2寄存器
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R0,A
CLR A
MOVC A,@A+DPTR
INC DPTR
XCH A,R0
XCH A,DPL
XCH A,R0
XCH A,R2
XCH A,DPH
XCH R2
MOVX @DPTR,A
感觉整体还是没看懂这段代码具体要干什么。上面看懂了一段代码是内存初始化的,后面的代码要完成什么功能就真的有点看不懂了。
不过对汇编命令有了较好的理解,也没白忙活。