Created
October 29, 2017 04:04
-
-
Save dstein64/a52146a3c6a12c8c0b84cfd4e084bb15 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
/*** 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 | |
.section .text | |
# ************************************ | |
# * print macro | |
# * Caller is responsible for setting | |
# * %ecx and %edx, and saving %eax and | |
# * %ebx if necessary. | |
# ************************************ | |
.macro print | |
movl $4, %eax | |
movl $1, %ebx | |
int $0x80 | |
.endm | |
# ************************************ | |
# * int strlen(char* str); | |
# * Returns the length of a string. | |
# ************************************ | |
.type strlen, @function | |
strlen: | |
pushl %ebp | |
movl %esp, %ebp | |
movl $0, %eax # Index | |
movl 8(%ebp), %ecx # Address of str | |
strlen_loop: | |
movb (%ecx,%eax,1), %dl # Current char | |
cmpb $0, %dl | |
je strlen_end | |
incl %eax | |
jmp strlen_loop | |
strlen_end: | |
movl %ebp, %esp | |
popl %ebp | |
ret | |
.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 newline char | |
movl $newline_char, %ecx | |
movl $1, %edx | |
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