These strings are most commonly used in C programs, but are also used in assembly language programs by using the .asciz declaration. With a zero-terminated string,
the obvious thing to search for is the location of the zero, and count how many characters were processed looking for the zero. The strsize.s program demonstrates this:
.section .data
string1:
.asciz “Testing, one, two, three, testing.\n”
.section .text
.globl _start
_start:
nop
leal string1, %edi
movl $0xffff, %ecx
movb $0, %al
cld
repne scasb
jne notfound
subw $0xffff, %cx
neg %cx
dec %cx
movl $1, %eax
movl %ecx, %ebx
int $0x80
notfound:
movl $1, %eax
movl $0, %ebx
int $0x80
The strsize.s program loads the memory location of the string to test into the EDI register and loads a
fictitious string length into the ECX register.
The 0xffff string length value indicates that this utility will only work on strings up to 65,535 bytes in length.
The ECX register will keep track of how many iterations
it takes to find the terminating zero in the string. If the zero is found by the SCASB instruction, the position must be calculated from the value of the ECX register. Subtracting it from the original value and changing the sign of the result does this. Because the length includes the terminating zero, the final value must be decreased by one to show the actual string size.