section .data
text db 'Hello world, this is a sample text', 0
space db ' '
newline db 10
section .text
global _start
_start:
; Set up counters
xor ecx, ecx ; ecx will store the word count
xor edx, edx ; edx will be the index for text traversal
count_words:
mov al, byte [text + edx] ; load a byte from text into al
cmp al, 0 ; check if end of text
je print_count ; if end of text, print word count
cmp al, byte [space] ; check if space
jne continue_count ; if not space, continue counting
inc ecx ; increase word count
continue_count:
inc edx ; increment text index
jmp count_words
print_count:
; Convert word count to ASCII digits
xor ebx, ebx ; ebx will store the divisor
mov eax, ecx ; move word count to eax
mov ebx, 10 ; set ebx to 10 for division
xor edx, edx ; clear edx for division
div ebx ; divide eax by ebx, quotient in eax, remainder in edx
add edx, '0' ; convert remainder to ASCII digit
; Print word count digit
mov eax, 4 ; system call number for write
mov ebx, 1 ; file descriptor for stdout
mov ecx, edx ; value to print
mov edx, 1 ; number of bytes to write
int 0x80 ; make the system call
; Print newline character
mov eax, 4 ; system call number for write
mov ebx, 1 ; file descriptor for stdout
mov ecx, newline ; newline character to print
mov edx, 1 ; number of bytes to write
int 0x80 ; make the system call
; Exit program
mov eax, 1 ; system call number for exit
xor ebx, ebx ; exit status 0
int 0x80 ; make the system call
c2VjdGlvbiAuZGF0YQogICAgdGV4dCBkYiAnSGVsbG8gd29ybGQsIHRoaXMgaXMgYSBzYW1wbGUgdGV4dCcsIDAKICAgIHNwYWNlIGRiICcgJwogICAgbmV3bGluZSBkYiAxMAoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyBTZXQgdXAgY291bnRlcnMKICAgIHhvciBlY3gsIGVjeCAgOyBlY3ggd2lsbCBzdG9yZSB0aGUgd29yZCBjb3VudAogICAgeG9yIGVkeCwgZWR4ICA7IGVkeCB3aWxsIGJlIHRoZSBpbmRleCBmb3IgdGV4dCB0cmF2ZXJzYWwKCmNvdW50X3dvcmRzOgogICAgbW92IGFsLCBieXRlIFt0ZXh0ICsgZWR4XSAgOyBsb2FkIGEgYnl0ZSBmcm9tIHRleHQgaW50byBhbAogICAgY21wIGFsLCAwICA7IGNoZWNrIGlmIGVuZCBvZiB0ZXh0CiAgICBqZSBwcmludF9jb3VudCAgOyBpZiBlbmQgb2YgdGV4dCwgcHJpbnQgd29yZCBjb3VudAoKICAgIGNtcCBhbCwgYnl0ZSBbc3BhY2VdICA7IGNoZWNrIGlmIHNwYWNlCiAgICBqbmUgY29udGludWVfY291bnQgIDsgaWYgbm90IHNwYWNlLCBjb250aW51ZSBjb3VudGluZwoKICAgIGluYyBlY3ggIDsgaW5jcmVhc2Ugd29yZCBjb3VudAoKY29udGludWVfY291bnQ6CiAgICBpbmMgZWR4ICA7IGluY3JlbWVudCB0ZXh0IGluZGV4CiAgICBqbXAgY291bnRfd29yZHMKCnByaW50X2NvdW50OgogICAgOyBDb252ZXJ0IHdvcmQgY291bnQgdG8gQVNDSUkgZGlnaXRzCiAgICB4b3IgZWJ4LCBlYnggIDsgZWJ4IHdpbGwgc3RvcmUgdGhlIGRpdmlzb3IKICAgIG1vdiBlYXgsIGVjeCAgOyBtb3ZlIHdvcmQgY291bnQgdG8gZWF4CiAgICBtb3YgZWJ4LCAxMCAgOyBzZXQgZWJ4IHRvIDEwIGZvciBkaXZpc2lvbgogICAgeG9yIGVkeCwgZWR4ICA7IGNsZWFyIGVkeCBmb3IgZGl2aXNpb24KICAgIGRpdiBlYnggIDsgZGl2aWRlIGVheCBieSBlYngsIHF1b3RpZW50IGluIGVheCwgcmVtYWluZGVyIGluIGVkeAogICAgYWRkIGVkeCwgJzAnICA7IGNvbnZlcnQgcmVtYWluZGVyIHRvIEFTQ0lJIGRpZ2l0CgogICAgOyBQcmludCB3b3JkIGNvdW50IGRpZ2l0CiAgICBtb3YgZWF4LCA0ICA7IHN5c3RlbSBjYWxsIG51bWJlciBmb3Igd3JpdGUKICAgIG1vdiBlYngsIDEgIDsgZmlsZSBkZXNjcmlwdG9yIGZvciBzdGRvdXQKICAgIG1vdiBlY3gsIGVkeCAgOyB2YWx1ZSB0byBwcmludAogICAgbW92IGVkeCwgMSAgOyBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAgIGludCAweDgwICA7IG1ha2UgdGhlIHN5c3RlbSBjYWxsCgogICAgOyBQcmludCBuZXdsaW5lIGNoYXJhY3RlcgogICAgbW92IGVheCwgNCAgOyBzeXN0ZW0gY2FsbCBudW1iZXIgZm9yIHdyaXRlCiAgICBtb3YgZWJ4LCAxICA7IGZpbGUgZGVzY3JpcHRvciBmb3Igc3Rkb3V0CiAgICBtb3YgZWN4LCBuZXdsaW5lICA7IG5ld2xpbmUgY2hhcmFjdGVyIHRvIHByaW50CiAgICBtb3YgZWR4LCAxICA7IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQogICAgaW50IDB4ODAgIDsgbWFrZSB0aGUgc3lzdGVtIGNhbGwKCiAgICA7IEV4aXQgcHJvZ3JhbQogICAgbW92IGVheCwgMSAgOyBzeXN0ZW0gY2FsbCBudW1iZXIgZm9yIGV4aXQKICAgIHhvciBlYngsIGVieCAgOyBleGl0IHN0YXR1cyAwCiAgICBpbnQgMHg4MCAgOyBtYWtlIHRoZSBzeXN0ZW0gY2FsbAo=