我如何find使用NASM的string的长度?

我正在尝试使用从命令行参数获取input的NASM。 由于string长度没有提供,我试图做一个函数来计算我自己的。 这里是我的尝试,它接受一个指向ebx寄存器中的string的指针,并返回ecxstring的长度:

 len: push ebx mov ecx,0 dec ebx count: inc ecx inc ebx cmp ebx,0 jnz count dec ecx push ebx ret 

我的方法是通过string逐个字符,并检查它是否为空。 如果不是,我会增加ecx并转到下一个字符。 我相信问题是与cmp ebx,0是不正确的,我想要做的。 我将如何正确地检查字符是否为空? 另外,还有其他的事情可以做得更好吗?

你正在比较ebx的值与0,这不是你想要的。 ebx的值是内存中某个字符的地址,所以应该像这样取消引用:

 cmp byte[ebx], 0 

另外,最后一个push ebx应该是pop ebx

也许有点晚了,但这是我怎么做64位。

  pop rsi ; number of arguments (argc) pop rsi ; the command itself (or programname as you like) pop rsi ; the pointer to the string mov ecx, 0 ; counter .repeat: lodsb ; byte in AL or al,al ; check if zero jz .done ; if zero then we're done inc ecx ; increment counter jmp .repeat ; repeat until zero .done: ; string is unchanged, ecx contains the length of the string section .data asciiz: db "This is a string with 36 characters.", 0 

在这里,我将如何编码它

 len: push ebx mov eax, ebx lp: cmp byte [eax], 0 jz lpend inc eax jmp lp lpend: sub eax, ebx pop ebx ret 

(结果在eax中)。 可能有更好的方法。