prt0.as 2.8 KB

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