如何在 x86 程序集中找到字符串的结尾?

How do I find the end of a string in x86 assembly?

下面的代码是一个i86汇编函数,将在c中调用,count(char *string, char c)。我将字符串存储在 %esi 中,字符存储在 %ecx 中,我不确定如何告诉程序在字符串结束时停止循环(当字节为 0 时),因为 cmpl 函数不允许我这样做这样做(操作数类型不匹配)。我不确定我是否正确存储了字符串或正确地遍历了字符串。任何帮助将不胜感激



.globl count
.text
#first argument is string, second is char
count:  
    push %ebp       #push old ebp to top of stack
    movl %esp, %ebp     #point ebp to same thing as esp, both pointing to old ebp

    #saving live registers
    push %esi
    push %edi
    push %ebx   

    #take values from stack
    movl [=10=], %eax       #set count(eax) to 0
    movl 12(%ebp), %ecx     #move letter to be counted to ecx
    movl 8(%ebp), %esi  #move string to esi

lettercheck:
    cmpl %esi, %ecx #compare current letter to ecx(letter to be counted)
    incl %esi       #next letter
    je inccount     #if match inccount 
    cmpl %esi, [=10=]       #if no match and end of string
    je end
    jmp lettercheck     #if not end of string and no match  

inccount:
    incl eax            #inc count of char
    cmpl %esi, [=10=]       #check for end of string
    jne lettercheck     #if match and not EOS lettercheck
    jmp end         #else jmp end
end:
    pop %ebx
    pop %edi
    pop %esi
    movl %ebp, %esp
    pop %ebp
    ret

%esi 持有一个指针,所以你要比较它指向的字节和 %ecx 的底部字节,而不是比较指针。所以你的比较指令应该是

cmpb (%esi), %cl

b表示字节而不是长字,括号表示寄存器指向的内存中的值,而不是寄存器。要检查字符串的结尾,您需要

cmpb [=11=], (%esi)

出于同样的原因,再加上立即数只能作为比较的第一个操作数这一事实。