所以我正在编写一个内联汇编函数在c中,反转一个string的内容,并将反转的string放在一个新的字符数组中,但我得到额外的字符添加到我的反转string的结尾。
int main(int argc,char **argv) { char *new_str; char old_str[20] = "Hello,World!"; mystrrev(new_str,old_str,strlen(old_str)); printf("New string: %sn",&new_str); return 0; }
assemblyfunction
char *mystrrev(char *dest,const char *src,int size) { int d0,d1,d2,d3; __asm__ ( "add %%ebx,%%esint" /*Move to end of string*/ "stdnt" /*Decrement esi after load*/ "lodsbnt" /*Load esi into al*/ "sub $1,%%ebxnt" "mov %%al,%%clnt" /*mov contents of al to cl*/ "1:tstdnt" /*Begin loop,decrement esi after load*/ "lodsbnt" /*Load esi into al*/ "cldnt" /*Clear flg*/ "stosbnt" /*Store al in edi*/ "sub $1,%%ebxnt" /*subtract 1 from strlenght counter*/ "cmp $0,%%ebxnt" /*Compare ebx to 0*/ "jne 1bnt" "mov %%ecx,%%edint" /*Add null terminating char to new str*/ : "=&S"(d0),"=&D"(d1),"=&a"(d2),"=&b" (d3) /*output*/ /*** &S --> ESI,&D --> EDI,&a --> eax ***/ : "0" (src),"1" (dest),"3" (size) /*input*/ : "memory"); /*clobber registers*/ return dest; }
在这种情况下,你好,世界! 打印出来[!dlroW,olleH]但是在最后添加了额外的字符,我不明白为什么。 有什么想法吗??
如何从自身内部获取指向程序特定部分的指针? (也许与自我)
可变参数汇编中的有效模式
汇编/链接与nasm和ld的问题
无法理解下面的macros
如何在Windows PE 32位可执行文件中为我的代码洞创造空间
networking的机器代码是什么样的?
ASLR和地址
系统调用如何在x86汇编linux中解释
该
mov %ecx,%edi /*Add null terminating char to new str*/
指令不会写任何内容; 它只是将0复制到寄存器%edi本身。 如果我没有记错,内存写入的正确语法就是这样的
movb %cl,(%edi)
但是在拷贝过程中精确地将零终止符存储在%cl中是毫无意义的,因为无论如何你都知道它将是一个零。 所以就
movb $0,(%edi)
应该也一样。
(另外,但是并不相关,字符串指令实际上比单独加载/存储和递增/递减操作的等效组合要慢。至少在486或早期的奔腾时代,情况就是如此,如果不是这样仍然如此 – 特别是如果你每次都需要操纵方向标志的话)。
((另外,对于你不使用的所有东西来说,声明输出变量似乎是毫无意义的,这是什么意思呢?即使你需要硬编码字符串指令的eax的使用,简单地列出"eax"在clobber列表是非常明确比强迫它成为一个虚拟的输出变量))。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。