
                          
                         
                       
                       
                            
                                            
                                   
                                           
                                 

                        flat assembler  version 1.20

         Copyright (c) 1999-2001, Tomasz Grysztar. All rights reserved.

                p 饣 p㪮⢠ (c) Aquila, 2001


p

 1  
    1.1   ⠪ fasm?
    1.2  p  p㤮
    1.3  p  pp ᯥ祭  p樮 ⥬
    1.4  室 p
    1.5  p冷 p樨 
    1.6  ⨬ pp㥬 

 2  ᯮ짮 flat assembler'
    2.1  ⠪ ᥬp
         2.1.1  ⠪ p権
                2.1.1.1    
                2.1.1.2  p室  맮
                2.1.1.3  ⪨  ⠭
                2.1.1.4  p
                2.1.1.5  樠 砨
                2.1.1.6  p樨 FPU  MMX
         2.1.2  ᫮ ᨭ⠪
         2.1.3  ⠪ ᪨ p
         2.1.4  p ⠭
         2.1.5  p 
    2.2  p⨢
         2.2.1  p⨢ ppp
         2.2.2  ⠭   pp
         2.2.3  p ⮪  ⠭
         2.2.4  p㣨 p⨢



1  

1.1   ⠪ fasm?

     Flat assembler -  p, 䥪⨢ 80x86 ᥬp, p
p⠥ "᪮ p쭮 p". ⮬, ⮡  , 室
  80386 PC,  , 筮,  ᥬp pp 
 80x86 PC.  ⫨稨   80x86 ᥬp fasm p ⮫쪮
稥 室 , ⮡ ᣥp 室 䠩. p 'asm'-䠩
 pp 'examples', ⮡ 㢨,   p!   ,
 fasm ⢨⥫  pp ( ⮣,   ᠥ p権
 p⨢).

1.2  p  p㤮

     p 㯮⮣ p  pp (  80386),
⠫ p 筮 ;  p p  
pp  p  襣 ⢠.

1.4  p  pp ᯥ祭  p樮 ⥬

      ᯮ짮 fasm p ⮫쪮 MS-DOS 2.0+. p ,
 fasm  㤥 p, ᫨ CPU 室  饭  V86 p,
⠪       ᪨ p p. Fasmw p
p樮 ⥬, ᮢ⨬  Win32, ⠪    饭 
DOS   ⥭p WDOSX.

1.4  室 p

 p  室 p:  㬮砭 fasm pp
p頥  p, (pp 'com'  'sys'). ᯮ짮
p⨢ 'format MZ'    p頥 
ᥣ 'exe'-pp. H p ⥫쭮 ⠤ .
ᯮ짮 p⨢ 'format PE' ⠢ fasm ᣥpp p⠡
ᯮ塞 䠩.

1.5  p冷r p樨 

      pp  ⮬ p浪,  p     室 䠩.
⮬  砫 䠩  室 p 'jmp start', ᫨ ⮫쪮
  ⫨  筮 p.  ⮬ 砥 ᬮp ᯮ짮
p⨢ 'entry' ().

1.6  ⨬ pp㥬 

     Flat assembler 㤥  p ( p) p室, ⮡
ᣥpp ⨬ 室 . ᫨ pp p室  p 
p樨  㪠, fasm ᣥpp ⮫쪮  , ᪮쪮 
.  ⢥ ⨬, ⢫塞 fasm'.

2  ᯮ짮 flat assembler'

2.1  ⠪ ᥬp

2.1.1  ⠪ p権

2.1.1.1    

    p饭     pp 稭  p p:
'mov eax, myvar'  ᬥ饭 (p) 'myvar'  pp eax,   p
 'mov eax, [myvar]'  32-⭮ 祭 p 'myvar'  eax.
p ,  fasm 멤  訡, ᫨ 'myvar'  뫠 p
 32-⭮ 祭. ᫨ 'myvar'  뫠 p  p, 
   p ᥬp p 'mov eax, [myvar]',
ᯮ pp pp: 'mov eax, dword [myvar]'  (p⪠
p): 'mov eax, d[myvar]'.  ᭮, ᫨ 'myvar' 뫠 p 
8-⭮  16-⭮ 祭; eax 㤥 ᮤp ⭮ !
 pp pp: byte (8 ), word (16 ), dword (32
), pword (48 ), qword (64 ), tword (80 ), dqword (128 ),
p 㪢 p p p.

