|
楼主 |
发表于 2007-5-8 11:41:40
|
显示全部楼层
iccavr版本6.30C avrstudio版本4.13
经过avrstudio反汇编发现,复位后程序直接跳转到06F1处,为何?0x06F1到0x0711之间为启动代码,其主要功能为初始化硬件和软件堆栈指针,bss 区全部初始化为零,从idata 区拷贝初始化数据到直接寻址数据区data 区,调用main 函数,定义main函数退出点等。
我的理解是启动代码应该是在中断向量表之后的,即0x48处开始,请马老师指点指点。
反汇编代码如下:
+00000000: 940C06F1 JMP 0x000006F1 Jump
+00000002: FFFF ??? Data or unknown opcode
-------
-------
+00000048: 0007 ??? Data or unknown opcode
+00000049: 800A LDD R0,Y+2 Load indirect with displacement
+0000004A: 6032 ORI R19,0x02 Logical OR with immediate
+0000004B: 18C2 SUB R12,R2 Subtract without carry
+0000004C: E03F LDI R19,0x0F Load immediate
+0000004D: 2020 AND R2,R0 Logical AND
+0000004E: E03F LDI R19,0x0F Load immediate
+0000004F: 2020 AND R2,R0 Logical AND
+00000050: E03F LDI R19,0x0F Load immediate
+00000051: 0000 NOP No operation
+00000052: F8FF ??? Data or unknown opcode
+00000053: 0000 NOP No operation
+00000054: 0084 ??? Data or unknown opcode
+00000055: F067 BRIE PC+0x0D Branch if interrupt enabled
+00000056: 1024 CPSE R2,R4 Compare, skip if equal
+00000057: 1008 CPSE R0,R8 Compare, skip if equal
+00000058: D007 RCALL PC+0x0008 Relative call subroutine
+00000059: 50E4 SUBI R30,0x04 Subtract immediate
+0000005A: 5024 SUBI R18,0x04 Subtract immediate
+0000005B: D027 RCALL PC+0x0028 Relative call subroutine
+0000005C: 5024 SUBI R18,0x04 Subtract immediate
+0000005D: 5024 SUBI R18,0x04 Subtract immediate
+0000005E: D02F RCALL PC+0x0030 Relative call subroutine
+0000005F: 1030 CPSE R3,R0 Compare, skip if equal
+00000060: 6020 ORI R18,0x00 Logical OR with immediate
+00000061: 0000 NOP No operation
--------------
--------------
+000006F1: EFCF SER R28 Set Register
+000006F2: E1D0 LDI R29,0x10 Load immediate
+000006F3: BFCD OUT 0x3D,R28 Out to I/O location
+000006F4: BFDE OUT 0x3E,R29 Out to I/O location
+000006F5: 51C0 SUBI R28,0x10 Subtract immediate
+000006F6: 40D0 SBCI R29,0x00 Subtract immediate with carry
+000006F7: EA0A LDI R16,0xAA Load immediate
+000006F8: 8308 STD Y+0,R16 Store indirect with displacement
+000006F9: 2400 CLR R0 Clear Register
+000006FA: E4E8 LDI R30,0x48 Load immediate
+000006FB: E0F1 LDI R31,0x01 Load immediate
+000006FC: E019 LDI R17,0x09 Load immediate
+000006FD: 37EF CPI R30,0x7F Compare with immediate
+000006FE: 07F1 CPC R31,R17 Compare with carry
+000006FF: F011 BREQ PC+0x03 Branch if equal
+00000700: 9201 ST Z+,R0 Store indirect and postincrement
+00000701: CFFB RJMP PC-0x0004 Relative jump
+00000702: 8300 STD Z+0,R16 Store indirect with displacement
+00000703: E9EA LDI R30,0x9A Load immediate
+00000704: E0FD LDI R31,0x0D Load immediate
+00000705: E0A0 LDI R26,0x00 Load immediate
+00000706: E0B1 LDI R27,0x01 Load immediate
+00000707: E01D LDI R17,0x0D Load immediate
+00000708: 3EE2 CPI R30,0xE2 Compare with immediate
+00000709: 07F1 CPC R31,R17 Compare with carry
+0000070A: F021 BREQ PC+0x05 Branch if equal
+0000070B: 95C8 LPM Load program memory
+0000070C: 9631 ADIW R30,0x01 Add immediate to word
+0000070D: 920D ST X+,R0 Store indirect and postincrement
+0000070E: CFF9 RJMP PC-0x0006 Relative jump
+0000070F: 940E0712 CALL 0x00000712 Call subroutine
+00000711: CFFF RJMP PC-0x0000 Relative jump
@00000712: main
---- scr\main.c -----------------------------------------------------------------------------------
8: void main(void)
+00000712: 9728 SBIW R28,0x08 Subtract immediate from word
14: INT8U timer0 = 0;
+00000713: 2400 CLR R0 Clear Register
+00000714: 820E STD Y+6,R0 Store indirect with displacement
15: INT32U tmpc = 0;
+00000715: E040 LDI R20,0x00 Load immediate
--------------
-------------- |
|