Hello all,
I'm not entirely sure this is appropriate here, it being an OpenOCD
developer's list and not an ARM developer's list as such :-(
However, I was wondering how many of you actually code in ARM
assembler? Do you avoid it wherever you can, using a "high-level"
language and gcc?
For those that do do assembly code, do you have a Good (TM)
disassembler?
The armv4_5 disassemble command is fine, in that it disassembles,
but as I mentioned a while back, it doesn't produce what I would have
written as an assembly code routine :-)
So, I've written a quick 2-pass assembly code post-processor in Perl,
and was wondering if anyone else had any interest in it.
So far, it does this:
a) identifies subroutine calls (ie. BL)
b) identifies returns (e.g. BX R14; LDMFD R13!, {r0, r1, r15}; )
c) identifies labels (e.g BNE 0x00001234)
d) identifies PC-relative addressed data
e) locates the definition of the base register (e.g. LDR r0, [r15,
#0x18]; ... STR r0, [r2] )
It prints out the marked up assembly code on the second pass.
Thus:
0x0000072c 0xe59f3088 LDR r3, [r15, #0x88]
0x00000730 0xe1540003 CMP r4, r3
0x00000734 0x1a000009 BNE 0x00000760
0x00000738 0xe3a00501 MOV r0, #0x400000
0x0000073c 0xe3a01001 MOV r1, #0x1
0x00000740 0xeb000174 BL 0x00000d18
0x00000744 0xe3a00501 MOV r0, #0x400000
0x00000748 0xe3a01000 MOV r1, #0x0
0x0000074c 0xeb000171 BL 0x00000d18
0x00000750 0xe3a02000 MOV r2, #0x0
0x00000754 0xe59f303c LDR r3, [r15, #0x3c]
0x00000758 0xe58320ac STR r2, [r3, #0xac]
0x0000075c 0xe89da810 LDMIA r13, {r4, r11, r13, r15}
0x00000760 0xe59f3058 LDR r3, [r15, #0x58]
0x00000764 0xe1540003 CMP r4, r3
0x00000768 0x189da810 LDMNEIA r13, {r4, r11, r13, r15}
0x0000076c 0xe3a00502 MOV r0, #0x800000
0x00000770 0xe3a01001 MOV r1, #0x1
0x00000774 0xeb000167 BL 0x00000d18
0x00000778 0xe3a00502 MOV r0, #0x800000
0x0000077c 0xe3a01000 MOV r1, #0x0
0x00000780 0xeb000164 BL 0x00000d18
0x00000784 0xe3a02000 MOV r2, #0x0
0x00000788 0xe59f3008 LDR r3, [r15, #0x8]
0x0000078c 0xe58320ac STR r2, [r3, #0xac]
0x00000790 0xe89da810 LDMIA r13, {r4, r11, r13, r15}
0x00000794 0x58006000 STMPLDA r0, {r13, r14
0x00000798 0x5c002000 UNDEFINED INSTRUCTION
0x0000079c 0x58007000 STMPLDA r0, {r12, r13, r14}
Becomes:
0x0000072c 0xe59f3088 LDR r3, [r15, #0x88] ; data at
0x000007bc: 0x5800e000
0x00000730 0xe1540003 CMP r4, r3
0x00000734 0x1a000009 BNE 0x00000760 ; branch to
label_26 at: 0x00000760
0x00000738 0xe3a00501 MOV r0, #0x400000
0x0000073c 0xe3a01001 MOV r1, #0x1
0x00000740 0xeb000174 BL 0x00000d18 ; call
subroutine_7 at: 0x00000d18
0x00000744 0xe3a00501 MOV r0, #0x400000
0x00000748 0xe3a01000 MOV r1, #0x0
0x0000074c 0xeb000171 BL 0x00000d18 ; call
subroutine_7 at: 0x00000d18
0x00000750 0xe3a02000 MOV r2, #0x0
0x00000754 0xe59f303c LDR r3, [r15, #0x3c] ; data at
0x00000798: 0x5c002000
0x00000758 0xe58320ac STR r2, [r3, #0xac] ; Base
defined at 0x00000754
0x0000075c 0xe89da810 LDMIA r13, {r4, r11, r13, r15} ; Return
from subroutine
label_26:
0x00000760 0xe59f3058 LDR r3, [r15, #0x58] ; data at
0x000007c0: 0x5800f000
0x00000764 0xe1540003 CMP r4, r3
0x00000768 0x189da810 LDMNEIA r13, {r4, r11, r13, r15} ; Return
from subroutine
0x0000076c 0xe3a00502 MOV r0, #0x800000
0x00000770 0xe3a01001 MOV r1, #0x1
0x00000774 0xeb000167 BL 0x00000d18 ; call
subroutine_7 at: 0x00000d18
0x00000778 0xe3a00502 MOV r0, #0x800000
0x0000077c 0xe3a01000 MOV r1, #0x0
0x00000780 0xeb000164 BL 0x00000d18 ; call
subroutine_7 at: 0x00000d18
0x00000784 0xe3a02000 MOV r2, #0x0
0x00000788 0xe59f3008 LDR r3, [r15, #0x8] ; data at
0x00000798: 0x5c002000
0x0000078c 0xe58320ac STR r2, [r3, #0xac] ; Base
defined at 0x00000788
0x00000790 0xe89da810 LDMIA r13, {r4, r11, r13, r15} ; Return
from subroutine
0x00000794 0x58006000 DATA <STMPLDA r0, {r13, r14}>
0x00000798 0x5c002000 DATA <UNDEFINED INSTRUCTION>
0x0000079c 0x58007000 DATA <STMPLDA r0, {r12, r13, r14}>
Which should soon become:
0x0000072c 0xe59f3088 LDR r3, data_1 <0x5800e000 =? non_buffered
APB0 + GPIO_PORT_P8>
0x00000730 0xe1540003 CMP r4, r3
0x00000734 0x1a000009 BNE label_26
0x00000738 0xe3a00501 MOV r0, #0x400000
0x0000073c 0xe3a01001 MOV r1, #0x1
0x00000740 0xeb000174 BL subroutine_7
0x00000744 0xe3a00501 MOV r0, #0x400000
0x00000748 0xe3a01000 MOV r1, #0x0
0x0000074c 0xeb000171 BL subroutine_7
0x00000750 0xe3a02000 MOV r2, #0x0
0x00000754 0xe59f303c LDR r3, data_2 <0x5c002000 =? non_buffered
APB1 + SCU>
0x00000758 0xe58320ac STR r2, [NB_APB1_SCU, SCU_GPIOEMI]
0x0000075c 0xe89da810 LDMIA r13, {r4, r11, r13, r15} ; Return
from subroutine
label_26:
0x00000760 0xe59f3058 LDR r3, data_3 <0x5800f000 =? non_buffered
APB0 + GPIO_PORT_P9>
0x00000764 0xe1540003 CMP r4, r3
0x00000768 0x189da810 LDMNEIA r13, {r4, r11, r13, r15} ; Return
from subroutine
0x0000076c 0xe3a00502 MOV r0, #0x800000
0x00000770 0xe3a01001 MOV r1, #0x1
0x00000774 0xeb000167 BL subroutine_7
0x00000778 0xe3a00502 MOV r0, #0x800000
0x0000077c 0xe3a01000 MOV r1, #0x0
0x00000780 0xeb000164 BL subroutine_7
0x00000784 0xe3a02000 MOV r2, #0x0
0x00000788 0xe59f3008 LDR r3, data_4 <0x5c002000 =? non_buffered
APB1 + SCU>
0x0000078c 0xe58320ac STR r2, [NB_APB1_SCU, SCU_GPIOEMI]
0x00000790 0xe89da810 LDMIA r13, {r4, r11, r13, r15} ; Return
from subroutine
0x00000794 0x58006000 DATA <STMPLDA r0, {r13, r14}>
0x00000798 0x5c002000 DATA <UNDEFINED INSTRUCTION>
0x0000079c 0x58007000 DATA <STMPLDA r0, {r12, r13, r14}>
--colin
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development