@@ 29,9 29,12 @@ global _start
; pointer size for operands
%define ptr qword
+%define strlensize 1
+%define strlentype byte
+
%macro string 1
%strlen len %1
- dq len
+ db len
db %1, 0
%endmacro
@@ 341,8 344,8 @@ fcreate number
mov r9, [base]
mov r8, 1
xor rbp, rbp
- lea rdx, [tos+ptrsize]
- mov tos, [tos] ; fetch len of string
+ lea rdx, [tos+strlensize]
+ movzx tos, strlentype [tos] ; fetch len of string
; set rbx to the last char, so -1, otherwise we would be
; at the first byte after the string
lea rbx, [rdx+tos-1]
@@ 376,7 379,7 @@ fcreate number
mpop
ret
-; ( number base -- saddr )
+; ( number base -- *str )
; be aware: ".s" uses itoa, so it will overwrite the result in repl mode !
fcreate itoa
mpush rbx, rbp, rcx, rdi, rdx
@@ 423,8 426,8 @@ fcreate itoa
.positive2:
; save len of string
sub rdi, rcx ; rdi: #chars
- lea rdx, [rcx-ptrsize+1] ; only -(ptrsize-1) because of last dec in loop
- mov [rdx], rdi
+ lea rdx, [rcx-strlensize+1] ; only -(strlensize-1) because of last dec in loop
+ mov [rdx], dil ; strlen
; push addr of string
mov tos, rdx
@@ 444,9 447,9 @@ fcreate printstr, `".`
; ( fd addr - )
fcreate writestr, `"write`
dup
- mov tos, [tos] ; load len
+ movzx tos, strlentype [tos] ; strlen
; skip len field to push data buffer
- add ptr nos, ptrsize
+ add ptr nos, strlensize
exec write
; todo: error handling
drop
@@ 464,13 467,13 @@ fcreate cmpstr, `"=?`
mov rsi, tos
; compare len field
- mov rcx, ptr [rsi]
- cmp rcx, ptr [rdi]
+ movzx rcx, strlentype [rsi] ; strlen
+ cmp cl, strlentype [rdi] ; strlen
jnz .quit
; same len, compare data, rcx is counted down
- lea rdi, [rdi+ptrsize]
- lea rsi, [rsi+ptrsize]
+ lea rdi, [rdi+strlensize]
+ lea rsi, [rsi+strlensize]
repz cmpsb
.quit:
pop rsi
@@ 503,7 506,7 @@ fcreate getc
cmp tos4, [buflen]
je .readmore
; lea tos, [buf] ; need this step because of rpi relative addressing
- movzx tos4, byte [buf+tos]; fetch char from bufcurr
+ movzx tos, byte [buf+tos]; fetch char from bufcurr
inc ptr [bufcurr]
ret
.readmore:
@@ 546,9 549,9 @@ fcreate word
; fcreate doword, "(word)"
mpush rbx, rcx
mov rbx, tos
- lea rbx, [rbx+ptrsize] ; skip len field
+ lea rbx, [rbx+strlensize] ; skip len to string data field
call skipws
- mov rcx, rbx ; ecx = counter
+ mov rcx, rbx ; rcx = begin of string data field
; ( c saddr c )
.nextchar:
mov [rbx], al
@@ 568,7 571,7 @@ fcreate word
neg rcx
mov rbx, nos ; len address
nip
- mov [rbx], rcx
+ mov [rbx], cl ; strlen
mov tos, rbx
mpop
ret
@@ 577,7 580,7 @@ fcreate word
fcreate find, "(find)"
mpush rbx, rcx
- mov rbx, [tos]
+ mov rbx, [tos] ; rbx = dict address
drop
.prev:
; ( *str )
@@ 837,7 840,7 @@ create:
; save word name
exec word
drop
-
+ ; ( *dp -- )
; rbx holds dp
mov rbx, [dictp]
; save new prev
@@ 852,12 855,12 @@ create:
mov [rbx], rcx
lea rbx, [rbx+ptrsize]
; name len field comes now, skip string
- mov rcx, [rbx]
+ movzx rcx, strlentype [rbx] ; fetch strlen
; skip len field, string and \0 at the end
- lea rbx, [rcx+rbx+ptrsize+1]
+ lea rbx, [rcx+rbx+strlensize+1]
; append empty symbol field name
- mov ptr [rbx], 0
- lea rbx, [rbx+ptrsize]
+ mov strlentype [rbx], 0
+ lea rbx, [rbx+strlensize]
; save new dp
mov [dictp], rbx
mpop
@@ 79,8 79,9 @@ m: @ rex.w, # ( REX.W for using rax
m: @4 008b ,2 ; ( mov eax, [rax] )
: @8 # : @ @ ; : @4 @4 ;
m: @2 00b70f48 ,4 ; : @2 @2 ; ( movzx rax, word ptr [rax] )
-m: @1 00b60f67 ,4 ; : @1 @1 ; ( movzx rax, byte ptr [rax] )
-
+m: "len # ( fetch string length )
+m: @1 00b60f67 ,4 ; ( movzx rax, byte ptr [rax] )
+: "len "len ; : @1 @1 ;
( n addr -- )
m: !8 #
m: ! c28948 ,3 ^ drop ( mov rdx, rax )
@@ 89,8 90,10 @@ m: !4 c28948 ,3 ^ drop ( mov rdx, rax
0289 ,2 ^ drop ; : !4 !4 ; ( mov [rdx], eax )
m: !2 c28948 ,3 ^ drop ( mov rdx, rax )
028966 ,3 ^ drop ; : !2 !2 ; ( mov [rdx], ax )
+m: !"len #
m: !1 c28948 ,3 ^ drop ( mov rdx, rax )
0288 ,2 ^ drop ; : !1 !1 ; ( mov [rdx], al )
+: !"len !"len ;
( add n to [addr] )
( n addr -- )
@@ 257,12 260,14 @@ m: cpush lit4 ; ( elf )
: oct 8 base ! ;
( n -- )
+: v,"len # ( append string length field )
: v,1 1 vp (,) ;
: v,2 2 vp (,) ;
: v,4 4 vp (,) ;
: v, #
: v,8 8 vp (,) ;
+
: valloc ( n -- ) vp +! ;
: vhere ( -- n ) vp @ ;
@@ 281,6 286,7 @@ m: cpush lit4 ; ( elf )
: vlabel # ( elf )
: const fcreate ^ lit ^ ;; ;
+
\ todo: remove if external symbols in elf64.fox are removed
cp vlabel cp \ needed by asm.fox
@@ 317,12 323,12 @@ ffind fdp
the string is appended to the data block )
( -- saddr )
: " vhere \ save vp to save string len later
- 0 v, \ leave space for string len
+ 0 v,"len \ leave space for string len
c"
\ compute and store len
( *str *strdata )
vhere 1- - neg \ 1- because of trailing 0
- over ! ;
+ over !"len ;
( m: -- i: -- saddr )
m: " # ffind " call, # ^ vpush ;
@@ 392,7 398,10 @@ dcols
: ret, ^ ;; ;
-: "data # 1 cell # lit + ;
+ 1 const
+"lensize
+
+: "data "lensize + ;
( dictaddr -- code field link address )
: cfl # 1 cell # lit + ;