prt0.as 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. Start-up code for Free Pascal Compiler, not in a shared library,
  3. not linking with C library.
  4. */
  5. .text
  6. .align 2
  7. #APP
  8. .ident "FreeBSD"
  9. #NO_APP
  10. .section .note.ABI-tag,"a",@progbits
  11. .p2align 2
  12. .type abitag, @object
  13. .size abitag, 24
  14. abitag:
  15. .long 8
  16. .long 4
  17. .long 1
  18. .string "FreeBSD"
  19. .long 120000
  20. .section .rodata
  21. .LC0:
  22. .string ""
  23. .globl __progname
  24. .data
  25. .p2align 3
  26. .type __progname, @object
  27. .size __progname, 8
  28. __progname:
  29. .quad .LC0
  30. .text
  31. .p2align 2,,3
  32. .globl _start
  33. .type _start,#function
  34. _start:
  35. /* Initialise FP to zero */
  36. mov x29,#0
  37. /* Get argc, argv, envp */
  38. ldr x1,[x0]
  39. add x2,x0,#8
  40. add x11,x1,#1
  41. add x11,x2,x11,lsl #3
  42. /* Save argc, argv, envp, environ, __progname and initial stack pointer */
  43. ldr x10,=operatingsystem_parameter_argc
  44. str x1,[x10]
  45. ldr x10,=operatingsystem_parameter_argv
  46. str x2,[x10]
  47. ldr x10,=operatingsystem_parameter_envp
  48. str x11,[x10]
  49. /* save environ */
  50. adrp x10,environ
  51. ldr x10,[x10,:lo12:environ]
  52. cbnz x10,.LBB0_2
  53. ldr x10,=environ
  54. str x11,[x10]
  55. .LBB0_2:
  56. /* save __progname */
  57. ldr w8,=operatingsystem_parameter_argc
  58. cmp w8,#0
  59. cset w8,le
  60. tbnz w8,#0,.LBB0_9
  61. // %bb.1:
  62. adrp x8,operatingsystem_parameter_argv
  63. ldr x8,[x8,:lo12:operatingsystem_parameter_argv]
  64. cbz x8,.LBB0_9
  65. // %bb.2:
  66. ldr x2,[x2]
  67. adrp x9,__progname
  68. adrp x10,__progname
  69. add x10,x10,:lo12:__progname
  70. str x2,[x10]
  71. ldr x8,[x9,:lo12:__progname]
  72. adrp x9,s
  73. add x9,x9,:lo12:s
  74. str x8,[x9]
  75. .LBB0_3:
  76. adrp x8,s
  77. ldr x8,[x8,:lo12:s]
  78. ldrb w9,[x8]
  79. cbz w9,.LBB0_8
  80. // %bb.4:
  81. adrp x8,s
  82. ldr x8,[x8, :lo12:s]
  83. ldrb w9,[x8]
  84. cmp w9,#47
  85. b.ne .LBB0_6
  86. // %bb.5:
  87. adrp x8,s
  88. ldr x8,[x8,:lo12:s]
  89. add x8,x8,#1
  90. adrp x9,__progname
  91. add x9,x9,:lo12:__progname
  92. str x8,[x9]
  93. .LBB0_6:
  94. // %bb.7:
  95. adrp x8,s
  96. adrp x9,s
  97. add x9,x9,:lo12:s
  98. ldr x8,[x8,:lo12:s]
  99. add x8,x8,#1
  100. str x8,[x9]
  101. b .LBB0_3
  102. .LBB0_8:
  103. .LBB0_9:
  104. /* save stack pointer */
  105. ldr x10,=__stkptr
  106. mov x6,sp
  107. str x6,[x10]
  108. /* Call main */
  109. bl PASCALMAIN
  110. ldr x10,=operatingsystem_result
  111. ldr w0,[x10]
  112. mov w8,#1 // SYS_exit
  113. svc #0
  114. /* Define a symbol for the first piece of initialized data. */
  115. .data
  116. .align 3
  117. .globl __data_start
  118. __data_start:
  119. .long 0
  120. .weak data_start
  121. data_start = __data_start
  122. .bss
  123. .align 3
  124. .comm __stkptr,8
  125. .comm operatingsystem_parameter_envp,8
  126. .comm operatingsystem_parameter_argc,8
  127. .comm operatingsystem_parameter_argv,8
  128. .comm environ,8,8
  129. s:
  130. .xword 0
  131. .size s, 8
  132. .section .note.GNU-stack,"",%progbits