head_em.s 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. .sect .text; .sect .rom; .sect .data; .sect .bss
  2. .define begtext,begdata,begbss,syscal
  3. .define hol0,.reghp,.limhp,.trppc,.ignmask
  4. .define ERANGE,ESET,EHEAP,ECASE,EILLINS,EIDIVZ,EODDZ
  5. .define EXIT,BRK
  6. .extern endbss
  7. ERANGE = 1
  8. ESET = 2
  9. EIDIVZ = 6
  10. EHEAP = 17
  11. EILLINS = 18
  12. EODDZ = 19
  13. ECASE = 20
  14. .sect .text
  15. .data1 0353
  16. .data1 0176 ! jmp to begtext in 2 bytes. Assembler generates 3
  17. ! bytes.
  18. syscal: jmp 1f
  19. grow: jmp 2f
  20. jmp 2f
  21. .data2 -277, -277, -277, -277, -277, -277
  22. 2:
  23. mov ax,2088
  24. 1:
  25. int 5
  26. jmp 1f
  27. .space 100
  28. 1:
  29. ret
  30. begtext:
  31. mov bx,sp
  32. mov cx,(bx)
  33. add bx,2
  34. mov ax,cx
  35. inc ax
  36. shl ax,1
  37. add ax,bx
  38. push ax
  39. push bx
  40. push cx
  41. xor bp,bp
  42. mov bx,endbss
  43. mov cx,9
  44. add bx,1024
  45. shr bx,cl
  46. shl bx,cl
  47. call grow
  48. xor cx,cx
  49. push cx
  50. call __sbrk
  51. mov (.limhp),ax
  52. mov (.reghp),ax ! on Xenix, heap begins above stack!
  53. pop ax
  54. call __m_a_i_n
  55. EXIT:
  56. push ax
  57. call __exit
  58. BRK:
  59. jmp __brk
  60. .sect .data
  61. begdata:
  62. hol0:
  63. .data2 0,0
  64. .data2 0,0
  65. argv:
  66. .data2 3f
  67. envp:
  68. .data2 0
  69. 3:
  70. .asciz "PROGRAM"
  71. .reghp:
  72. .data2 endbss
  73. .limhp:
  74. .data2 endbss
  75. .ignmask:
  76. .data2 0
  77. .trppc:
  78. .data2 0
  79. .sect .bss
  80. begbss: