/** * Print a string to stdout. */ .data space: .ascii " " nl: .ascii "\n" .text .global _start /** * Compute length of given string. * @param ESI String to compute length for. * @return Length of the string in EAX */ strlen: pushl %ebx pushl %esi xor %eax, %eax loop_strlen: movb (%esi), %bl cmp $0, %bl je end_strlen inc %eax inc %esi jmp loop_strlen end_strlen: popl %esi popl %ebx ret _start: /* Clear registers. */ xor %eax, %eax xor %ebx, %ebx /* Fetch argc, argv. */ popl %edi dec %edi popl %esi loop_argv: /* while (i < argc) */ cmp $0x0, %edi jle term dec %edi /* char *str = argv[i] */ popl %esi xor %ebx, %ebx /* int len = strlen(str) */ call strlen /* write (stdout, str, len) */ movl %eax, %edx movl %esi, %ecx movl $1, %ebx movl $4, %eax int $0x80 /* write (stdout, space, 1) */ movl $1, %edx movl $space, %ecx movl $1, %ebx movl $4, %eax int $0x80 /* Next argument. */ jmp loop_argv term: /* write (stdout, "\n", 1) */ movl $1, %edx movl $nl, %ecx movl $1, %ebx movl $4, %eax int $0x80 /* exit(0) */ movl $1, %eax xor %ebx, %ebx int $0x80