nasm.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. ; Copyright (C) 1999 URURI
  2. ; nasm�ѥޥ���
  3. ; 1999/08/21 ���
  4. ; 1999/10/10 ���Ĥ��ɲ�
  5. ; 1999/10/27 aout�б�
  6. ; 1999/11/07 pushf, popf ��NASM�ΥХ��б�
  7. ; 1999/12/02 for BCC ( Thanks to Miquel )
  8. ; for Windows Visual C++ -> define WIN32
  9. ; Borland or cygwin -> WIN32 and COFF
  10. ; for FreeBSD 2.x -> AOUT
  11. ; for TownsOS -> __tos__
  12. ; otherwise -> none
  13. ;̾����դ���
  14. BITS 32
  15. section .note.GNU-stack noalloc noexec nowrite progbits
  16. %ifdef YASM
  17. %define segment_code segment .text align=16 use32
  18. %define segment_data segment .data align=16 use32
  19. %define segment_bss segment .bss align=16 use32
  20. %elifdef WIN32
  21. %define segment_code segment .text align=16 class=CODE use32
  22. %define segment_data segment .data align=16 class=DATA use32
  23. %ifdef __BORLANDC__
  24. %define segment_bss segment .data align=16 class=DATA use32
  25. %else
  26. %define segment_bss segment .bss align=16 class=DATA use32
  27. %endif
  28. %elifdef AOUT
  29. %define _NAMING
  30. %define segment_code segment .text
  31. %define segment_data segment .data
  32. %define segment_bss segment .bss
  33. %else
  34. %ifidn __OUTPUT_FORMAT__,elf
  35. section .note.GNU-stack progbits noalloc noexec nowrite align=1
  36. %endif
  37. %define segment_code segment .text align=16 class=CODE use32
  38. %define segment_data segment .data align=16 class=DATA use32
  39. %define segment_bss segment .bss align=16 class=DATA use32
  40. %endif
  41. %ifdef WIN32
  42. %define _NAMING
  43. %endif
  44. %ifdef __tos__
  45. group CGROUP text
  46. group DGROUP data
  47. %endif
  48. ;ñ�����ư��������
  49. %idefine float dword
  50. %idefine fsize 4
  51. %idefine fsizen(a) (fsize*(a))
  52. ;��ɷ��
  53. %idefine wsize 2
  54. %idefine wsizen(a) (wsize*(a))
  55. %idefine dwsize 4
  56. %idefine dwsizen(a) (dwsize*(a))
  57. ;REG
  58. %define r0 eax
  59. %define r1 ebx
  60. %define r2 ecx
  61. %define r3 edx
  62. %define r4 esi
  63. %define r5 edi
  64. %define r6 ebp
  65. %define r7 esp
  66. ;MMX,3DNow!,SSE
  67. %define pmov movq
  68. %define pmovd movd
  69. %define pupldq punpckldq
  70. %define puphdq punpckhdq
  71. %define puplwd punpcklwd
  72. %define puphwd punpckhwd
  73. %define xm0 xmm0
  74. %define xm1 xmm1
  75. %define xm2 xmm2
  76. %define xm3 xmm3
  77. %define xm4 xmm4
  78. %define xm5 xmm5
  79. %define xm6 xmm6
  80. %define xm7 xmm7
  81. ;�����åե��Ѥ�4�ʥޥ���
  82. %define R4(a,b,c,d) (a*64+b*16+c*4+d)
  83. ;C�饤���ʴʰץޥ���
  84. %imacro globaldef 1
  85. %ifdef _NAMING
  86. %define %1 _%1
  87. %endif
  88. global %1
  89. %endmacro
  90. %imacro externdef 1
  91. %ifdef _NAMING
  92. %define %1 _%1
  93. %endif
  94. extern %1
  95. %endmacro
  96. %imacro proc 1
  97. %push proc
  98. %ifdef _NAMING
  99. global _%1
  100. %else
  101. global %1
  102. %endif
  103. align 32
  104. %1:
  105. _%1:
  106. %assign %$STACK 0
  107. %assign %$STACKN 0
  108. %assign %$ARG 4
  109. %endmacro
  110. %imacro endproc 0
  111. %ifnctx proc
  112. %error expected 'proc' before 'endproc'.
  113. %else
  114. %if %$STACK > 0
  115. add esp, %$STACK
  116. %endif
  117. %if %$STACK <> (-%$STACKN)
  118. %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd'
  119. %endif
  120. ret
  121. %pop
  122. %endif
  123. %endmacro
  124. %idefine sp(a) esp+%$STACK+a
  125. %imacro arg 1
  126. %00 equ %$ARG
  127. %assign %$ARG %$ARG+%1
  128. %endmacro
  129. %imacro local 1
  130. %assign %$STACKN %$STACKN-%1
  131. %00 equ %$STACKN
  132. %endmacro
  133. %imacro alloc 0
  134. sub esp, (-%$STACKN)-%$STACK
  135. %assign %$STACK (-%$STACKN)
  136. %endmacro
  137. %imacro pushd 1-*
  138. %rep %0
  139. push %1
  140. %assign %$STACK %$STACK+4
  141. %rotate 1
  142. %endrep
  143. %endmacro
  144. %imacro popd 1-*
  145. %rep %0
  146. %rotate -1
  147. pop %1
  148. %assign %$STACK %$STACK-4
  149. %endrep
  150. %endmacro
  151. ; bug of NASM-0.98
  152. %define pushf db 0x66, 0x9C
  153. %define popf db 0x66, 0x9D
  154. %define ge16(n) ((((n) / 16)*0xFFFFFFFF) & 0xFFFFFFFF)
  155. %define ge15(n) ((((n) / 15)*0xFFFFFFFF) & 0xFFFFFFFF)
  156. %define ge14(n) ((((n) / 14)*0xFFFFFFFF) & 0xFFFFFFFF)
  157. %define ge13(n) ((((n) / 13)*0xFFFFFFFF) & 0xFFFFFFFF)
  158. %define ge12(n) ((((n) / 12)*0xFFFFFFFF) & 0xFFFFFFFF)
  159. %define ge11(n) ((((n) / 11)*0xFFFFFFFF) & 0xFFFFFFFF)
  160. %define ge10(n) ((((n) / 10)*0xFFFFFFFF) & 0xFFFFFFFF)
  161. %define ge9(n) ((((n) / 9)*0xFFFFFFFF) & 0xFFFFFFFF)
  162. %define ge8(n) (ge9(n) | ((((n) / 8)*0xFFFFFFFF) & 0xFFFFFFFF))
  163. %define ge7(n) (ge9(n) | ((((n) / 7)*0xFFFFFFFF) & 0xFFFFFFFF))
  164. %define ge6(n) (ge9(n) | ((((n) / 6)*0xFFFFFFFF) & 0xFFFFFFFF))
  165. %define ge5(n) (ge9(n) | ((((n) / 5)*0xFFFFFFFF) & 0xFFFFFFFF))
  166. %define ge4(n) (ge5(n) | ((((n) / 4)*0xFFFFFFFF) & 0xFFFFFFFF))
  167. %define ge3(n) (ge5(n) | ((((n) / 3)*0xFFFFFFFF) & 0xFFFFFFFF))
  168. %define ge2(n) (ge3(n) | ((((n) / 2)*0xFFFFFFFF) & 0xFFFFFFFF))
  169. %define ge1(n) (ge2(n) | ((((n) / 1)*0xFFFFFFFF) & 0xFFFFFFFF))
  170. ; macro to align for begining of loop
  171. ; %1 does not align if it LE bytes to next alignment
  172. ; 4..16
  173. ; default is 12
  174. %imacro loopalignK6 0-1 12
  175. %%here:
  176. times (($$-%%here) & 15 & ge1(($$-%%here) & 15) & ~ge4(($$-%%here) & 15)) nop
  177. times (1 & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) jmp short %%skip
  178. times (((($$-%%here) & 15)-2) & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
  179. %%skip:
  180. %endmacro
  181. %imacro loopalignK7 0-1 12
  182. %%here:
  183. times (1 & ge1(($$-%%here) & 15) & ~ge2(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
  184. times (1 & ge2(($$-%%here) & 15) & ~ge3(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Bh,0C0h
  185. times (1 & ge3(($$-%%here) & 15) & ~ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,020h
  186. times (1 & ge4(($$-%%here) & 15) & ~ge5(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h
  187. times (1 & ge5(($$-%%here) & 15) & ~ge6(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h,090h
  188. times (1 & ge6(($$-%%here) & 15) & ~ge7(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,080h,0,0,0,0
  189. times (1 & ge7(($$-%%here) & 15) & ~ge8(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0
  190. times (1 & ge8(($$-%%here) & 15) & ~ge9(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0,90h
  191. times (1 & ge9(($$-%%here) & 15) & ~ge10(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h
  192. times (1 & ge10(($$-%%here) & 15) & ~ge11(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,008h,90h,90h,90h,90h,90h,90h,90h,90h
  193. times (1 & ge11(($$-%%here) & 15) & ~ge12(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,009h,90h,90h,90h,90h,90h,90h,90h,90h,90h
  194. times (1 & ge12(($$-%%here) & 15) & ~ge13(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ah,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
  195. times (1 & ge13(($$-%%here) & 15) & ~ge14(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Bh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
  196. times (1 & ge14(($$-%%here) & 15) & ~ge15(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ch,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
  197. times (1 & ge15(($$-%%here) & 15) & ~ge16(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Dh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
  198. %%skip:
  199. %endmacro
  200. %imacro loopalign 0-1 12
  201. loopalignK7 %1
  202. %endmacro
  203. %define PACK(x,y,z,w) (x*64+y*16+z*4+w)
  204. %ifidn __OUTPUT_FORMAT__,elf
  205. %idefine PIC_BASE(A) _GLOBAL_OFFSET_TABLE_ + $$ - $ wrt ..gotpc
  206. %idefine PIC_EBP_REL(A) ebp + A wrt ..gotoff
  207. %macro PIC_OFFSETTABLE 0
  208. extern _GLOBAL_OFFSET_TABLE_
  209. get_pc.bp:
  210. mov ebp, [esp]
  211. retn
  212. %endmacro
  213. %else
  214. %define PIC_BASE(A) (0)
  215. %define PIC_EBP_REL(A) (A)
  216. %macro PIC_OFFSETTABLE 0
  217. get_pc.bp:
  218. mov ebp, [esp]
  219. retn
  220. %endmacro
  221. %endif