Last active
October 29, 2017 04:15
-
-
Save dstein64/41a533756457f1c34572c4c1bece38be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** echo.s ***/ | |
// Description | |
// echo - print arguments to stdout | |
// Synopsis | |
// echo [STRING]... | |
// Build | |
// $ as --32 -o echo.o echo.s | |
// $ ld -m elf_i386 -o echo echo.o | |
# ************************************ | |
# * print macro and strlen function | |
# * are omitted. | |
# ************************************ | |
.section .rodata | |
newline_char: | |
.ascii "\n" | |
space_char: | |
.ascii " " | |
.section .text | |
# ************************************ | |
# * echo [STRING]... | |
# * Prints the string(s) to stdout. | |
# ************************************ | |
.globl _start | |
_start: | |
movl %esp, %ebp | |
# Local variables (offset from %ebp) | |
.equ index, -4 # Stack index being operated on | |
.equ address, -8 # Current arg address | |
.equ length, -12 # Current arg length | |
subl $12, %esp | |
# Start at index 1 (this skips argc) | |
movl $1, index(%ebp) | |
echo_loop: | |
# Set address local variable | |
movl index(%ebp), %ecx | |
movl 4(%ebp, %ecx, 4), %eax | |
movl %eax, address(%ebp) | |
# Check if we're done (reached a NULL pointer) | |
cmpl $0, address(%ebp) | |
je echo_loop_end | |
# Calculate length of string | |
pushl address(%ebp) | |
call strlen | |
addl $4, %esp | |
# Set length local variable | |
movl %eax, length(%ebp) | |
# Print leading space if index > 1 | |
cmpl $1, index(%ebp) | |
jle leading_space_end | |
movl $space_char, %ecx | |
movl $1, %edx | |
leading_space_end: | |
# Print current argument | |
movl address(%ebp), %ecx | |
movl length(%ebp), %edx | |
incl index(%ebp) | |
jmp echo_loop | |
echo_loop_end: | |
# Print newline char | |
movl $newline_char, %ecx | |
movl $1, %edx | |
# Exit | |
movl $1, %eax | |
movl $0, %ebx | |
int $0x80 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment