diff options
-rw-r--r-- | 04/README.md | 6 | ||||
-rw-r--r-- | 04/guessing_game | 4 | ||||
-rw-r--r-- | 04/in03 | 104 | ||||
-rw-r--r-- | 04/in04 | 7 | ||||
-rw-r--r-- | 04a/in04 | 16 |
5 files changed, 60 insertions, 77 deletions
diff --git a/04/README.md b/04/README.md index b9ee066..68cd81d 100644 --- a/04/README.md +++ b/04/README.md @@ -227,6 +227,9 @@ A *term* is one of: - `{variable name}` - the value of a (local or global) variable - `.{label name}` - the address of a label - `{number}` +- `&{variable}` - address of variable +- `*1{variable}` / `*2{variable}` / `*4{variable}` / `*8{variable}` - dereference 1, 2, 4, or 8 bytes +- `~{term}` - bitwise not An *l-value* is the left-hand side of an assignment expression, and it is one of: @@ -239,9 +242,6 @@ and it is one of: An *r-value* is an expression, which can be more complicated than a term. r-values are one of: - `{term}` -- `&{variable}` - address of variable -- `*1{variable}` / `*2{variable}` / `*4{variable}` / `*8{variable}` - dereference 1, 2, 4, or 8 bytes -- `~{term}` - bitwise not - `{function}({term}, {term}, ...)` - `{term} + {term}` - `{term} - {term}` diff --git a/04/guessing_game b/04/guessing_game index 2c8fea9..5c85252 100644 --- a/04/guessing_game +++ b/04/guessing_game @@ -107,12 +107,10 @@ function stoi function strlen argument s - local c local p p = s :strlen_loop - c = *1p - if c == 0 goto strlen_loop_end + if *1p == 0 goto strlen_loop_end p += 1 goto strlen_loop :strlen_loop_end @@ -1238,6 +1238,12 @@ align ?C=D:term_number D='. ?C=D:term_label + D='* + ?C=D:term_dereference + D='& + ?C=D:term_addressof + D='~ + ?C=D:term_bitwise_not D=d58 ?C<D:term_number ; (fallthrough) @@ -1274,16 +1280,6 @@ align C=:rvalue 8C=I - C=1I - D='& - ?C=D:rvalue_addressof - - D='~ - ?C=D:rvalue_bitwise_not - - D='* - ?C=D:rvalue_dereference - J=I :rvalue_loop C=1J @@ -1506,50 +1502,6 @@ align :rvalue_shr call :set_rcx_to_rsi !:emit_shr_rax_cl - -:rvalue_addressof - I+=d1 - !:set_rax_to_address_of_variable - -:rvalue_bitwise_not - I+=d1 - call :set_rax_to_term - J=d4 - I=:not_rax - D=d3 - syscall x1 - return -:not_rax - x48 - xf7 - xd0 - -:rvalue_dereference_size - reserve d1 - -:rvalue_dereference - I+=d1 - D=1I - C=:rvalue_dereference_size - 1C=D - I+=d1 - call :set_rax_to_variable - call :set_rbx_to_rax - call :zero_rax - C=:rvalue_dereference_size - C=1C - - D='1 - ?C=D:set_al_to_[rbx] - D='2 - ?C=D:set_ax_to_[rbx] - D='4 - ?C=D:set_eax_to_[rbx] - D='8 - ?C=D:set_rax_to_[rbx] - - !:bad_term - ; set <rax> to address of variable in rsi :set_rax_to_address_of_variable @@ -1600,7 +1552,51 @@ align call :read_number I=A !:set_rax_to_immediate + +:term_bitwise_not + I+=d1 + call :set_rax_to_term + J=d4 + I=:not_rax + D=d3 + syscall x1 + return +:not_rax + x48 + xf7 + xd0 + +:term_dereference_size + reserve d1 + +:term_dereference + I+=d1 + D=1I + C=:term_dereference_size + 1C=D + I+=d1 + call :set_rax_to_variable + call :set_rbx_to_rax + call :zero_rax + C=:term_dereference_size + C=1C + D='1 + ?C=D:set_al_to_[rbx] + D='2 + ?C=D:set_ax_to_[rbx] + D='4 + ?C=D:set_eax_to_[rbx] + D='8 + ?C=D:set_rax_to_[rbx] + + !:bad_term + +:term_addressof + I+=d1 + !:set_rax_to_address_of_variable + + ; set rax to the number in the string at rsi :read_number C=1I @@ -15,8 +15,7 @@ function strlen local p p = s :strlen_loop - c = *1p - if c == 0 goto strlen_loop_end + if *1p == 0 goto strlen_loop_end p += 1 goto strlen_loop :strlen_loop_end @@ -24,9 +23,7 @@ function strlen function putc argument c - local p - p = &c - syscall(1, 1, p, 1) + syscall(1, 1, &c, 1) return function puts @@ -331,11 +331,9 @@ function memchr argument mem argument c local p - local a p = mem :memchr_loop - a = *1p - if a == c goto memchr_loop_end + if *1p == c goto memchr_loop_end p += 1 goto memchr_loop :memchr_loop_end @@ -343,12 +341,10 @@ function memchr function strlen argument s - local c local p p = s :strlen_loop - c = *1p - if c == 0 goto strlen_loop_end + if *1p == 0 goto strlen_loop_end p += 1 goto strlen_loop :strlen_loop_end @@ -414,9 +410,7 @@ function fputn function fputc argument fd argument c - local p - p = &c - syscall(1, fd, p, 1) + syscall(1, fd, &c, 1) return function putc @@ -428,10 +422,8 @@ function putc function fgetc argument fd local c - local p c = 0 - p = &c - syscall(0, fd, p, 1) + syscall(0, fd, &c, 1) return c ; read a line from fd as a null-terminated string |