Hello-World iOS App in Assembly

2 hours ago 1
.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:"
Read Entire Article