Re: amd64 missing addressing modes

anthony <[email protected]> Wed, 26 Aug 2020 16:34:22 +0100
Newsgroups gmane.comp.lang.forth.gforth
Message-ID <[email protected]>
Dear Bernd Paysan,

On 26/08/2020 14:42, Bernd Paysan wrote:
> Am Mittwoch, 26. August 2020, 15:35:45 CEST schrieb anthony:
>> I try to use amd64 assembly with addressing mode base with displacement,
>> scaled index and scaled index with displacement gforth i.e.
>>
>> mov (%rdx,%rcx,1),%rax
>> mov (%rdx,%rcx,4),%rax
>> mov 40(%rdx,%rcx,4),%rax
>>
>> I installed gforth from git version 0.7.9_20200820 on linux opensuse
>> 15.1 64 bit.
>> I included this code to test:
>>
>> ABI-CODE A  ( -- )
>>       500  #  AX  MOV    \ AX := 500
>>       DX  AX  MOV    \ AX := DX
>>        200  AX  MOV    \ AX := (200)
>>        DX  )  AX  MOV    \ AX := (DX)
>>        40  DX  D)  AX  MOV    \ AX := (DX + 40)
>> \  DX  CX  I)  AX MOV    \ AX := (DX + CX)
>> \  DX  CX  *4  I)  AX  MOV    \ AX := (DX + CX * 4)    *1/2/4/8
>> \  40  DX  CX  *4  DI)  AX  MOV    \ AX := (DX + CX * 4 + 40)
>>
>>       DI  AX  MOV
>>       RET
>> END-CODE
>>
>> Compiling any of the now commented three lines results in an "invalid
>> memory address" error.
>> Maybe I am using an invalid syntax? Thought this was the correct syntax
>> after reading asm.fs
>>
>> Every help is very much appreciated.
>> Anthony
> This here works:
>
> abi-code test  ok 1
> ax cx *4 i) dx mov  ok 1
> 3 ax cx *8 di) dx mov  ok 1
> ret   ok 1
> end-code
> see test
> ABI-Code test
> 7F38B25582B0:   mov     rdx,[rax][rcx*4]
> 7F38B25582B4:   mov     rdx,$03[rax][rcx*8]
> 7F38B25582B9:   ret
> end-code
>
> Your example doesn't work, though.  Looks like some storage is not cleaned
> after finishing with one instruction.  Your syntax is ok.
>
Thanks, your approach to test it in design time is great! and the 
assurance there is no syntax error. This brings me miles ahead.