Mercurial > pub > dyncall > dyncall
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/disas_examples/arm.darwin_thumb.disas Fri Nov 22 23:08:59 2019 +0100 @@ -0,0 +1,235 @@ +; 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 +