This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.global _main
.extern _putchar
.align 4
_main:
; prolog; save fp,lr,x19
stp x29, x30, [sp, #-0x20]!
str x19, [sp, #0x10]
mov x29, sp
; make space for 2 dword local vars
sub sp, sp, #0x10
; save argc/argv
stp x0, x1, [sp]
; create autorelease pool and save into x19
bl _objc_autoreleasePoolPush
mov x19, x0
; initialize app delegate class
bl initAppDelegate
; create CFString with delegate class name
mov x0, 0
adrp x1, str_AppDelegate@PAGE
add x1, x1, str_AppDelegate@PAGEOFF
mov x2, 0x0600 ; kCFStringEncodingASCII
bl _CFStringCreateWithCString
; x0 = UIApplicationMain(argc, argv, nil, CFSTR(“AppDelegate”));
mov x3, x0
ldr x0, [sp]
ldr x1, [sp, #0x8]
mov x2, #0
bl _UIApplicationMain
mov x7, x0 ; save retval
; pop autorelease pool
mov x0, x19
bl _objc_autoreleasePoolPop
; epilog
; restore stack pointer
add sp, sp, 0x10
; restore saved registers
ldr x19, [sp, #0x10]
ldp x29, x30, [sp], #0x20
; get retval
mov x0, x7
ret
initAppDelegate:
; prolog; save fp,lr,x20
stp x29, x30, [sp, #-0x20]!
str x20, [sp, #0x10]
mov x29, sp
; Class c = objc_allocateClassPair(objc_getClass(“NSObject”), “AppDelegate”, 0);
adrp x0, str_NSObject@PAGE
add x0, x0, str_NSObject@PAGEOFF
bl _objc_getClass
adrp x1, str_AppDelegate@PAGE
add x1, x1, str_AppDelegate@PAGEOFF
mov x2, 0
bl _objc_allocateClassPair
; save the class since we’ll clobber x0 several times
mov x20, x0
; class_addProtocol(c, objc_getProtocol(“UIApplicationDelegate”));
adrp x0, str_UIAppDelegate@PAGE
add x0, x0, str_UIAppDelegate@PAGEOFF
bl _objc_getProtocol
mov x1, x0
mov x0, x20
bl _class_addProtocol
; class_addMethod(c, S(“application:didFinishLaunchingWithOptions:”), didFinishLaunching, “B@:@@”);
adrp x0, str_didFinishLaunchingSel@PAGE
add x0, x0, str_didFinishLaunchingSel@PAGEOFF
bl _sel_getUid
mov x1, x0
mov x0, x20
adr x2, didFinishLaunching
adrp x3, str_typestr@PAGE
add x3, x3, str_typestr@PAGEOFF
bl _class_addMethod
; objc_registerClassPair(c);
mov x0, x20
bl _objc_registerClassPair
; epilog
ldr x20, [sp, #0x10]
ldp x29, x30, [sp], #0x20
ret
; parameters:
; x0: self
; x1: _sel
; x2: application
; x3: launchOptions
didFinishLaunching:
; prolog, save fp, lr, x19-x22
stp x29, x30, [sp, #-0x30]!
stp x19, x20, [sp, #0x10]
stp x21, x22, [sp, #0x20]
mov x29, sp
sub sp, sp, 0x20
; x19 = @selector(mainScreen)
adrp x0, str_mainScreen@PAGE
add x0, x0, str_mainScreen@PAGEOFF
bl _sel_getUid
mov x19, x0
; objc_getClass(“UIScreen”)
adrp x0, str_UIScreen@PAGE
add x0, x0, str_UIScreen@PAGEOFF
bl _objc_getClass
; x20 = [UIScreen mainScreen]
mov x1, x19
bl _objc_msgSend
mov x20, x0
; x19 is now free
; x1 = @selector(bounds)
adrp x0, str_bounds@PAGE
add x0, x0, str_bounds@PAGEOFF
bl _sel_getUid
mov x1, x0
; [x20 bounds]
mov x0, x20
bl _objc_msgSend
stp d0, d1, [sp]
stp d2, d3, [sp, #0x10]
; x19 = @selector(initWithFrame:)
adrp x0, str_initWithFrame@PAGE
add x0, x0, str_initWithFrame@PAGEOFF
bl _sel_getUid
mov x19, x0
; x0 = UIWindow
adrp x0, str_UIWindow@PAGE
add x0, x0, str_UIWindow@PAGEOFF
bl _objc_getClass
; x0 = class_createInstance(x0)
mov x1, #0x0
bl _class_createInstance
; x0 now has the instance
; x20 = [x0 initWithFrame:d]
mov x1, x19 ;initWithFrame
ldp d0, d1, [sp]
ldp d2, d3, [sp, #0x10]
bl _objc_msgSend
mov x20, x0
; x19 = @selector(init)
adrp x0, str_init@PAGE
add x0, x0, str_init@PAGEOFF
bl _sel_getUid
mov x19, x0
; x0 = UIViewController
adrp x0, str_UIViewController@PAGE
add x0, x0, str_UIViewController@PAGEOFF
bl _objc_getClass
; x0 = class_createInstance(UIViewController)
mov x1, #0x0
bl _class_createInstance
; x0 now has the instance
; x21 = [x0 init]
mov x1, x19 ;init
bl _objc_msgSend
mov x21, x0
; x19 = @selector(yellowColor)
adrp x0, str_yellowColor@PAGE
add x0, x0, str_yellowColor@PAGEOFF
bl _sel_getUid
mov x19, x0
; x22 = [UIColor yellowColor]
adrp x0, str_UIColor@PAGE
add x0, x0, str_UIColor@PAGEOFF
bl _objc_getClass
mov x1, x19
bl _objc_msgSend
mov x22, x0
; x19 = @selector(setBackgroundColor:)
adrp x0, str_setBackgroundColor@PAGE
add x0, x0, str_setBackgroundColor@PAGEOFF
bl _sel_getUid
mov x19, x0
; x1 = @selector(view)
adrp x0, str_view@PAGE
add x0, x0, str_view@PAGEOFF
bl _sel_getUid
mov x1, x0
; x0 = [[controller view] setBackgroundColor: x22];
mov x0, x21
bl _objc_msgSend
mov x1, x19
mov x2, x22
bl _objc_msgSend
adrp x0, str_setRoot@PAGE
add x0, x0, str_setRoot@PAGEOFF
bl _sel_getUid
mov x1, x0
; [window setRootViewController:viewController]
mov x0, x20
mov x2, x21
bl _objc_msgSend
; [x20 makeKeyAndVisible]
adrp x0, str_makeKeyAndVisible@PAGE
add x0, x0, str_makeKeyAndVisible@PAGEOFF
bl _sel_getUid
mov x1, x0
mov x0, x20
bl _objc_msgSend
; return YES
mov x0, #0x1
; epilog
add sp, sp, 0x20
ldp x19, x20, [sp, #0x10]
ldp x21, x22, [sp, #0x20]
ldp x29, x30, [sp], #0x30
ret
.data
str_NSObject: .asciz “NSObject”
str_AppDelegate: .asciz “AppDelegate”
str_UIAppDelegate: .asciz “UIApplicationDelegate”
str_UIScreen: .asciz “UIScreen”
str_UIWindow: .asciz “UIWindow”
str_UIViewController: .asciz “UIViewController”
str_UIColor: .asciz “UIColor”
str_typestr: .asciz “B@:@@”
str_didFinishLaunchingSel: .asciz “application:didFinishLaunchingWithOptions:”
str_mainScreen: .asciz “mainScreen”
str_bounds: .asciz “bounds”
str_initWithFrame: .asciz “initWithFrame:”
str_makeKeyAndVisible: .asciz “makeKeyAndVisible”
str_init: .asciz “init”
str_view: .asciz “view”
str_setBackgroundColor: .asciz “setBackgroundColor:”
str_yellowColor: .asciz “yellowColor”
str_setRoot: .asciz “setRootViewController:”