2.1.1.2  p室  맮

    ᫮:

        jmp  alpha                    ; p⮩ p室
        jmp  near byte beta           ;  p室
        jmp  near dword beta          ; ⠭ pp p室 4 
        jmp  10h:50h                  ; 쭨 p室
        jmp  pword 10h:50000h         ; 32-  쭨 p室
        call far pword [1000h]        ; 32-  쭨 맮
        call far dword [delta]        ; 16-  쭨 맮
        call near dword [delta]       ; 32-   p室

    ᫮:

        je   alpha                    ; 㤥 p⨬p
        jge  byte alpha               ; p⥫쭮 ⠭ pp
                                      ; p室 p  (訡, ᫨
                                      ;   墠⠥)
        jb   dword alpha              ; p⥫쭮 ⠭ pp
                                      ; p室 p  ᫮ (
                                      ; ⨬樨)

2.1.1.3  ⪨  ⠭

    pp p ⮪:

        alpha:                        ; p ⪠
             label     beta           ;   ᠬ
             label     gamma byte     ;   dword' 'delta'
        delta          dd 0           ; ⪠ 
        epsilon = alpha + 1           ; p ⠭

     ⪨:

        sigma:
        .alpha:                       ; 쭠 ⪠ (1)
             jmp  .alpha              ; p室  (1)
        omega:
        .alpha:                       ; 쭠 ⪠ (2)
             jmp  .alpha              ; p室  (2)
             jmp  sigma.alpha         ; p室  (1)

2.1.1.4  p

    Fasm 㬥  p p䬥⨪  pp, ⮬  
- p '[ebx*5]' ( 㤥 pᥬp  '[ebx+ebx*4]').
     p pp 祭 p; '[word 4]  '[dword 4]
ᣥpp p : [0004]  [00000004], '[word bx]' ⠭ [bx+0000],
'[byte bx] ⠭ [bx+00], '[dword ebx+1]' ⠭ [ebx+00000001]  ⠪ .

2.1.1.5  樠 砨

    p 'xlat' p  p㬥: '[bx]/'byte [bx]', ⮡
ᮧ 16-  p,  '[ebx]'/'byte [ebx]', ⮡ ᮧ 32-
 p ; 宦 p   ⢫ p
p p p権, pp 'movs byte [es:edi], [fs:esi]',
⮡ ᪮ppp pp pp 祭  ᥣ ('movs' p
 祭). 'xlatb', 'movsb'  ..  p p㬥⮢.

2.1.1.6  p樨 FPU, MMX  SSE

    pp p権 FPU:

        fld     tword [si]            ; p㧨 ⢥ ᫮
        fadd    st0,st3               ; ᫮ ⢥ ᫠
        fimul   dword [ebx]           ; 㬭 楫 ᫮
        fstp    qword [edx]           ; p ⢥ ᫮  
                                      ; 祭  ⥪

    pp MMX  SSE p権:

        paddb   mm0,mm1               ; ᫮ 㯠 ⮢
        pand    mm7,qword [esi]       ; ᪮ ''
        addps   xmm0,xmm1             ; ᫮ 㯠 ⢥
                                      ; ᥫ
        cmpeqps xmm7,dqword [esi]     ; p 㯠 ⢥
                                      ; ᥫ
        shufps  xmm4,xmm5,1           ; p⠭ 㯠 ⢥
                                      ; ᥫ

2.1.2  ᫮ ᨭ⠪

     ᫠: 15, 15d
    : 1011b
    ⠭p: 0ABh, 0xAB
    쬥p: 231o, 0231
    ᫠  饩 ⮩: 3.14, 1.0E3
    樠: $ - ⥪騩 p, % - ⥪騩 p p (ᬮp
    2.2.3)
    pp: +, -, *, /, mod, not, and, or, xor, shl, shr
    pp pᨨ pᮢ: rva (⮫쪮  p PE)

2.1.3  ⠪ ᪨ p

   p pp pᮢ  ᥪ樨 2.2.1. ᪨ pp ᫥騥:
~ (not), | (), & (). ᪨ 祭   p p
pp p: = (p), < (), > (), <= (  p),
>= (  p), <> ( p)  ᥫ; 'eq'  'in'  ⠫
ᨬ.  'equ' 砥   ᠬ  ᪨ p,  
'eq',  ⠪  ᯮ짮  p ᨬ᪨ ⠭.
᫨   ᯮ짮 祭 'true'  'false'  ᪨
p, p  p 'equ': 'true equ 0=0', 'false equ ~true'.

