首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用引用参数从c调用程序集函数

使用引用参数从c调用程序集函数
EN

Stack Overflow用户
提问于 2013-04-15 21:45:54
回答 3查看 148关注 0票数 0

我正在实现一个汇编函数来反转一个字符串。这个函数是在C中用签名void strrev(char *str) ;调用的,用gdb调试,在函数中一切似乎都运行得很好,但是在调用strrev()之后打印字符串的内容只是打印空字符串。

代码语言:javascript
复制
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

代码语言:javascript
复制
void strrev(char *str) ;

int main() {
   char *str1;

   str1 = strdup("Hello World") ;
   strrev(str1) ;
   printf("str1 = \"%s\"\n", str1) ;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-15 21:50:10

代码语言:javascript
复制
    cmp     byte [edi], 0
    je      reverse_string

将会导致这种情况

代码语言:javascript
复制
    mov     bl, [edi]
    mov     [esi], bl

在字符串的开头写入0。

您需要从字符串终止符后退一步。

票数 1
EN

Stack Overflow用户

发布于 2013-04-15 21:49:03

我不是特别精通汇编语言,但对我来说

代码语言:javascript
复制
    cmp     byte [edi], 0
    je      reverse_string

看起来您在反转中包含了0-结束符,这样您反转的“字符串”都以0字节开始。

票数 1
EN

Stack Overflow用户

发布于 2013-04-15 21:49:30

似乎你在反转中包含了'\0',也就是你把它移到了前面。

我对x86程序集不是很感兴趣,但是当你进入reverse_string时,edi似乎指向了终止符,因此包含在第一个交换中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16016829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档