; How string comparison works ; DI => scasb compares value stored in DI which is 's' with 's' stored in AX register ; and then increments DI if DF is 0 ; v ; memory address 1: |s|n|a|t|0| ; memory address 2: |s|n|a|k|e|0| ; ^ ; SI => lodsb loads value stored at SI to AX and then increments SI if DF is 0 os_compare_strings: cld .compare: lodsb scasb ; Compare di to si jne .unequal ; If they are not equal, jump to .unequal cmp al, 0 ; Check if string is finished je .equal ; If it has, return true jmp .compare ; Finally, repeat .unequal: mov cl, 0 ; Change to 0 if unquality is proven ret .equal: mov cl, 1 ret ; Get the length of a string ; 'hello world', 0 is 11 characters long (excluding the terminator) ; input: si points to the string to be counted ; output: cl holds the length os_string_length: push si xor cl,cl ; Clear the al register .loop lodsb cmp al, 0 je .finish inc cl jmp .loop .finish pop si ret ; convert a string to fat's filename format ; It will be capitalised and 11 characters long, ; 8 for the filename, 3 for the extension ; eg: 'file.txt' -> 'FILE TXT' ; input: si points to filename, di points to a free 11 bytes in memory ; output: di points to the fat formatted filename os_format_fat_filename: pusha call os_upper_case call os_string_length ; Stores the length of the string in cl mov bl, 11 sub bl, cl ; 11 - string_length .character_loop: lodsb cmp al, 0 je .finish cmp al, 2Eh ; 2Eh je .add_spaces ; This will end up back at .character_loop stosb jmp .character_loop .add_spaces: ; Add the number of spaces as bl holds mov al, ' ' ; 20h = space .spaces_loop: stosb cmp bl, 0 je .character_loop dec bl jmp .spaces_loop .finish: popa ret ; Convert a string to all upper/lower case ; INPUT: si pointing to a string ; OUPUT: the same string in memory will now be capitalised/decapitalised os_upper_case: pusha mov di, si .loop: lodsb ; Load the character into al inc di cmp al, 0 je .finish ; If it's null then the string is finished cmp al, 7Ah ; 7Ah = 'z' jns .loop ; Ignore if it's more than 'z' cmp al, 61h ; 61h = 'a' js .loop ; Ignore if it's less than 'a' sub al, 20h ; Otherwise subtract 20h to capitalise it dec di stosb ; Store the new value jmp .loop ; Next character .finish: popa ret os_lower_case: pusha mov di, si .loop: lodsb ; Load the character into al inc di cmp al, 0 je .finish ; If it's null then the string is finished cmp al, 5Ah ; 5Ah = 'Z' jns .loop ; Ignore if it's more than 'Z' cmp al, 41h ; 41h = 'A' js .loop ; Ignore if it's less than 'A' add al, 20h ; Otherwise subtract 20h to capitalise it dec di stosb ; Store the new value jmp .loop ; Next character .finish: popa ret