buffer writes, add to example
This commit is contained in:
@@ -90,6 +90,7 @@ assemble:
|
|||||||
mov [.tokens_total], edi ; edi = total number of tokens in table
|
mov [.tokens_total], edi ; edi = total number of tokens in table
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
|
call .flush_write_buffer
|
||||||
call .get_next_tte
|
call .get_next_tte
|
||||||
; di = tte
|
; di = tte
|
||||||
call get_tte_type
|
call get_tte_type
|
||||||
@@ -129,7 +130,7 @@ assemble:
|
|||||||
call get_opcode
|
call get_opcode
|
||||||
; al = opcode
|
; al = opcode
|
||||||
; dl = 0x00
|
; dl = 0x00
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .loop_next_token
|
||||||
|
|
||||||
@@ -143,7 +144,7 @@ assemble:
|
|||||||
; al = opcode
|
; al = opcode
|
||||||
; dl = op flag
|
; dl = op flag
|
||||||
push rdx
|
push rdx
|
||||||
call .output_byte
|
call .write_byte
|
||||||
pop rdx ; dl = op flag
|
pop rdx ; dl = op flag
|
||||||
|
|
||||||
call .next_token
|
call .next_token
|
||||||
@@ -165,7 +166,7 @@ assemble:
|
|||||||
cmp al, 0x02 ; type: register
|
cmp al, 0x02 ; type: register
|
||||||
je .operator_1_register
|
je .operator_1_register
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .unexpected_token
|
||||||
|
|
||||||
.operator_1_memory:
|
.operator_1_memory:
|
||||||
mov rsi, .msg_operator_1_memory
|
mov rsi, .msg_operator_1_memory
|
||||||
@@ -183,7 +184,7 @@ assemble:
|
|||||||
mov edx, 11b ; dl = mod bits
|
mov edx, 11b ; dl = mod bits
|
||||||
call get_ModRM
|
call get_ModRM
|
||||||
; al = Mod R/M byte
|
; al = Mod R/M byte
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .loop_next_token
|
||||||
|
|
||||||
@@ -212,7 +213,7 @@ assemble:
|
|||||||
cmp al, 0x02 ; type: register
|
cmp al, 0x02 ; type: register
|
||||||
je .operator_2_register
|
je .operator_2_register
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .unexpected_token
|
||||||
|
|
||||||
.operator_2_memory:
|
.operator_2_memory:
|
||||||
mov rsi, .msg_operator_2_memory
|
mov rsi, .msg_operator_2_memory
|
||||||
@@ -226,7 +227,7 @@ assemble:
|
|||||||
call get_opcode
|
call get_opcode
|
||||||
; al = opcode
|
; al = opcode
|
||||||
; dl = op flag
|
; dl = op flag
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
call .next_token
|
call .next_token
|
||||||
jge .break
|
jge .break
|
||||||
@@ -264,7 +265,7 @@ assemble:
|
|||||||
mov dl, 00b ; dl = mod bits
|
mov dl, 00b ; dl = mod bits
|
||||||
call get_ModRM
|
call get_ModRM
|
||||||
; al = Mod R/M byte
|
; al = Mod R/M byte
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .loop_next_token
|
||||||
|
|
||||||
@@ -279,7 +280,7 @@ assemble:
|
|||||||
; al = opcode
|
; al = opcode
|
||||||
; dl = op flag
|
; dl = op flag
|
||||||
; TODO do something if the op flag is present
|
; TODO do something if the op flag is present
|
||||||
call .output_byte
|
call .write_byte
|
||||||
pop rdi ; di = dst tte
|
pop rdi ; di = dst tte
|
||||||
|
|
||||||
mov si, di ; si = dst tte
|
mov si, di ; si = dst tte
|
||||||
@@ -324,7 +325,7 @@ assemble:
|
|||||||
mov edx, 00b ; dl = mod bits
|
mov edx, 00b ; dl = mod bits
|
||||||
call get_ModRM
|
call get_ModRM
|
||||||
; al = Mod R/M byte
|
; al = Mod R/M byte
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .loop_next_token
|
||||||
|
|
||||||
@@ -338,7 +339,7 @@ assemble:
|
|||||||
mov edx, 11b ; dl = mod bits
|
mov edx, 11b ; dl = mod bits
|
||||||
call get_ModRM
|
call get_ModRM
|
||||||
; al = Mod R/M byte
|
; al = Mod R/M byte
|
||||||
call .output_byte
|
call .write_byte
|
||||||
|
|
||||||
jmp .loop_next_token
|
jmp .loop_next_token
|
||||||
|
|
||||||
@@ -348,6 +349,7 @@ assemble:
|
|||||||
jmp .loop
|
jmp .loop
|
||||||
|
|
||||||
.break:
|
.break:
|
||||||
|
call .flush_write_buffer
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.unexpected_token:
|
.unexpected_token:
|
||||||
@@ -391,6 +393,59 @@ assemble:
|
|||||||
.next_output_byte dd OUTPUT_ADDR ; next empty byte in output
|
.next_output_byte dd OUTPUT_ADDR ; next empty byte in output
|
||||||
; TODO get rid of this sketchy bit of state
|
; TODO get rid of this sketchy bit of state
|
||||||
|
|
||||||
|
; al = byte to push
|
||||||
|
.push_byte:
|
||||||
|
push rcx
|
||||||
|
mov ecx, [.buffer_pointer]
|
||||||
|
push rcx
|
||||||
|
push rax
|
||||||
|
mov ecx, .buffer_end
|
||||||
|
mov [.buffer_pointer], ecx
|
||||||
|
.push_byte_loop:
|
||||||
|
dec ecx
|
||||||
|
cmp ecx, .buffer
|
||||||
|
jl .push_byte_break
|
||||||
|
mov al, [ecx]
|
||||||
|
mov [ecx + 1], al
|
||||||
|
jmp .push_byte_loop
|
||||||
|
.push_byte_break:
|
||||||
|
pop rax ; al = byte to push
|
||||||
|
mov [.buffer], al
|
||||||
|
pop rcx ; ecx = old buffer pointer
|
||||||
|
inc ecx
|
||||||
|
mov [.buffer_pointer], ecx
|
||||||
|
pop rcx
|
||||||
|
ret
|
||||||
|
|
||||||
|
; al = byte to write
|
||||||
|
.write_byte:
|
||||||
|
mov edx, [.buffer_pointer]
|
||||||
|
mov [edx], al
|
||||||
|
inc edx
|
||||||
|
mov [.buffer_pointer], edx
|
||||||
|
ret
|
||||||
|
|
||||||
|
.flush_write_buffer:
|
||||||
|
push rcx
|
||||||
|
push rax
|
||||||
|
mov ecx, [.buffer_pointer]
|
||||||
|
.flush_write_buffer_loop:
|
||||||
|
dec ecx
|
||||||
|
cmp ecx, .buffer
|
||||||
|
jl .flush_write_buffer_break
|
||||||
|
mov al, [ecx]
|
||||||
|
call .output_byte
|
||||||
|
mov byte [ecx], 0x00
|
||||||
|
jmp .flush_write_buffer_loop
|
||||||
|
.flush_write_buffer_break
|
||||||
|
mov dword [.buffer_pointer], .buffer
|
||||||
|
pop rax
|
||||||
|
pop rcx
|
||||||
|
ret
|
||||||
|
.buffer dq 0, 0 ; octo word of space for max of 8 bytes per write
|
||||||
|
.buffer_end:
|
||||||
|
.buffer_pointer dd .buffer ; points to current byte in buffer
|
||||||
|
|
||||||
.msg_unexpected_token db "unexpected token, aborting", 0x0A, 0x00
|
.msg_unexpected_token db "unexpected token, aborting", 0x0A, 0x00
|
||||||
.msg_unsupported_memory_access db "unsupported memory access, aborting", 0x0A, 0x00
|
.msg_unsupported_memory_access db "unsupported memory access, aborting", 0x0A, 0x00
|
||||||
.msg_operator_0 db "operator_0", 0x0A, 0x00
|
.msg_operator_0 db "operator_0", 0x0A, 0x00
|
||||||
@@ -1991,6 +2046,8 @@ program:
|
|||||||
db "; one line comment", 0x0A
|
db "; one line comment", 0x0A
|
||||||
db "mov rdx, [rax]", 0x0A
|
db "mov rdx, [rax]", 0x0A
|
||||||
db "mov [rax], rdx", 0x0A
|
db "mov [rax], rdx", 0x0A
|
||||||
|
db "mov [rcx], rbx", 0x0A
|
||||||
|
db "mov rcx, [rbx]", 0x0A
|
||||||
db "hlt", 0x0A
|
db "hlt", 0x0A
|
||||||
.size dq $ - program
|
.size dq $ - program
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user