gforth
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Examples AMD64 assembler programming in gforth


From: anthony
Subject: Examples AMD64 assembler programming in gforth
Date: Mon, 17 Aug 2020 11:36:19 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0

|I hope this will speed up your learning curve,||
||cheers, Anthony|

|------------------------------------------------------------------------------|

|\ A few examples using gForth assembler for AMD64||
||\ provided by Anthony Vogelaar, Perth UK||
||\ rev 0.10  2020-08-17  initial release||
||
||\ Do nothing||
||ABI-CODE aNOP  ( -- )||
||   DI          AX      MOV          \ SP out := SP in ||
||                       RET||
||END-CODE||
||
||
||\ Drop TOS||
||ABI-CODE aDROP  ( n -- )||
||   DI          AX      MOV          \ SPout := SPin||
||   8   #       AX      ADD          \ SP := SP + 8 byte = 64 bit||
||                       RET||
||END-CODE||
||
||
||\ Push 5 on the data stack||
||ABI-CODE aFIVE   ( -- 5 )||
||   DI          AX      MOV          \ SPout := SPin||
||   8   #       AX      SUB          \ Increase stack by 1 cell||
||   5   #       AX  )   MOV          \ Add 5 to TOS||
||                       RET||
||END-CODE ||
||
||
||\ Push 10 and 20 to data stack||
||ABI-CODE aTOS2  ( -- n n )||
||   DI          AX      MOV          \ SPout := SPin||
||   8   #       AX      SUB          \ Increase stack by 1 cell||
||   10  #       AX  )   MOV          \ Add 10 to TOS||
||   8   #       AX      SUB          \ Increase stack by 1 cell||
||   20  #       AX  )   MOV          \ Add 20 to TOS||
||                       RET||
||END-CODE||
||
||
||\ Push 5 and 1 to data stack||
||ABI-CODE aFIVE.   ( -- 5 1 )||
||   DI          AX      MOV          \ SPout := SPin||
||   16  #       AX      SUB          \ Increase stack by 2 cells||
||   5   #   8   AX  D)  MOV          \ Add 5 to TOS-1||
||   1   #       AX  )   MOV          \ Add 1 to TOS||
||                       RET||
||END-CODE||
||
||
||\ Get Time Stamp Counter as two 32 bit integers||
||\ The TSC is incremented every CPU clock pulse||
||ABI-CODE aRDTSC   ( -- TSCl TSCh )||
||                       RDTSC        \ DX:AX := TSC||
||   $FFFFFFFF # AX      AND          \ Clear upper 32 bit AX||
||   0xFFFFFFFF # DX     AND          \ Clear upper 32 bit DX||
||   AX          R8      MOV          \ Tempory save AX||
||   DI          AX      MOV          \ SPout := SPin||
||   16  #       AX      SUB          \ Create two cells on data stack||
||   R8  8       AX  D)  MOV          \ TOS-1 := saved AX = TSC low||
||   DX          AX  )   MOV          \ TOS := Dx = TSC high||
||                       RET||
||END-CODE||
||
||
||\ Get Time Stamp Counter as 64 bit integer||
||ABI-CODE RDTSC   ( -- TSC )||
||                       RDTSC        \ DX:AX := TSC||
||   $FFFFFFFF # AX      AND          \ Clear upper 32 bit AX||
||   32  #       DX      SHL          \ Move lower 32 bit DX to upper 32 bit||
||   AX          DX      OR           \ Combine AX wit DX in DX||
||   DI          AX      MOV          \ SPout := SPin||
||   8   #       AX      SUB          \ Add 1 cell to stack||
||   DX          AX  )   MOV          \ TOS := DX||
||                       RET||
||END-CODE||
||||
||||
||VARIABLE V||
||
||\ Assign 4 to variable V||
||ABI-CODE V=4 ( -- )||
||   BX                  PUSH         \ Save BX, used by gforth||
||   V   #       BX      MOV          \ BX := address of V||
||   4   #       BX )    MOV          \ Write 4 to V||
||   BX                  POP          \ Restore BX||
||   DI          AX      MOV          \ SPout := SPin||
||                       RET||
||END-CODE||
||
||
||\ Assign 5 to variable V||
||ABI-CODE V=5 ( -- )||
||   V   #       CX      MOV          \ BX := address of V||
||   5   #       CX )    MOV          \ Write 5 to V||
||   DI          AX      MOV          \ SPout := SPin||
||                       RET||
||END-CODE||
||
||
||\ Do two IF tests||
||ABI-CODE TEST2  ( -- n n )||
||   DI      AX          MOV              \ SPout := SPin||
||   5   #   CX          MOV              \ CX := 5||
||   5   #   CX          CMP||
||   0= IF||
||       1   #   DX          MOV          \ If CX = 5 then DX := 1  <--||
||   ELSE||
||       2   #   DX          MOV          \ else DX := 2||
||   THEN||
||   8   #   AX          SUB              \ Add DX to stack||
||   DX      AX  )       MOV||
||   6   #   CX          CMP||
||   0= IF||
||       3   #   DX          MOV          \ If CX = 6 then DX := 3||
||   ELSE||
||       4   #   DX          MOV          \ else DX := 4  <--||
||   THEN||
||   8   #   AX          SUB              \ Add DX to stack||
||   DX      AX  )       MOV||
||                       RET||
||END-CODE||
||
||
||\ Do four loops||
||ABI-CODE LOOP4  ( -- n n n n )||
||   DI      AX          MOV             \ SPout := SPin||
||   -1  #   CX          MOV             \ CX := -1||
||   4   #   DX          MOV             \ DX := 4 loop counter||
||   BEGIN||
||       8   #   AX          SUB         \ Add CX to stack||
||       CX      AX  )       MOV||
||       1   #   DX          SUB         \ DX := DX - 1||
||   0= UNTIL||
||                    RET||
||END-CODE||
||
|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]