(03) storing label addresses

This commit is contained in:
pommicket 2021-11-11 12:54:20 -05:00
parent ea6989a71a
commit a8f48b329a
4 changed files with 382 additions and 38 deletions

View file

@ -71,6 +71,7 @@ plus six new ones:
- `--` outputs a label's (absolute) address - `--` outputs a label's (absolute) address
- `:-` outputs a label's relative address - `:-` outputs a label's relative address
- `##` outputs a number - `##` outputs a number
- `~~` outputs 255 zeros
- `//` is for comments - `//` is for comments
- `\n\n` does nothing (used for spacing) - `\n\n` does nothing (used for spacing)
@ -172,6 +173,13 @@ since `0x90` gets inserted between the "load immediate" instruction code and the
`\n\n` works identically, and lets us space out code a bit. But be careful: `\n\n` works identically, and lets us space out code a bit. But be careful:
the number of blank lines must be a multiple of 3! the number of blank lines must be a multiple of 3!
In the middle of the label table, you'll find a mysterious `ff` byte. This is at the position for
the command `~~` (the end of the command table overlaps with the start of the label table).
This command is just 255 bytes of zeros. If you defined a label whose position in the label
table overlaps with these zeros, you'd screw up the command. But fortunately, this will only happen
if you include `\r` or a non-printing character in your label names.
This is so that you can have big buffers to put data in (like our label table from this compiler).
## limitations ## limitations
Many of the limitations of our previous compilers apply to this one. Also, Many of the limitations of our previous compilers apply to this one. Also,

View file

@ -16531,7 +16531,6 @@ unused padding
linux doesn't seem to like writing at addresses linux doesn't seem to like writing at addresses
past the end of the file. past the end of the file.
so we do have to include this so we do have to include this
;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc;cc
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
@ -16640,6 +16639,7 @@ so we do have to include this
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;ff;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 command ~~ outputs 255 bytes of zeros
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00
;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00 ;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00;00

404
03/in02
View file

@ -1,36 +1,6 @@
jm
:-co
::if
'i
'n
'0
'3
00
::of
'o
'u
't
'0
'3
00
::BD
'B
'a
'd
20
'd
'i
'g
'i
't
\n
//
//
//
::co
// open input file // open input file
im im
--if --IF
JA JA
zA zA
IA IA
@ -39,7 +9,7 @@ im
sy sy
// open output file // open output file
im im
--of --OF
JA JA
im im
##241. ##241.
@ -50,14 +20,145 @@ DA
im im
##2. ##2.
sy sy
// read next line
::rl
im im
##43. --LI
RA rbp pointer to line buffer
::rL read loop
im
##3. input file descriptor
JA
IR where to read into
im
##1.
DA read 1 byte
im
##0. syscall 0 (read)
sy
// check how many bytes were read
BA BA
im im
--hx ##1.
cl jg if 1 greater than number of bytes read
:-ef end of file
BR
DR pointer to character we just read
im
##1.
+B
RA
BD
zA
lb
BA
im
##a.
jn
:-rL keep looping
// we now have a full line from the file in ::LI
// the pointer to the end of the line is in rbp
// look at the first character
im
--LI
BA
zA
lb
BA
im
##3b. ascii ';'
je if it's a comment,
:-rl jump back to read the next line
im
##a. ascii '\n'
je if it's a blank line,
:-rl jump back to read the next line
im
##3a. ascii ':'
je
:-ld label definition
jm jm
:-ex :-ex
// label definition
::ld
// first, check if we're on the second pass.
im
--2P
BA
zA
lb
BA
zA
jn if on second pass,
:-rl ignore this (read next line)
// first get current address
im
##4. output fd
JA
zA
IA offset = 0
im
##1. whence = SEEK_CUR
DA
im
##8. syscall 8 = lseek
sy
BA
im
##400000. address of start of file
+B
DA put current address in rdx
im
--L$
BA
lq
JA
im
--LI
IA
// copy from rsi to rdi until a newline is reached
::lc label copy
BI
zA
lb
BA
// store in rdi
AJ
xc
sb
CA put byte in rcx
// increment rdi,rsi
BJ
im
##1.
+B
JA
BI
im
##1.
+B
IA
BC
im
##a.
jn if byte we read wasn't a newline,
:-lc keep looping
// store address of label in rdi
AD
BJ
sd
// increment rdi by 4, because we stored an 4-byte number
im
##4.
+B
JA
// now set L$ to rdi
im
--L$
BA
AJ
sq
cc
// //
// //
// exit with code in rax // exit with code in rax
@ -112,3 +213,236 @@ im
##1. ##1.
jm jm
:-ex :-ex
// end of file
::ef
// TODO: second pass
zA exit code 0
jm
:-ex
::2P second pass?
00
::IF input file name
'i
'n
'0
'3
00
::OF output file name
'o
'u
't
'0
'3
00
::BD bad digit error message
'B
'a
'd
20
'd
'i
'g
'i
't
\n
::LI line buffer
~~
::L$ end of current label list
--LB
::LB labels
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~
~~

View file

@ -1,9 +1,11 @@
J=d0 :lbab
;J=d0
A=d60 A=d60
syscall syscall
:label :label
B+=J B+=J
B<<=9 B<<=9
B-=J B-=J
J?<B-label J?<B:label