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 | strlen | ||||||
| subroutines | subroutines | ||||||
| includes | 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
 | argv: argv.o  ## Build Lesson 7 and 8: Line feeds and command line arguments
 | ||||||
| 	$(LD) -m $(LINK_32) -o $@ $< | 	$(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)
 | help: run-help   ## Print this helpful message (default)
 | ||||||
| 
 | 
 | ||||||
| clean: | 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
 | argv: argv.o  ## Build Lesson 7 and 8: Line feeds and command line arguments
 | ||||||
| 	$(LD) -m $(LINK_64) -o $@ $< | 	$(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)
 | help: run-help   ## Print this helpful message (default)
 | ||||||
| 
 | 
 | ||||||
| clean: | 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