checking in all chnages, including todays play with gnu-as
This commit is contained in:
93
gnu-asm/hello1/hello.s
Normal file
93
gnu-asm/hello1/hello.s
Normal file
@@ -0,0 +1,93 @@
|
||||
# hello.s
|
||||
#
|
||||
# Ask for the user's name, then print:
|
||||
# Hello <name>
|
||||
# five times.
|
||||
|
||||
.section .rodata
|
||||
|
||||
prompt:
|
||||
.ascii "What is your name? "
|
||||
prompt_end:
|
||||
|
||||
hello:
|
||||
.ascii "Hello "
|
||||
hello_end:
|
||||
|
||||
newline:
|
||||
.byte 10 # ASCII newline: '\n'
|
||||
|
||||
|
||||
.section .bss
|
||||
|
||||
.align 16
|
||||
name_buf:
|
||||
.skip 64 # Reserve 64 bytes for the name
|
||||
|
||||
|
||||
.section .text
|
||||
|
||||
.global _start
|
||||
|
||||
_start:
|
||||
# write(STDOUT, prompt, prompt_length)
|
||||
mov $1, %rax # syscall 1: write
|
||||
mov $1, %rdi # file descriptor 1: stdout
|
||||
lea prompt(%rip), %rsi # address of prompt
|
||||
mov $(prompt_end - prompt), %rdx
|
||||
syscall
|
||||
|
||||
# read(STDIN, name_buf, 63)
|
||||
xor %rax, %rax # syscall 0: read
|
||||
xor %rdi, %rdi # file descriptor 0: stdin
|
||||
lea name_buf(%rip), %rsi
|
||||
mov $63, %rdx
|
||||
syscall
|
||||
|
||||
# RAX contains the number of bytes read.
|
||||
# Exit if read returned zero or an error.
|
||||
test %rax, %rax
|
||||
jle exit
|
||||
|
||||
# Save the length of the name in R12.
|
||||
mov %rax, %r12
|
||||
|
||||
# Remove the trailing newline entered by the user.
|
||||
lea name_buf(%rip), %rbx
|
||||
cmpb $10, -1(%rbx,%r12)
|
||||
jne repeat_setup
|
||||
dec %r12
|
||||
|
||||
repeat_setup:
|
||||
mov $5, %r13 # Loop counter
|
||||
|
||||
repeat_loop:
|
||||
# Write "Hello "
|
||||
mov $1, %rax
|
||||
mov $1, %rdi
|
||||
lea hello(%rip), %rsi
|
||||
mov $(hello_end - hello), %rdx
|
||||
syscall
|
||||
|
||||
# Write the user's name
|
||||
mov $1, %rax
|
||||
mov $1, %rdi
|
||||
lea name_buf(%rip), %rsi
|
||||
mov %r12, %rdx
|
||||
syscall
|
||||
|
||||
# Write newline
|
||||
mov $1, %rax
|
||||
mov $1, %rdi
|
||||
lea newline(%rip), %rsi
|
||||
mov $1, %rdx
|
||||
syscall
|
||||
|
||||
dec %r13
|
||||
jne repeat_loop
|
||||
|
||||
exit:
|
||||
# exit(0)
|
||||
mov $60, %rax # syscall 60: exit
|
||||
xor %rdi, %rdi # exit status 0
|
||||
syscall
|
||||
Reference in New Issue
Block a user