acqwer 发表于 2012-5-28 10:28 ![]()
256字节的8051,罗叫兽莫非以为8051是8位所以只能放256字节?叫兽还是老老实实的当文员这种有前途的职业吧 ...
data是256字节,xdata只支持间接寻址,两条mov和一条movx指令,movx指令都在3~4个周期。
要命的是堆栈寄存器是8位的,超过8位的堆栈要通过一个函数来模拟16位堆栈。看看8051在进入一个函数前,是怎么保存堆栈的吧
?FUNC_ENTER_XDATA:
0006E5 25 18 ADD A,XSP(L)
0006E7 C5 82 XCH A,DPL
0006E9 C0 E0 PUSH A
0006EB E5 19 MOV A,XSP(H)
0006ED 34 FF ADDC A,#0xFF
0006EF C5 83 XCH A,DPH
0006F1 C0 E0 PUSH A
0006F3 E5 18 MOV A,XSP(L)
0006F5 C3 CLR C
0006F6 95 82 SUBB A,DPL
0006F8 24 F9 ADD A,#0xF9
0006FA F8 MOV R0,A
0006FB E4 CLR A
0006FC C5 A8 XCH A,IE
0006FE 85 83 19 MOV XSP(H),DPH
000701 85 82 18 MOV XSP(L),DPL
000704 C5 A8 XCH A,IE
000706 E8 MOV A,R0
000707 CE XCH A,R6
000708 F0 MOVX @DPTR,A
000709 A3 INC DPTR
00070A E5 20 MOV A,VB
00070C F0 MOVX @DPTR,A
00070D A3 INC DPTR
00070E 78 10 MOV R0,#0x10
000710 E6 MOV A,@R0
000711 08 INC R0
000712 F0 MOVX @DPTR,A
000713 A3 INC DPTR
000714 DE FA DJNZ R6,0x0710
000716 EF MOV A,R7
000717 F0 MOVX @DPTR,A
000718 A3 INC DPTR
000719 E5 81 MOV A,SP
00071B 24 FB ADD A,#0xFB
00071D F8 MOV R0,A
00071E E6 MOV A,@R0
00071F 08 INC R0
000720 F0 MOVX @DPTR,A
000721 A3 INC DPTR
000722 E6 MOV A,@R0
000723 08 INC R0
000724 F0 MOVX @DPTR,A
000725 A3 INC DPTR
000726 08 INC R0
000727 08 INC R0
000728 E6 MOV A,@R0
000729 08 INC R0
00072A F0 MOVX @DPTR,A
00072B A3 INC DPTR
00072C E6 MOV A,@R0
00072D 08 INC R0
00072E F0 MOVX @DPTR,A
00072F A3 INC DPTR
000730 15 81 DEC SP
000732 15 81 DEC SP
000734 D0 E0 POP A
000736 FE MOV R6,A
000737 D0 E0 POP A
000739 F8 MOV R0,A
00073A 15 81 DEC SP
00073C 15 81 DEC SP
00073E E8 MOV A,R0
00073F C0 E0 PUSH A
000741 EE MOV A,R6
000742 C0 E0 PUSH A
000744 22 RET |