And Lesson 9: Stdin, goes into the X86_64 update pile.
This commit is contained in:
parent
3ebb8fa0af
commit
a8b5a39290
|
@ -6,3 +6,4 @@ hello
|
|||
strlen
|
||||
subroutines
|
||||
includes
|
||||
stdin
|
||||
|
|
|
@ -37,6 +37,9 @@ includes: includes.o ## Build Lesson 5: Separate strlen() and puts() into their
|
|||
argv: argv.o ## Build Lesson 7 and 8: Line feeds and command line arguments
|
||||
$(LD) -m $(LINK_32) -o $@ $<
|
||||
|
||||
stdin: stdin.o ## Build Lesson 9: Reading from stdin
|
||||
$(LD) -m $(LINK_32) -o $@ $<
|
||||
|
||||
help: run-help ## Print this helpful message (default)
|
||||
|
||||
clean:
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
;; Lesson 9: User Input via STDIN.
|
||||
|
||||
%include "functions.asm"
|
||||
%define ILEN 255 ; Amount of space to reserve
|
||||
|
||||
;; sys/unistd_32.h
|
||||
%define SYS_read 3
|
||||
|
||||
;; unistd.h
|
||||
%define STDIN 0
|
||||
|
||||
|
||||
section .data
|
||||
msg1 db "Please enter your name: ", 0h
|
||||
msg2 db "Hello, ", 0h
|
||||
|
||||
section .bss
|
||||
sinput resb ILEN ; Reserve 255 bytes of space. The space has no guarantees that I know of.
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
mov eax, msg1
|
||||
call putslf
|
||||
|
||||
mov edx, ILEN
|
||||
mov ecx, sinput
|
||||
mov ebx, STDIN
|
||||
mov eax, SYS_read
|
||||
int 80h
|
||||
|
||||
mov eax, msg2
|
||||
call puts
|
||||
|
||||
mov eax, sinput
|
||||
call puts ; By default, sinput keeps the LF terminator!
|
||||
|
||||
call exit_program
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -37,6 +37,9 @@ includes: includes.o ## Build Lesson 5: Separate strlen() and puts() into their
|
|||
argv: argv.o ## Build Lesson 7 and 8: Line feeds and command line arguments
|
||||
$(LD) -m $(LINK_64) -o $@ $<
|
||||
|
||||
stdin: stdin.o ## Build Lesson 9: Reading from stdin
|
||||
$(LD) -m $(LINK_64) -o $@ $<
|
||||
|
||||
help: run-help ## Print this helpful message (default)
|
||||
|
||||
clean:
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
;; Lesson 9: User Input via STDIN.
|
||||
|
||||
%include "functions.asm"
|
||||
%define ILEN 255 ; Amount of space to reserve
|
||||
|
||||
;; sys/unistd_64.h
|
||||
%define SYS_read 0
|
||||
|
||||
;; unistd.h
|
||||
%define STDIN 0
|
||||
|
||||
|
||||
section .data
|
||||
msg1 db "Please enter your name: ", 0h
|
||||
msg2 db "Hello, ", 0h
|
||||
|
||||
section .bss
|
||||
sinput resb ILEN ; Reserve 255 bytes of space. The space has no guarantees that I know of.
|
||||
|
||||
section .text
|
||||
global _start
|
||||
|
||||
_start:
|
||||
;; Again, the challenge with x86_64 is knowing what register to us.
|
||||
;; In this case, RSI - Source Indexing.
|
||||
mov rsi, msg1
|
||||
call puts
|
||||
|
||||
mov rax, SYS_read ; General purpose register
|
||||
mov rdi, STDIN ; Destination Index
|
||||
mov rsi, sinput ; Source register
|
||||
mov rdx, ILEN ; Common counter
|
||||
|
||||
;; And remembering to use 'syscall' instead of interrupt-80
|
||||
syscall
|
||||
|
||||
mov rsi, msg2
|
||||
call puts
|
||||
|
||||
mov rsi, sinput
|
||||
call puts
|
||||
|
||||
call exit_program
|
Loading…
Reference in New Issue