我正在实现一个汇编函数来反转一个字符串。这个函数是在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_stringmain.c
void strrev(char *str) ;
int main() {
char *str1;
str1 = strdup("Hello World") ;
strrev(str1) ;
printf("str1 = \"%s\"\n", str1) ;
}发布于 2013-04-15 21:50:10
这
cmp byte [edi], 0
je reverse_string将会导致这种情况
mov bl, [edi]
mov [esi], bl在字符串的开头写入0。
您需要从字符串终止符后退一步。
发布于 2013-04-15 21:49:03
我不是特别精通汇编语言,但对我来说
cmp byte [edi], 0
je reverse_string看起来您在反转中包含了0-结束符,这样您反转的“字符串”都以0字节开始。
发布于 2013-04-15 21:49:30
似乎你在反转中包含了'\0',也就是你把它移到了前面。
我对x86程序集不是很感兴趣,但是当你进入reverse_string时,edi似乎指向了终止符,因此包含在第一个交换中。
https://stackoverflow.com/questions/16016829
复制相似问题