Mercurial > pub > dyncall > dyncall
view doc/disas_examples/arm.darwin_arm.disas @ 411:49bc10c99462
- removed nm from (cd test; make), as not an actual conformance test
author | Tassilo Philipp |
---|---|
date | Tue, 05 Oct 2021 22:06:37 +0200 |
parents | c0390dc85a07 |
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 armv7-unknown-unknown-macho ... _leaf_call: 0: 80 40 2d e9 push {r7, lr} 4: 0d 70 a0 e1 mov r7, sp 8: 1c d0 4d e2 sub sp, sp, #28 c: 10 90 97 e5 ldr r9, [r7, #16] 10: 0c c0 97 e5 ldr r12, [r7, #12] 14: 08 e0 97 e5 ldr lr, [r7, #8] 18: 04 00 07 e5 str r0, [r7, #-4] 1c: 08 10 07 e5 str r1, [r7, #-8] 20: 0c 20 07 e5 str r2, [r7, #-12] 24: 0c 30 8d e5 str r3, [sp, #12] 28: 08 e0 8d e5 str lr, [sp, #8] 2c: 04 c0 8d e5 str r12, [sp, #4] 30: 00 90 8d e5 str r9, [sp] 34: 07 d0 a0 e1 mov sp, r7 38: 80 80 bd e8 pop {r7, pc} _nonleaf_call: 3c: b0 40 2d e9 push {r4, r5, r7, lr} ; | 40: 08 70 8d e2 add r7, sp, #8 ; | prolog 44: 30 d0 4d e2 sub sp, sp, #48 ; / 48: 14 90 97 e5 ldr r9, [r7, #20] ; \ 4c: 10 c0 97 e5 ldr r12, [r7, #16] ; | 50: 0c e0 97 e5 ldr lr, [r7, #12] ; | in args 4,5,6,7 from prev frame's param area -> regs ... 54: 08 40 97 e5 ldr r4, [r7, #8] ; | 58: 4c 50 00 e3 movw r5, #76 ; 'L' -> r5 5c: 0c 00 07 e5 str r0, [r7, #-12] ; in arg 0 -> temp space in local area 60: 10 10 07 e5 str r1, [r7, #-16] ; in arg 1 -> temp space in local area 64: 14 20 07 e5 str r2, [r7, #-20] ; in arg 2 -> temp space in local area 68: 18 30 07 e5 str r3, [r7, #-24] ; in arg 3 -> temp space in local area 6c: 1c 40 8d e5 str r4, [sp, #28] ; | 70: 18 e0 8d e5 str lr, [sp, #24] ; | 74: 14 c0 8d e5 str r12, [sp, #20] ; | ... in args 4,5,6,7 in regs -> local area ... 78: 10 90 8d e5 str r9, [sp, #16] ; | 7c: 0f 50 cd e5 strb r5, [sp, #15] ; 'L' (in r5) -> local area 80: 10 00 17 e5 ldr r0, [r7, #-16] ; arg 0 84: 14 10 17 e5 ldr r1, [r7, #-20] ; arg 1 88: 18 20 17 e5 ldr r2, [r7, #-24] ; arg 2 8c: 1c 30 9d e5 ldr r3, [sp, #28] ; arg 3 (fetched from local area previously copied to) 90: 18 90 9d e5 ldr r9, [sp, #24] ; | 94: 14 c0 9d e5 ldr r12, [sp, #20] ; | args 4,5,6 (fetched from local area previously copied to) -> regs, and ... 98: 10 e0 9d e5 ldr lr, [sp, #16] ; / 9c: 00 90 8d e5 str r9, [sp] ; \ a0: 04 c0 8d e5 str r12, [sp, #4] ; | ... "pushed" onto stack a4: 08 e0 8d e5 str lr, [sp, #8] ; | a8: d4 ff ff eb bl #-176 <_leaf_call> ; return address -> r14/lr, and call ac: 08 d0 47 e2 sub sp, r7, #8 ; | b0: b0 80 bd e8 pop {r4, r5, r7, pc} ; | epilog _main: b4: 90 40 2d e9 push {r4, r7, lr} ; | b8: 04 70 8d e2 add r7, sp, #4 ; | prolog bc: 14 d0 4d e2 sub sp, sp, #20 ; | c0: 00 00 00 e3 movw r0, #0 ; arg 0 c4: 01 10 00 e3 movw r1, #1 ; arg 1 c8: 02 20 00 e3 movw r2, #2 ; arg 2 cc: 03 30 00 e3 movw r3, #3 ; arg 3 d0: 04 90 00 e3 movw r9, #4 ; | d4: 05 c0 00 e3 movw r12, #5 ; | d8: 06 e0 00 e3 movw lr, #6 ; | args 4,5,6,7 in regs ... dc: 07 40 00 e3 movw r4, #7 ; | e0: 08 00 07 e5 str r0, [r7, #-8] ; unsure... why place arg 0 in local area? @@@ e4: 00 90 8d e5 str r9, [sp] ; | e8: 04 c0 8d e5 str r12, [sp, #4] ; | ec: 08 e0 8d e5 str lr, [sp, #8] ; | ... "push" args 4,5,6,7 onto stack f0: 0c 40 8d e5 str r4, [sp, #12] ; | f4: d0 ff ff eb bl #-192 <_nonleaf_call> ; return address -> r14/lr, and call f8: 00 00 00 e3 movw r0, #0 ; return value fc: 04 d0 47 e2 sub sp, r7, #4 ; | 100: 90 80 bd e8 pop {r4, r7, pc} ; | epilog ; ----------------- 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 armv7-unknown-unknown-macho ... _leaf_call: 0: 80 40 2d e9 push {r7, lr} 4: 0d 70 a0 e1 mov r7, sp 8: 1c d0 4d e2 sub sp, sp, #28 c: 10 90 97 e5 ldr r9, [r7, #16] 10: 0c c0 97 e5 ldr r12, [r7, #12] 14: 08 e0 97 e5 ldr lr, [r7, #8] 18: 04 00 07 e5 str r0, [r7, #-4] 1c: 08 10 07 e5 str r1, [r7, #-8] 20: 0c 20 07 e5 str r2, [r7, #-12] 24: 0c 30 8d e5 str r3, [sp, #12] 28: 08 e0 8d e5 str lr, [sp, #8] 2c: 04 c0 8d e5 str r12, [sp, #4] 30: 00 90 8d e5 str r9, [sp] 34: 07 d0 a0 e1 mov sp, r7 38: 80 80 bd e8 pop {r7, pc} _nonleaf_call: 3c: 0c d0 4d e2 sub sp, sp, #12 40: 80 40 2d e9 push {r7, lr} 44: 0d 70 a0 e1 mov r7, sp 48: 34 d0 4d e2 sub sp, sp, #52 4c: 10 30 87 e5 str r3, [r7, #16] 50: 0c 20 87 e5 str r2, [r7, #12] 54: 08 10 87 e5 str r1, [r7, #8] 58: 4c 10 00 e3 movw r1, #76 5c: 08 20 47 e2 sub r2, r7, #8 60: 04 00 07 e5 str r0, [r7, #-4] 64: 08 00 87 e2 add r0, r7, #8 68: 00 00 82 e5 str r0, [r2] 6c: 08 00 17 e5 ldr r0, [r7, #-8] 70: 04 20 80 e2 add r2, r0, #4 74: 08 20 07 e5 str r2, [r7, #-8] 78: 00 00 90 e5 ldr r0, [r0] 7c: 0c 00 07 e5 str r0, [r7, #-12] 80: 08 00 17 e5 ldr r0, [r7, #-8] 84: 04 20 80 e2 add r2, r0, #4 88: 08 20 07 e5 str r2, [r7, #-8] 8c: 00 00 90 e5 ldr r0, [r0] 90: 10 00 07 e5 str r0, [r7, #-16] 94: 08 00 17 e5 ldr r0, [r7, #-8] 98: 04 20 80 e2 add r2, r0, #4 9c: 08 20 07 e5 str r2, [r7, #-8] a0: 00 00 90 e5 ldr r0, [r0] a4: 14 00 07 e5 str r0, [r7, #-20] a8: 08 00 17 e5 ldr r0, [r7, #-8] ac: 04 20 80 e2 add r2, r0, #4 b0: 08 20 07 e5 str r2, [r7, #-8] b4: 00 00 90 e5 ldr r0, [r0] b8: 18 00 07 e5 str r0, [r7, #-24] bc: 08 00 17 e5 ldr r0, [r7, #-8] c0: 04 20 80 e2 add r2, r0, #4 c4: 08 20 07 e5 str r2, [r7, #-8] c8: 00 00 90 e5 ldr r0, [r0] cc: 18 00 8d e5 str r0, [sp, #24] d0: 08 00 17 e5 ldr r0, [r7, #-8] d4: 04 20 80 e2 add r2, r0, #4 d8: 08 20 07 e5 str r2, [r7, #-8] dc: 00 00 90 e5 ldr r0, [r0] e0: 14 00 8d e5 str r0, [sp, #20] e4: 08 00 17 e5 ldr r0, [r7, #-8] e8: 04 20 80 e2 add r2, r0, #4 ec: 08 20 07 e5 str r2, [r7, #-8] f0: 00 00 90 e5 ldr r0, [r0] f4: 10 00 8d e5 str r0, [sp, #16] f8: 0f 10 cd e5 strb r1, [sp, #15] fc: 0c 00 17 e5 ldr r0, [r7, #-12] 100: 10 10 17 e5 ldr r1, [r7, #-16] 104: 14 20 17 e5 ldr r2, [r7, #-20] 108: 18 30 17 e5 ldr r3, [r7, #-24] 10c: 18 90 9d e5 ldr r9, [sp, #24] 110: 14 c0 9d e5 ldr r12, [sp, #20] 114: 10 e0 9d e5 ldr lr, [sp, #16] 118: 00 90 8d e5 str r9, [sp] 11c: 04 c0 8d e5 str r12, [sp, #4] 120: 08 e0 8d e5 str lr, [sp, #8] 124: b5 ff ff eb bl #-300 <_leaf_call> 128: 07 d0 a0 e1 mov sp, r7 12c: 80 40 bd e8 pop {r7, lr} 130: 0c d0 8d e2 add sp, sp, #12 134: 1e ff 2f e1 bx lr _main: 138: 90 40 2d e9 push {r4, r7, lr} 13c: 04 70 8d e2 add r7, sp, #4 140: 14 d0 4d e2 sub sp, sp, #20 144: 00 00 00 e3 movw r0, #0 148: 01 10 00 e3 movw r1, #1 14c: 02 20 00 e3 movw r2, #2 150: 03 30 00 e3 movw r3, #3 154: 04 90 00 e3 movw r9, #4 158: 05 c0 00 e3 movw r12, #5 15c: 06 e0 00 e3 movw lr, #6 160: 07 40 00 e3 movw r4, #7 164: 08 00 07 e5 str r0, [r7, #-8] 168: 00 90 8d e5 str r9, [sp] 16c: 04 c0 8d e5 str r12, [sp, #4] 170: 08 e0 8d e5 str lr, [sp, #8] 174: 0c 40 8d e5 str r4, [sp, #12] 178: af ff ff eb bl #-324 <_nonleaf_call> 17c: 00 00 00 e3 movw r0, #0 180: 04 d0 47 e2 sub sp, r7, #4 184: 90 80 bd e8 pop {r4, r7, pc} ; vim: ft=asm68k