如何在 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)
出于同样的原因,再加上立即数只能作为比较的第一个操作数这一事实。
下面的代码是一个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)
出于同样的原因,再加上立即数只能作为比较的第一个操作数这一事实。