Mercurial > pub > dyncall > dyncall
view doc/disas_examples/arm.darwin_thumb.disas @ 327:c0390dc85a07
- doc: added disassembly examples for many platforms and calling conventions, for reference
author | Tassilo Philipp |
---|---|
date | Fri, 22 Nov 2019 23:08:59 +0100 |
parents | |
children |
line wrap: on
line source
; void leaf_call(int b, int c, int d, int e, int f, int g, int h) ; { ; } ; ; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h) ; { ; /* use some local data */ ; char x = 'L'; ; leaf_call(b, c, d, e, f, g, h); ; } ; ; int main() ; { ; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7); ; return 0; ; } ; output from iOS 6 w/ clang 3.7.1, dumped with llvm-objdump -triple thumbv7-unknown-unknown-macho ... _leaf_call: 0: 80 b5 push {r7, lr} 2: 6f 46 mov r7, sp 4: 87 b0 sub sp, #28 6: d7 f8 10 90 ldr.w r9, [r7, #16] a: d7 f8 0c c0 ldr.w r12, [r7, #12] e: d7 f8 08 e0 ldr.w lr, [r7, #8] 12: 06 90 str r0, [sp, #24] 14: 05 91 str r1, [sp, #20] 16: 04 92 str r2, [sp, #16] 18: 03 93 str r3, [sp, #12] 1a: cd f8 08 e0 str.w lr, [sp, #8] 1e: cd f8 04 c0 str.w r12, [sp, #4] 22: cd f8 00 90 str.w r9, [sp] 26: 07 b0 add sp, #28 28: 80 bd pop {r7, pc} _nonleaf_call: 2a: b0 b5 push {r4, r5, r7, lr} 2c: 02 af add r7, sp, #8 2e: 8c b0 sub sp, #48 30: d7 f8 14 90 ldr.w r9, [r7, #20] 34: d7 f8 10 c0 ldr.w r12, [r7, #16] 38: d7 f8 0c e0 ldr.w lr, [r7, #12] 3c: bc 68 ldr r4, [r7, #8] 3e: 4c 25 movs r5, #76 40: 0b 90 str r0, [sp, #44] 42: 0a 91 str r1, [sp, #40] 44: 09 92 str r2, [sp, #36] 46: 08 93 str r3, [sp, #32] 48: 07 94 str r4, [sp, #28] 4a: cd f8 18 e0 str.w lr, [sp, #24] 4e: cd f8 14 c0 str.w r12, [sp, #20] 52: cd f8 10 90 str.w r9, [sp, #16] 56: 07 f8 29 5c strb r5, [r7, #-41] 5a: 0a 98 ldr r0, [sp, #40] 5c: 09 99 ldr r1, [sp, #36] 5e: 08 9a ldr r2, [sp, #32] 60: 07 9b ldr r3, [sp, #28] 62: dd f8 18 90 ldr.w r9, [sp, #24] 66: dd f8 14 c0 ldr.w r12, [sp, #20] 6a: dd f8 10 e0 ldr.w lr, [sp, #16] 6e: cd f8 00 90 str.w r9, [sp] 72: cd f8 04 c0 str.w r12, [sp, #4] 76: cd f8 08 e0 str.w lr, [sp, #8] 7a: ff f7 c1 ff bl #-126 7e: 0c b0 add sp, #48 80: b0 bd pop {r4, r5, r7, pc} _main: 82: 90 b5 push {r4, r7, lr} 84: 01 af add r7, sp, #4 86: 85 b0 sub sp, #20 88: 00 20 movs r0, #0 8a: 01 21 movs r1, #1 8c: 02 22 movs r2, #2 8e: 03 23 movs r3, #3 90: 40 f2 04 09 movw r9, #4 94: 40 f2 05 0c movw r12, #5 98: 40 f2 06 0e movw lr, #6 9c: 07 24 movs r4, #7 9e: 04 90 str r0, [sp, #16] a0: cd f8 00 90 str.w r9, [sp] a4: cd f8 04 c0 str.w r12, [sp, #4] a8: cd f8 08 e0 str.w lr, [sp, #8] ac: 03 94 str r4, [sp, #12] ae: ff f7 bc ff bl #-136 b2: 00 20 movs r0, #0 b4: 05 b0 add sp, #20 b6: 90 bd pop {r4, r7, pc} ; ----------------- with spilling -------------> ; #include <stdarg.h> ; ; void leaf_call(int b, int c, int d, int e, int f, int g, int h) ; { ; } ; ; void nonleaf_call(int a, ...) ; { ; int b,c,d,e,f,g,h; ; va_list ap; ; va_start(ap,a); ; b = va_arg(ap,int); ; c = va_arg(ap,int); ; d = va_arg(ap,int); ; e = va_arg(ap,int); ; f = va_arg(ap,int); ; g = va_arg(ap,int); ; h = va_arg(ap,int); ; /* use some local data */ ; char x = 'L'; ; leaf_call(b,c,d,e,f,g,h); ; } ; ; int main() ; { ; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7); ; return 0; ; } ; output from iOS 6 w/ clang 3.7.1, dumped with llvm-objdump -triple thumbv7-unknown-unknown-macho ... _leaf_call: 0: 80 b5 push {r7, lr} 2: 6f 46 mov r7, sp 4: 87 b0 sub sp, #28 6: d7 f8 10 90 ldr.w r9, [r7, #16] a: d7 f8 0c c0 ldr.w r12, [r7, #12] e: d7 f8 08 e0 ldr.w lr, [r7, #8] 12: 06 90 str r0, [sp, #24] 14: 05 91 str r1, [sp, #20] 16: 04 92 str r2, [sp, #16] 18: 03 93 str r3, [sp, #12] 1a: cd f8 08 e0 str.w lr, [sp, #8] 1e: cd f8 04 c0 str.w r12, [sp, #4] 22: cd f8 00 90 str.w r9, [sp] 26: 07 b0 add sp, #28 28: 80 bd pop {r7, pc} _nonleaf_call: 2a: 83 b0 sub sp, #12 ; | space for spill area (b/c pushing was apparently too easy) 2c: 80 b5 push {r7, lr} ; | 2e: 6f 46 mov r7, sp ; | 30: 8d b0 sub sp, #52 ; | prolog 32: 3b 61 str r3, [r7, #16] ; | | 34: fa 60 str r2, [r7, #12] ; | | spill (before reg save area) 36: b9 60 str r1, [r7, #8] ; | | 38: 4c 21 movs r1, #76 3a: 0b aa add r2, sp, #44 3c: 0c 90 str r0, [sp, #48] 3e: 07 f1 08 00 add.w r0, r7, #8 42: 10 60 str r0, [r2] 44: 0b 98 ldr r0, [sp, #44] 46: 02 1d adds r2, r0, #4 48: 0b 92 str r2, [sp, #44] 4a: 00 68 ldr r0, [r0] 4c: 0a 90 str r0, [sp, #40] 4e: 0b 98 ldr r0, [sp, #44] 50: 02 1d adds r2, r0, #4 52: 0b 92 str r2, [sp, #44] 54: 00 68 ldr r0, [r0] 56: 09 90 str r0, [sp, #36] 58: 0b 98 ldr r0, [sp, #44] 5a: 02 1d adds r2, r0, #4 5c: 0b 92 str r2, [sp, #44] 5e: 00 68 ldr r0, [r0] 60: 08 90 str r0, [sp, #32] 62: 0b 98 ldr r0, [sp, #44] 64: 02 1d adds r2, r0, #4 66: 0b 92 str r2, [sp, #44] 68: 00 68 ldr r0, [r0] 6a: 07 90 str r0, [sp, #28] 6c: 0b 98 ldr r0, [sp, #44] 6e: 02 1d adds r2, r0, #4 70: 0b 92 str r2, [sp, #44] 72: 00 68 ldr r0, [r0] 74: 06 90 str r0, [sp, #24] 76: 0b 98 ldr r0, [sp, #44] 78: 02 1d adds r2, r0, #4 7a: 0b 92 str r2, [sp, #44] 7c: 00 68 ldr r0, [r0] 7e: 05 90 str r0, [sp, #20] 80: 0b 98 ldr r0, [sp, #44] 82: 02 1d adds r2, r0, #4 84: 0b 92 str r2, [sp, #44] 86: 00 68 ldr r0, [r0] 88: 04 90 str r0, [sp, #16] 8a: 07 f8 25 1c strb r1, [r7, #-37] 8e: 0a 98 ldr r0, [sp, #40] 90: 09 99 ldr r1, [sp, #36] 92: 08 9a ldr r2, [sp, #32] 94: 07 9b ldr r3, [sp, #28] 96: dd f8 18 90 ldr.w r9, [sp, #24] 9a: dd f8 14 c0 ldr.w r12, [sp, #20] 9e: dd f8 10 e0 ldr.w lr, [sp, #16] a2: cd f8 00 90 str.w r9, [sp] a6: cd f8 04 c0 str.w r12, [sp, #4] aa: cd f8 08 e0 str.w lr, [sp, #8] ae: ff f7 a7 ff bl #-178 b2: 0d b0 add sp, #52 b4: bd e8 80 40 pop.w {r7, lr} b8: 03 b0 add sp, #12 ba: 70 47 bx lr _main: bc: 90 b5 push {r4, r7, lr} be: 01 af add r7, sp, #4 c0: 85 b0 sub sp, #20 c2: 00 20 movs r0, #0 c4: 01 21 movs r1, #1 c6: 02 22 movs r2, #2 c8: 03 23 movs r3, #3 ca: 40 f2 04 09 movw r9, #4 ce: 40 f2 05 0c movw r12, #5 d2: 40 f2 06 0e movw lr, #6 d6: 07 24 movs r4, #7 d8: 04 90 str r0, [sp, #16] da: cd f8 00 90 str.w r9, [sp] de: cd f8 04 c0 str.w r12, [sp, #4] e2: cd f8 08 e0 str.w lr, [sp, #8] e6: 03 94 str r4, [sp, #12] e8: ff f7 9f ff bl #-194 ec: 00 20 movs r0, #0 ee: 05 b0 add sp, #20 f0: 90 bd pop {r4, r7, pc} ; vim: ft=asm68k