2.1.4  p ⠭

     ⫨稨  'equ' '=' p⠥ ⮫쪮  ᫮묨 祭ﬨ,  
  p p; pp, 'xyz = $' p ᨬ 
p 窨,  p   p, 'xyz equ $' ⮫쪮 p
 '$', p ᥣ 㤥 p p ,  ᯮ.

2.1.5  p 

       p  ﬨ; ᫨   
p樠p ᯥ樠 祭,    ᤥ ᫥騬
p:

        gdtr      db    16,0,0,0,0,0,0        ; ᫥⥫쭮 ⮢
        attrib    db    0x1E                  ;   (⭠p)
        command:  times 127 db 0              ; ⮢ p
        str001    db    'test.bin',0          ; ᨬ쭠 p
        argv:     times 10 dd 0               ;   ᫮
        picture   file  'star.gif'            ;  ᮤp 䠩

     p p㧪    p樨 'file', ᫥  䠩
 ᫥   䠩, p p 稥, ⥬
  ⢮ , p 㦭 p㧨.

    p㣨 㯭 p ᫥騥:

        dw   ; 16-bit word
        dp   ; 48-bit pointer
        dq   ; 64-bit quad word
        dt   ; 80-bit floating point
        du   ; 16-bit word strings

        dw   ; 16- ⭮ ᫮
        dp   ; 48-  㪠⥫
        dq   ; 64- ⨭ ⢥p ᫮
        dt   ; 80-⭮ ᫮  饩 ⮩
        du   ; p 16-  ᫮

    ᫨ 室 ⮫쪮 ppp   , p
p p ᫥:

        _proname  rd   1                      ; ppp  
                                              ; ᫮
        _inch     rb   1                      ; ppp  
        newstack  rd   255                    ; ppp 255  ᫮

     㯭 ᫥騥 p p:

        rw   ; 16- ⭮ ᫮
        rp   ; 48-  㪠⥫
        rq   ; 64- ⭮ ⢥p ᫮
        rt   ; 80- ⭮ ⢥ ᫮

    p ,  ᫨ p⨢ 'times' ᯮ  p
⢥ ⮢ ,  ᯮ㥬 ⪠  稢
稥. p㣮  砥  ᯮ짮 p⨢ 'label' p
p , pp:

        label argv dword
        times 10 dd 0

    ⮡ ᮧ ꥤ p,  ᫥ ᯮ짮 p⨢
label   'at <p>'  p⨢ 'virtual', pp:

        GDT_limit dw 15
        GDT_address dd ?

        ; ⥯p p塞 p㠫 p  p権 lgdt  sqdt

        label GDTR pword at GDT_limit

        ;  ⥯p p㣮 ⮤

        LDTR dp ?

        virtual at LDTR
          LDT_limit dw ?
          LDT_address dd ?
        end virtual

2.2  p⨢

2.2.1  p⨢ ppp

common - ᯮ p p pᮢ,  ᫥騥 p樨
          ⮩  p  p⠭ ⮫쪮 p,  ᫨
         p뢠 ᪮쪮 p㬥⮢.

include - 砥 䠩  室  p㣮 䠩 p ᥬp.

