| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- ; Copyright (C) 1999 URURI
- ; nasm�ѥޥ���
- ; 1999/08/21 ���
- ; 1999/10/10 ���Ĥ��ɲ�
- ; 1999/10/27 aout�б�
- ; 1999/11/07 pushf, popf ��NASM�ΥХ��б�
- ; 1999/12/02 for BCC ( Thanks to Miquel )
- ; for Windows Visual C++ -> define WIN32
- ; Borland or cygwin -> WIN32 and COFF
- ; for FreeBSD 2.x -> AOUT
- ; for TownsOS -> __tos__
- ; otherwise -> none
- ;̾����դ���
- BITS 32
- section .note.GNU-stack noalloc noexec nowrite progbits
- %ifdef YASM
- %define segment_code segment .text align=16 use32
- %define segment_data segment .data align=16 use32
- %define segment_bss segment .bss align=16 use32
- %elifdef WIN32
- %define segment_code segment .text align=16 class=CODE use32
- %define segment_data segment .data align=16 class=DATA use32
- %ifdef __BORLANDC__
- %define segment_bss segment .data align=16 class=DATA use32
- %else
- %define segment_bss segment .bss align=16 class=DATA use32
- %endif
- %elifdef AOUT
- %define _NAMING
- %define segment_code segment .text
- %define segment_data segment .data
- %define segment_bss segment .bss
- %else
- %ifidn __OUTPUT_FORMAT__,elf
- section .note.GNU-stack progbits noalloc noexec nowrite align=1
- %endif
- %define segment_code segment .text align=16 class=CODE use32
- %define segment_data segment .data align=16 class=DATA use32
- %define segment_bss segment .bss align=16 class=DATA use32
- %endif
- %ifdef WIN32
- %define _NAMING
- %endif
- %ifdef __tos__
- group CGROUP text
- group DGROUP data
- %endif
- ;ñ�����ư��������
- %idefine float dword
- %idefine fsize 4
- %idefine fsizen(a) (fsize*(a))
- ;��ɷ��
- %idefine wsize 2
- %idefine wsizen(a) (wsize*(a))
- %idefine dwsize 4
- %idefine dwsizen(a) (dwsize*(a))
- ;REG
- %define r0 eax
- %define r1 ebx
- %define r2 ecx
- %define r3 edx
- %define r4 esi
- %define r5 edi
- %define r6 ebp
- %define r7 esp
- ;MMX,3DNow!,SSE
- %define pmov movq
- %define pmovd movd
- %define pupldq punpckldq
- %define puphdq punpckhdq
- %define puplwd punpcklwd
- %define puphwd punpckhwd
- %define xm0 xmm0
- %define xm1 xmm1
- %define xm2 xmm2
- %define xm3 xmm3
- %define xm4 xmm4
- %define xm5 xmm5
- %define xm6 xmm6
- %define xm7 xmm7
- ;�����åե��Ѥ�4�ʥޥ���
- %define R4(a,b,c,d) (a*64+b*16+c*4+d)
- ;C�饤���ʴʰץޥ���
- %imacro globaldef 1
- %ifdef _NAMING
- %define %1 _%1
- %endif
- global %1
- %endmacro
- %imacro externdef 1
- %ifdef _NAMING
- %define %1 _%1
- %endif
- extern %1
- %endmacro
- %imacro proc 1
- %push proc
- %ifdef _NAMING
- global _%1
- %else
- global %1
- %endif
- align 32
- %1:
- _%1:
- %assign %$STACK 0
- %assign %$STACKN 0
- %assign %$ARG 4
- %endmacro
- %imacro endproc 0
- %ifnctx proc
- %error expected 'proc' before 'endproc'.
- %else
- %if %$STACK > 0
- add esp, %$STACK
- %endif
- %if %$STACK <> (-%$STACKN)
- %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd'
- %endif
- ret
- %pop
- %endif
- %endmacro
- %idefine sp(a) esp+%$STACK+a
- %imacro arg 1
- %00 equ %$ARG
- %assign %$ARG %$ARG+%1
- %endmacro
- %imacro local 1
- %assign %$STACKN %$STACKN-%1
- %00 equ %$STACKN
- %endmacro
- %imacro alloc 0
- sub esp, (-%$STACKN)-%$STACK
- %assign %$STACK (-%$STACKN)
- %endmacro
- %imacro pushd 1-*
- %rep %0
- push %1
- %assign %$STACK %$STACK+4
- %rotate 1
- %endrep
- %endmacro
- %imacro popd 1-*
- %rep %0
- %rotate -1
- pop %1
- %assign %$STACK %$STACK-4
- %endrep
- %endmacro
- ; bug of NASM-0.98
- %define pushf db 0x66, 0x9C
- %define popf db 0x66, 0x9D
- %define ge16(n) ((((n) / 16)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge15(n) ((((n) / 15)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge14(n) ((((n) / 14)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge13(n) ((((n) / 13)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge12(n) ((((n) / 12)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge11(n) ((((n) / 11)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge10(n) ((((n) / 10)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge9(n) ((((n) / 9)*0xFFFFFFFF) & 0xFFFFFFFF)
- %define ge8(n) (ge9(n) | ((((n) / 8)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge7(n) (ge9(n) | ((((n) / 7)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge6(n) (ge9(n) | ((((n) / 6)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge5(n) (ge9(n) | ((((n) / 5)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge4(n) (ge5(n) | ((((n) / 4)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge3(n) (ge5(n) | ((((n) / 3)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge2(n) (ge3(n) | ((((n) / 2)*0xFFFFFFFF) & 0xFFFFFFFF))
- %define ge1(n) (ge2(n) | ((((n) / 1)*0xFFFFFFFF) & 0xFFFFFFFF))
- ; macro to align for begining of loop
- ; %1 does not align if it LE bytes to next alignment
- ; 4..16
- ; default is 12
- %imacro loopalignK6 0-1 12
- %%here:
- times (($$-%%here) & 15 & ge1(($$-%%here) & 15) & ~ge4(($$-%%here) & 15)) nop
- times (1 & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) jmp short %%skip
- times (((($$-%%here) & 15)-2) & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
- %%skip:
- %endmacro
- %imacro loopalignK7 0-1 12
- %%here:
- times (1 & ge1(($$-%%here) & 15) & ~ge2(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
- times (1 & ge2(($$-%%here) & 15) & ~ge3(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Bh,0C0h
- times (1 & ge3(($$-%%here) & 15) & ~ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,020h
- times (1 & ge4(($$-%%here) & 15) & ~ge5(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h
- times (1 & ge5(($$-%%here) & 15) & ~ge6(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h,090h
- times (1 & ge6(($$-%%here) & 15) & ~ge7(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,080h,0,0,0,0
- times (1 & ge7(($$-%%here) & 15) & ~ge8(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0
- times (1 & ge8(($$-%%here) & 15) & ~ge9(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0,90h
- times (1 & ge9(($$-%%here) & 15) & ~ge10(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h
- times (1 & ge10(($$-%%here) & 15) & ~ge11(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,008h,90h,90h,90h,90h,90h,90h,90h,90h
- times (1 & ge11(($$-%%here) & 15) & ~ge12(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,009h,90h,90h,90h,90h,90h,90h,90h,90h,90h
- 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
- 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
- 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
- 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
- %%skip:
- %endmacro
- %imacro loopalign 0-1 12
- loopalignK7 %1
- %endmacro
- %define PACK(x,y,z,w) (x*64+y*16+z*4+w)
- %ifidn __OUTPUT_FORMAT__,elf
- %idefine PIC_BASE(A) _GLOBAL_OFFSET_TABLE_ + $$ - $ wrt ..gotpc
- %idefine PIC_EBP_REL(A) ebp + A wrt ..gotoff
- %macro PIC_OFFSETTABLE 0
- extern _GLOBAL_OFFSET_TABLE_
- get_pc.bp:
- mov ebp, [esp]
- retn
- %endmacro
- %else
- %define PIC_BASE(A) (0)
- %define PIC_EBP_REL(A) (A)
- %macro PIC_OFFSETTABLE 0
- get_pc.bp:
- mov ebp, [esp]
- retn
- %endmacro
- %endif
|