Skip to content

Instantly share code, notes, and snippets.

@dstein64
Last active October 29, 2017 04:15
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save dstein64/6a853776e84fd491475b7a9db6a47a2b to your computer and use it in GitHub Desktop.
/*** printenv.s ***/
// Description
// printenv - print the environment to stdout
// Synopsis
// printenv
// Build
// $ as --32 -o printenv.o printenv.s
// $ ld -m elf_i386 -o printenv printenv.o
# ************************************
# * print macro and strlen function
# * are omitted.
# ************************************
.section .rodata
newline_char:
.ascii "\n"
.section .text
# ************************************
# * printenv
# * Prints the environment 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 env var address
.equ length, -12 # Current env var length
subl $12, %esp
# Start at index argc+1 (this skips the argument vector)
movl $0, index(%ebp)
movl (%ebp), %eax # argc
incl %eax
addl %eax, index(%ebp)
printenv_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 printenv_loop_end
# Calculate length of string
pushl address(%ebp)
call strlen
addl $4, %esp
# Set length local variable
movl %eax, length(%ebp)
# Print current env var
movl address(%ebp), %ecx
movl length(%ebp), %edx
print
# Print newline char
movl $newline_char, %ecx
movl $1, %edx
print
incl index(%ebp)
jmp printenv_loop
printenv_loop_end:
# 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