macro - p p, p㬥⠬   p   p㬥⮢
        p, p 窠, ⥬ ᨬ '{' (砫 p),
        p樨 p,    ᨬ '}' (p襭 p). 
        pp p  p :

        macro align value { rb (value-1) - ($ + value-1) mod value }

         pᮢ    p㬥; ⮡ pp,  
        p㬥 , ᯮ - p 'if <argument> eq <>'.
        ᫨ p p ⠪,   ᯮ p樨  ⥬ 
         p p, ᯮ p饥 祭 ⮣ ;
         pp pᮢ  ⢫ ᫥騬
        p, pp:

        macro mov arg1,arg2
         {
          if arg1 in <ds,es,fs,gs,ss> & arg2 in <cs,ds,es,fs,gs,ss>
             push  arg2
             pop   arg1
          else
             mov   arg1,arg2  ;  㤥 ᯮ짮 p쭠
                              ; p 'mov'
          end if
         }
        macro mov arg1,arg2,arg3
         {
          if <arg3> eq <>
             mov   arg1,arg2  ;  㤥 ᯮ짮 p騩 p
          else
             mov   arg1,arg2
             mov   arg2,arg3
          end if
         }
        mov   ax,bx           ; p 'mov ax,bx'
        mov   ds,es           ; 'push es'  'pop ds'
        mov   es,ds,dx        ; 'push ds', 'pop es'  'mov ds,dx'

        H ,  ᯮ짮  pᮢ   pp
        祭 ᨫ쭮  ᥬp ( 4- p!)  㢥
        p  p⨢ .

        ᫨  ⠥ p㬥  p ᪮, p 㤥
        p p㯯 p㬥⮢  p  p樨  
        p㯯 p㬥⮢ ⤥쭮. Hpp:

        macro stoschar [char]
         {
             mov   al,char
             stosb
         }

        stoschar 1,2,3,4      ; p塞 p   es:di

         p     ,   p 㤥
        ᮤp p 䨣p ('{'  '}') ᪮.   p
        㤥 p⠭   p㯯 pp p ⥬,  p
         p⪥ ᫥饩 .  ᨬ, p  
           㯭   ᫥   p p⪨ ⮩
         p㯯 pp. Hpp, ⮡ ᮧ ⠡ pᮢ p,
         ⥬ p  p, ᯮ  p:

        macro strtbl [string]
         { local label
           dd label }
         { label db string,0 }

struc -  p p⨢ 'macro', ᯮ㥬  ᮧ pp
        .  p 'struc' ᯮ  pp,  
        p⢮ ⪠. ppp     砫
         ᨬ, 稭饣   窨. Hpp:

        struc pixel x,y,color
         {
          .x dw x
          .y dw y
          .color db color
         }

        mypix pixel 10,10,4

        ; ⮬   p p mypix.x, mypix.y 
        ; mypix.color

        virtual at 0
          pixel pixel ?,?,?
        end virtual

        ;  ⥯p ⠪ ᬥ饭 pixel.x, pixel.y, pixel.color

        ⮡  砨,     pp p 
        (pp, 'mypix pixel'),    - p
        '.x dw x+0'  ᯮ짮 'if <x> eq <>'.

local - ᯮ p p pᮢ, p 
        ᨬ,  p  㭨  p  맮 p;
        p㬥 -  ᨬ , p ⮩.

purge - p㬥 -     pᮢ, p 묨; 
        p⨢ 㤠 ᫥ p 㪠 p; pp,
          㦭 pp - p,   㤠
        p饥 p   'purge'. ᫨ p  
        p,    訡  㤥 ᮮ饭.   p
         pp - ppp ᨬ
        (p   'equ'  ⮪), ᯮ ᫥騩 㬭
        p:

        macro undefine symbol
         {
          local undefined
          symbol equ undefined
         }

        Hpp, ᫥ 'undefine add',    ᯮ짮 p
        'add',  p ⪨ 'add' . , ᫨ 
        ᯮ '_add equ add',  ⥬ 'undefine add',  
        p  'add'     p樨 'add' p ᨬ
        '_add'.

equ - p ᨬ ⠭.

2.2.2  ⠭   pp

use16 - ⠭ ⨯  p 16- ⭮ ( 㬮砭).

use32 - ⠭ ⨯  p 32- ⭮ ( 㬮砭  p PE).

org - p㬥   祭 p; ⠭   p
        筥  .

format - ⠭ 室 p 䠩,   , MZ  PE;
          - p  㬮砭, MZ - EXE-p, PE - p
         p⠡쭮 ᯮ塞 䠩.  㪠 p⮬ 
         PE,  ᯮ짮 ⥫ p p; ᯮ
         ᫮ 'console', 'GUI'  'native', ⮡ ⠭ ⨯ ⥬
         ( 㪠 p ⥬); 'i386', 'i486'  'i586', ⮡
         㪠 p; 'DLL', ⮡ ᮧ  ⥪.

segment - p ᥣ  ⥪饩 樨 (⮫쪮  p MZ), 
          㤥 p  pp.  p ᥣ 
          ᯮ짮 'use16'  'use32' ᫥  ᥣ.

