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.