我正在实现一个汇编函数来反转一个字符串。这个函数在C中被调用,带有签名void strrev(char *str) ;
一切似乎在函数内正常工作,使用gdb进行调试,但是在调用strrev()
之后打印字符串的内容只打印空字符串。
getlast:
cmp byte [edi], 0
je reverse_string
inc edi
inc ecx
jmp getlast
reverse_string:
cmp esi, edi
jae reversed
mov al, [esi]
mov bl, [edi]
mov [esi], bl
mov [edi], al
inc esi
dec edi
jmp reverse_string
的main.c
void strrev(char *str) ;
int main() {
char *str1;
str1 = strdup("Hello World") ;
strrev(str1) ;
printf("str1 = \"%s\"\n", str1) ;
}
答案 0 :(得分:1)
我不是特别流利的汇编语言,但对我来说
cmp byte [edi], 0
je reverse_string
看起来你在反转中包含了0-terminator,所以你的反向“字符串”都以0字节开头。
答案 1 :(得分:1)
似乎你在反转中包含'\0'
,即你把它移到前面。
我对x86程序集不是那么热,但是当你输入edi
时,它似乎reverse_string
指向终结符,因此包含在第一个交换中。
答案 2 :(得分:1)
此
cmp byte [edi], 0
je reverse_string
会导致此
mov bl, [edi]
mov [esi], bl
在字符串的开头写0。
您需要从字符串终结符退一步。