section - p ᥪ樨  ⥪饩 樨 (⮫쪮  p PE), 
          㤥 p  p (4096). p p㬥 -  p,
          ᮤp  ᥪ樨  樮 p㬥 - ⨯ ᥪ樨 (code,
          data, udata, export, import, resource),  p ᥪ樨
          (readable, writeable, executable, shareable, discardable).

entry - p 室 窨 pp (⮫쪮  p⮢ MZ  PE). 
        p MZ p   㪠  p segment:offset ( 
        쭥 맮).

stack - p pp pp ⥪ (⮫쪮  p MZ  PE),
        ᫨ ⥪  p, ᯮ pp  㬮砭 1000h .
         p MZ ⮯ ⥪     p
        segment:offset.  p PE  ᯮ짮 p p㬥 
        p ⮣, ᪮쪮  뤥  ⥪ p p ᪥
        pp (p p㬥 p 騩 pp  ⥪).

heap - p pp ''  pp (⮫쪮  p⮢ MZ  PE).
        p MZ p㬥  16- ᫮  p
       ᨬ p ⥫쭮   pp (p
       ,    ⤥쭮  ⥪  p ;
       ᯮ 'heap 0', ⮡ pp  ⮫쪮  ,
       p  ⢨⥫쭮 㦭); 祭   㬮砭 p
       FFFFh.  p PE p㬥  32-  祭, 騬
       pp ;  ᯮ짮 p pp, ⮡ p
       稥⢮   , 뤥塞 p⢥ p p
       pp.

data - 砫 p , ᯥ  p PE. p㬥⮬
        p pp PE-  pp ⨯ 
       (export, import, resource). p  ᫥ 稢
       p⨢ 'end data'.

2.2.3  p ⮪  ⠭

label - p , p  ⢥ p㬥  ⪨,
        易⥫묨 p㬥⠬  pp 祭  
         'at <p>'.

load - p ⠭, p 筮 祭, p㦥  䠩;
       p㬥:  ⠭, 易⥫쭮 pp ⠭ (᫨ pp
        㪠,  㤥 pp  ), ⥬  'from
       <file>', ᫥  䠩   㪠   䠩, p
       p 稥.

2.2.4  Other directives

2.2.4  p㣨 p⨢

times - repeat instruction n times; arguments are number of repeats and
        instruction to repeat (optionally character ':' can be used to
        separate number and instructions), also % value (current repeat
        number) can be used in instruction, so 'times 5 db %' will create
        01,02,03,04,05 bytes; recurrency is also allowed, so
        'times 3 times % db %' will create 01,01,02,01,02,03 bytes.

times - p p n p; p㬥: ⢮ p 
        p樨, p 㦭 p ( p ᫠ 
        p樨  ᯮ짮 ᨬ ':'), ⠪ 祭 % (p
        ⥪饣 p)  ᯮ짮  p樨, ⮬
        'times 5 db %' ᮧ  01,02,03,04,05; pp ⠪ 㯭,
        ⮬ 'times 3 times % db %' ᮧ  01,01,02,01,02,03.

repeat - 㢥祭 p p⨢ times,  p  ᥣ 
         p㬥 - ⢮ p, p樨, p 㦭
         p,  稭  ᫥饩 ,  稢
         p⨢ 'end repeat'.

display - ⮡p ⥪  p ᥬp; p㬥 - p 
          ⮢ 祭, p   ⮡p.

virtual - ᮧ p㠫     㪠 p;  
            祭  室 䠩,  p ⪨  
          묨  p㣨  pp; p㬥⮬ 'virtual' 
           'at <p>', p㠫 p樨  稭
           ᫥饩 ,  稢 p㠫  
          p⨢ 'end virtual'. ᫨  p⨢  p㬥⮢, 
          㤥 ᯮ짮 ⥪騩 p, ⮦ ᠬ,   'virtual at $'.

if - ᯮ  ᥬp p ⥩ , p
     㤮⢮p 㪠 ᫮; p㬥 - ᪮ p, ⥬
        p館, p   ᥬp, ᫨
      p p 'true', ⮬ p⨢ 'end if',  'else', 
     'else if'  ᪨ p.

end - ᯮ  p襭 p pp , p
      p묨  p㣨 p⨢.



p:

    Ken Martwick -    ᠭ 㬥樨
    Bartek Uliasz -    砫 p fasm
    Bill Isherwood -    p
    Leonid Petroff -  ᮮ饭  訡  p㣨  p
