global _start
section .data
sys_read equ 3
sys_write equ 4
stdin equ 0
stdout equ 1
bytesRead dd 0
termios: times 36 db 0
ICANON: equ 1<<1
ECHO: equ 1<<3
section .bss
line resb 11
index resb 4
section .text
_start:
push ebp
mov ebp, esp
call canonical_off
call echo_off
call _readLine
call _printLine
call canonical_on
call echo_on
mov esp, ebp
pop ebp
jmp exit
_readLine:
; Reads into line until new line (0xA)
; Number of bytes read will be stored in bytesRead when _readLine returns
mov eax, sys_read ; syscall to read
mov ebx, stdin ; stdin
mov edx, [index] ; put index into edx
mov ecx, dword line ; put line addr in ecx
add ecx, edx ; add index to addr in ecx
mov edx, 1 ; read one char
int 0x80 ; call kernel to read char
mov ecx, [index] ; put index into ecx
cmp dword [line + ecx], 0xA ; compare value at line + ecx to new line char
inc byte [index] ; increment index
jne _readLine ; if last char is not new line, loop
ret
_printLine:
mov eax, sys_write
mov ebx, stdout
mov ecx, line
mov edx, [index]
int 0x80
ret
_printIndex:
mov eax, sys_write
mov ebx, stdout
add byte [index], '0'
mov ecx, index
mov edx, 4
int 0x80
ret
canonical_off:
call read_stdin_termios
; clear canonical bit in local mode flags
;push rax
mov eax, ICANON
not eax
and [termios+12], eax
;pop rax
call write_stdin_termios
ret
echo_off:
call read_stdin_termios
; clear echo bit in local mode flags
;push rax
mov eax, ECHO
not eax
and [termios+12], eax
;pop rax
call write_stdin_termios
ret
canonical_on:
call read_stdin_termios
; set canonical bit in local mode flags
or dword [termios+12], ICANON
call write_stdin_termios
ret
echo_on:
call read_stdin_termios
; set echo bit in local mode flags
or dword [termios+12], ECHO
call write_stdin_termios
ret
read_stdin_termios:
; push rax
; push rbx
; push rcx
;push rdx
mov eax, 36h
mov ebx, stdin
mov ecx, 5401h
mov edx, termios
int 80h
;pop rdx
; pop rcx
;pop rbx
;pop rax
ret
write_stdin_termios:
; push rax
;push rbx
;push rcx
; push rdx
mov eax, 36h
mov ebx, stdin
mov ecx, 5402h
mov edx, termios
int 80h
;pop rdx
;pop rcx
; pop rbx
;pop rax
ret
exit:
mov eax, 01h ; exit()
xor ebx, ebx ; errno
int 80h
Z2xvYmFsIF9zdGFydAoKc2VjdGlvbiAuZGF0YQoJc3lzX3JlYWQgICAgIGVxdSAzCglzeXNfd3JpdGUgICAgZXF1IDQKCXN0ZGluCQkgZXF1IDAKCXN0ZG91dCAgICAgICBlcXUgMQoJYnl0ZXNSZWFkICAgIGRkICAwCgl0ZXJtaW9zOiAgICAgICAgdGltZXMgMzYgZGIgMAoJSUNBTk9OOiAgICAgICAgIGVxdSAxPDwxCglFQ0hPOiAgICAgICAgICAgZXF1IDE8PDMKCnNlY3Rpb24gLmJzcwogICAgbGluZSAgICAgICAgIHJlc2IgMTEKCWluZGV4ICAgICAgICByZXNiIDQKCnNlY3Rpb24gLnRleHQKCl9zdGFydDoKCXB1c2ggZWJwCgltb3YgZWJwLCBlc3AKCQoJY2FsbCBjYW5vbmljYWxfb2ZmCgljYWxsIGVjaG9fb2ZmCgkKCWNhbGwgX3JlYWRMaW5lCgljYWxsIF9wcmludExpbmUJCgkKCWNhbGwgY2Fub25pY2FsX29uCgljYWxsIGVjaG9fb24KCQkKCW1vdiBlc3AsIGVicAoJcG9wIGVicAoJam1wCWV4aXQKCl9yZWFkTGluZToKOyBSZWFkcyBpbnRvIGxpbmUgdW50aWwgbmV3IGxpbmUgKDB4QSkKOyBOdW1iZXIgb2YgYnl0ZXMgcmVhZCB3aWxsIGJlIHN0b3JlZCBpbiBieXRlc1JlYWQgd2hlbiBfcmVhZExpbmUgcmV0dXJucwkKCW1vdiBlYXgsIHN5c19yZWFkICAgICAgICAgICAgIDsgc3lzY2FsbCB0byByZWFkCgltb3YgZWJ4LCBzdGRpbiAgICAgICAgICAgICAgICA7IHN0ZGluCgltb3YgZWR4LCBbaW5kZXhdICAgICAgICAgICAgICA7IHB1dCBpbmRleCBpbnRvIGVkeAoJbW92IGVjeCwgZHdvcmQgbGluZSAJCSAgOyBwdXQgbGluZSBhZGRyIGluIGVjeAoJYWRkIGVjeCwgZWR4CSAgICAgICAgICAgICAgOyBhZGQgaW5kZXggdG8gYWRkciBpbiBlY3gKCW1vdiBlZHgsIDEgICAgICAgICAgICAgICAgICAgIDsgcmVhZCBvbmUgY2hhcgoJaW50IDB4ODAJICAgICAgICAgICAgICAgICAgOyBjYWxsIGtlcm5lbCB0byByZWFkIGNoYXIKCW1vdiBlY3gsIFtpbmRleF0gICAgICAgICAgICAgIDsgcHV0IGluZGV4IGludG8gZWN4CgljbXAgZHdvcmQgW2xpbmUgKyBlY3hdLCAweEEgICA7IGNvbXBhcmUgdmFsdWUgYXQgbGluZSArIGVjeCB0byBuZXcgbGluZSBjaGFyCglpbmMgYnl0ZSBbaW5kZXhdICAgICAgICAgICAgICA7IGluY3JlbWVudCBpbmRleAoJam5lIF9yZWFkTGluZSAgICAgICAgICAgICAgICAgOyBpZiBsYXN0IGNoYXIgaXMgbm90IG5ldyBsaW5lLCBsb29wICAKCXJldAoKX3ByaW50TGluZToKCW1vdiBlYXgsIHN5c193cml0ZQoJbW92IGVieCwgc3Rkb3V0Cgltb3YgZWN4LCBsaW5lCgltb3YgZWR4LCBbaW5kZXhdCglpbnQgMHg4MAoJcmV0CgpfcHJpbnRJbmRleDoKCW1vdiBlYXgsIHN5c193cml0ZQoJbW92IGVieCwgc3Rkb3V0CglhZGQgYnl0ZSBbaW5kZXhdLCAnMCcKCW1vdiBlY3gsIGluZGV4Cgltb3YgZWR4LCA0CglpbnQgMHg4MAoJcmV0CgpjYW5vbmljYWxfb2ZmOgogICAgICAgIGNhbGwgcmVhZF9zdGRpbl90ZXJtaW9zCgogICAgICAgIDsgY2xlYXIgY2Fub25pY2FsIGJpdCBpbiBsb2NhbCBtb2RlIGZsYWdzCiAgICAgICAgO3B1c2ggcmF4CiAgICAgICAgbW92IGVheCwgSUNBTk9OCiAgICAgICAgbm90IGVheAogICAgICAgIGFuZCBbdGVybWlvcysxMl0sIGVheAogICAgICAgIDtwb3AgcmF4CgogICAgICAgIGNhbGwgd3JpdGVfc3RkaW5fdGVybWlvcwogICAgICAgIHJldAoKZWNob19vZmY6CiAgICAgICAgY2FsbCByZWFkX3N0ZGluX3Rlcm1pb3MKCiAgICAgICAgOyBjbGVhciBlY2hvIGJpdCBpbiBsb2NhbCBtb2RlIGZsYWdzCiAgICAgICAgO3B1c2ggcmF4CiAgICAgICAgbW92IGVheCwgRUNITwogICAgICAgIG5vdCBlYXgKICAgICAgICBhbmQgW3Rlcm1pb3MrMTJdLCBlYXgKICAgICAgICA7cG9wIHJheAoKICAgICAgICBjYWxsIHdyaXRlX3N0ZGluX3Rlcm1pb3MKICAgICAgICByZXQKCmNhbm9uaWNhbF9vbjoKICAgICAgICBjYWxsIHJlYWRfc3RkaW5fdGVybWlvcwoKICAgICAgICA7IHNldCBjYW5vbmljYWwgYml0IGluIGxvY2FsIG1vZGUgZmxhZ3MKICAgICAgICBvciBkd29yZCBbdGVybWlvcysxMl0sIElDQU5PTgoKICAgICAgICBjYWxsIHdyaXRlX3N0ZGluX3Rlcm1pb3MKICAgICAgICByZXQKCmVjaG9fb246CiAgICAgICAgY2FsbCByZWFkX3N0ZGluX3Rlcm1pb3MKCiAgICAgICAgOyBzZXQgZWNobyBiaXQgaW4gbG9jYWwgbW9kZSBmbGFncwogICAgICAgIG9yIGR3b3JkIFt0ZXJtaW9zKzEyXSwgRUNITwoKICAgICAgICBjYWxsIHdyaXRlX3N0ZGluX3Rlcm1pb3MKICAgICAgICByZXQKCnJlYWRfc3RkaW5fdGVybWlvczoKICAgICAgIDsgcHVzaCByYXgKICAgICAgIDsgcHVzaCByYngKICAgICAgIDsgcHVzaCByY3gKICAgICAgICA7cHVzaCByZHgKCiAgICAgICAgbW92IGVheCwgMzZoCiAgICAgICAgbW92IGVieCwgc3RkaW4KICAgICAgICBtb3YgZWN4LCA1NDAxaAogICAgICAgIG1vdiBlZHgsIHRlcm1pb3MKICAgICAgICBpbnQgODBoCgogICAgICAgIDtwb3AgcmR4CiAgICAgICA7IHBvcCByY3gKICAgICAgICA7cG9wIHJieAogICAgICAgIDtwb3AgcmF4CiAgICAgICAgcmV0Cgp3cml0ZV9zdGRpbl90ZXJtaW9zOgogICAgICAgOyBwdXNoIHJheAogICAgICAgIDtwdXNoIHJieAogICAgICAgIDtwdXNoIHJjeAogICAgICAgOyBwdXNoIHJkeAoKICAgICAgICBtb3YgZWF4LCAzNmgKICAgICAgICBtb3YgZWJ4LCBzdGRpbgogICAgICAgIG1vdiBlY3gsIDU0MDJoCiAgICAgICAgbW92IGVkeCwgdGVybWlvcwogICAgICAgIGludCA4MGgKCiAgICAgICAgO3BvcCByZHgKICAgICAgICA7cG9wIHJjeAogICAgICAgOyBwb3AgcmJ4CiAgICAgICAgO3BvcCByYXgKICAgICAgICByZXQKCmV4aXQ6Cgltb3YJCWVheCwgMDFoCQk7IGV4aXQoKQoJeG9yCQllYngsIGVieAkJOyBlcnJubwoJaW50CQk4MGg=