second pass (+hello world!), call A
This commit is contained in:
parent
383d1fbe27
commit
3fe11fa0cb
3 changed files with 200 additions and 48 deletions
39
03/ex03
Normal file
39
03/ex03
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
D]=d7
|
||||
D]=C
|
||||
D^=C
|
||||
D|=C
|
||||
D&=C
|
||||
~C
|
||||
B|=A
|
||||
8D=C
|
||||
A=1B
|
||||
B>=d33
|
||||
call :funciton
|
||||
x4b
|
||||
!:label
|
||||
?J<B:label
|
||||
:label
|
||||
1B=C
|
||||
; :l ba b
|
||||
;J=d0
|
||||
A=d60
|
||||
syscall x3c
|
||||
;;;;;;;;;;;;;;;;;;;;;;;align
|
||||
:label
|
||||
;;;;;;;;;;;;;;;;;;;;;;;reserve d1000
|
||||
B+=J
|
||||
B<=d9
|
||||
B-=J
|
||||
?J=B:label
|
||||
?A!B:label
|
||||
?A>B:label
|
||||
A=:label
|
||||
x3c
|
||||
;;;;;;;;;;;;;;;;;;;;;;;return
|
||||
;;;;;;;;;;;;;;;;;;;;;;;*-
|
||||
;;;;;;;;;;;;;;;;;;;;;;;/-
|
||||
;;;;;;;;;;;;;;;;;;;;;;;*+
|
||||
;;;;;;;;;;;;;;;;;;;;;;;/+
|
||||
:funciton
|
||||
call A
|
146
03/in02
146
03/in02
|
@ -20,6 +20,7 @@ DA
|
|||
im
|
||||
##2.
|
||||
sy
|
||||
::2p where the second pass starts from
|
||||
// write ELF header
|
||||
im
|
||||
##4.
|
||||
|
@ -109,7 +110,11 @@ je
|
|||
im
|
||||
##78. ascii 'x'
|
||||
je
|
||||
:-x# literal byte
|
||||
:-#b literal byte
|
||||
im
|
||||
##27. ascii '
|
||||
je
|
||||
:-#b literal byte
|
||||
im
|
||||
##31. ascii '1'
|
||||
je
|
||||
|
@ -194,6 +199,20 @@ im
|
|||
##1.
|
||||
je
|
||||
:-cl
|
||||
im
|
||||
--SY "sycall"
|
||||
IA
|
||||
im
|
||||
--LI
|
||||
JA
|
||||
im
|
||||
--s=
|
||||
cl
|
||||
BA
|
||||
im
|
||||
##1.
|
||||
je
|
||||
:-sy
|
||||
jm
|
||||
:-ex
|
||||
// handle += instruction
|
||||
|
@ -1069,7 +1088,7 @@ BA
|
|||
lq
|
||||
BI
|
||||
je
|
||||
:-bl bad label if we've reached the end
|
||||
:-!l bad label if we've reached the end
|
||||
JR
|
||||
im
|
||||
--s=
|
||||
|
@ -1219,7 +1238,7 @@ DA
|
|||
jm
|
||||
:-wr
|
||||
// literal byte
|
||||
::x#
|
||||
::#b
|
||||
im
|
||||
--LI
|
||||
BA
|
||||
|
@ -1735,7 +1754,7 @@ jm
|
|||
:-wr
|
||||
::S)
|
||||
SA
|
||||
// handle "call :label"
|
||||
// handle call :label / call A
|
||||
::cl
|
||||
im
|
||||
##5. add 5 to line pointer to get pointer to label name
|
||||
|
@ -1744,9 +1763,25 @@ im
|
|||
--LI
|
||||
+B
|
||||
BA
|
||||
zA
|
||||
lb
|
||||
BAs
|
||||
im
|
||||
##41.
|
||||
je
|
||||
:-ca call a
|
||||
im
|
||||
##5. add 5 to line pointer to get pointer to label name
|
||||
BA
|
||||
im
|
||||
--LI
|
||||
+B
|
||||
BA
|
||||
im
|
||||
--l@
|
||||
cl
|
||||
// intentional fallthrough
|
||||
::ca
|
||||
// emit 'call rax'
|
||||
im
|
||||
--Cl instruction
|
||||
|
@ -1761,6 +1796,35 @@ jm
|
|||
:-rl jump back to read next line
|
||||
::Cl
|
||||
cl
|
||||
// handle "syscall <number>"
|
||||
::sy
|
||||
im
|
||||
##8.
|
||||
BA
|
||||
im
|
||||
--LI
|
||||
+B add 8 to line pointer to get pointer to number
|
||||
BA
|
||||
im
|
||||
--nu
|
||||
cl get syscall number
|
||||
BA
|
||||
im
|
||||
--im
|
||||
cl write 'mov rax, <syscall number>'
|
||||
im
|
||||
--Sy
|
||||
IA
|
||||
im
|
||||
##2.
|
||||
DA
|
||||
im
|
||||
--wr
|
||||
cl write 'syscall'
|
||||
jm
|
||||
:-rl next line
|
||||
::Sy
|
||||
sy
|
||||
// write to output file from rsi..rsi+rdx
|
||||
::wr
|
||||
im
|
||||
|
@ -1820,8 +1884,32 @@ im
|
|||
##78. ascii 'x'
|
||||
je
|
||||
:-#x hexadecimal
|
||||
im
|
||||
##27. ascii '
|
||||
je
|
||||
:-#' ascii character
|
||||
jm
|
||||
:-!n unrecognized number base
|
||||
// convert character pointed to by rsi to character code in rax
|
||||
::#'
|
||||
// make sure there's no trailing characters
|
||||
im
|
||||
##1.
|
||||
BI
|
||||
+B
|
||||
BA
|
||||
zA
|
||||
lb
|
||||
BA
|
||||
im
|
||||
##a.
|
||||
jn
|
||||
:-!n
|
||||
// okay, no trailing characters, just set rax = *rsi
|
||||
BI
|
||||
zA
|
||||
lb
|
||||
re
|
||||
// convert newline-terminated decimal representation in rsi to number in rax
|
||||
::#d
|
||||
zA
|
||||
|
@ -1982,10 +2070,45 @@ jm
|
|||
:-ex
|
||||
// end of file
|
||||
::ef
|
||||
// TODO: second pass
|
||||
zA exit code 0
|
||||
im
|
||||
--2P
|
||||
BA
|
||||
zA
|
||||
lb
|
||||
DA
|
||||
// set 2P to 1 no matter what
|
||||
im
|
||||
##1.
|
||||
sb
|
||||
BD
|
||||
zA
|
||||
jn if 2nd pass is not zero,
|
||||
:-ex exit
|
||||
// okay we need to do the second pass.
|
||||
// rewind file descriptors
|
||||
// input
|
||||
im
|
||||
##3.
|
||||
JA
|
||||
zA
|
||||
IA
|
||||
DA
|
||||
im
|
||||
##8. lseek
|
||||
sy
|
||||
// output
|
||||
im
|
||||
##4.
|
||||
JA
|
||||
zA
|
||||
IA
|
||||
DA
|
||||
im
|
||||
##8. lseek
|
||||
sy
|
||||
// now go back to do the second pass
|
||||
jm
|
||||
:-ex
|
||||
:-2p
|
||||
::2P second pass?
|
||||
00
|
||||
::CL "call" text
|
||||
|
@ -1994,6 +2117,15 @@ jm
|
|||
'l
|
||||
'l
|
||||
20
|
||||
::SY "syscall" text
|
||||
's
|
||||
'y
|
||||
's
|
||||
'c
|
||||
'a
|
||||
'l
|
||||
'l
|
||||
20
|
||||
::IF input file name
|
||||
'i
|
||||
'n
|
||||
|
|
63
03/in03
63
03/in03
|
@ -1,43 +1,24 @@
|
|||
|
||||
D]=d7
|
||||
e
|
||||
|
||||
D]=C
|
||||
D^=C
|
||||
D|=C
|
||||
D&=C
|
||||
~C
|
||||
B|=A
|
||||
8D=C
|
||||
e
|
||||
A=1B
|
||||
B>=d33
|
||||
e
|
||||
call :funciton
|
||||
x4b
|
||||
!:label
|
||||
?J<B:label
|
||||
:label
|
||||
e
|
||||
1B=C
|
||||
; :l ba b
|
||||
;J=d0
|
||||
A=d60
|
||||
J=d1
|
||||
I=:hello_world
|
||||
D=:hello_world_end
|
||||
D-=I
|
||||
syscall d1
|
||||
J=d42
|
||||
syscall x3c
|
||||
align
|
||||
:label
|
||||
reserve d1000
|
||||
B+=J
|
||||
B<=d9
|
||||
B-=J
|
||||
?J=B:label
|
||||
?A!B:label
|
||||
?A>B:label
|
||||
A=:label
|
||||
x3c
|
||||
return
|
||||
-*
|
||||
-/
|
||||
+*
|
||||
+/
|
||||
|
||||
:hello_world
|
||||
'H
|
||||
'e
|
||||
'l
|
||||
'l
|
||||
'o
|
||||
',
|
||||
x20
|
||||
'w
|
||||
'o
|
||||
'r
|
||||
'l
|
||||
'd
|
||||
'!
|
||||
xa
|
||||
:hello_world_end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue