繁体   English   中英

反转字符串时出现问题,它不会 output 完全反转的字符串

[英]Problem when reversing a string, it does not output the full reversed string

我一直在尝试反转 x86 64 位汇编代码中的字符串,代码的重点是返回反转字符串的长度,同时还反转字符串

我的代码是:

reverse_string_asm:
        #rdi ->str
        #rsi -> i
        #rdx -> start index
        #r8 -> end index
        #rcx ->temp
        #rax -> count

        test %rdi, %rdi #check if str is null
        jz ret_null
        xor %rsi, %rsi
        xor %r8, %r8
        xor %r9, %r9
count_length:
        mov (%rdi, %rsi, 1), %r9 # str[i] -> r9
        cmp $0, %r9 #check if str[i] != 0
        je pre_while
        inc %rsi # i++
        jmp count_length

pre_while:
        subq $1, %rsi #i - 1
        mov %rsi, %r8 # end index = i - 1
        addq $1, %rsi #restore i
        mov $0, %rdx
        mov $0, %r9
        xor %rcx, %rcx
        jmp while

while:
        cmp %r8, %rdx # start index < end index
        jge done
        mov (%rdi, %rdx, 1), %rcx #temp = str[start index]
        mov (%rdi, %r8, 1), %r9
        mov %r9, (%rdi, %rdx, 1) #str[start index] = str[end index]
        mov %rcx,  (%rdi, %r8, 1)  #str[end index] = temp
        inc %rdx #start++
        dec %r8 #end--
        jmp while

done:
        movq %rsi, %rax #want to return the length of the reversed str which is equal to the length of original, count = i
        ret

ret_null:
        xor %rax, %rax
        ret

我用来测试的代码是:

printf("Testing reverse_string_asm\n");
    char *s = (char *) malloc (100); 
    memset(s, 0, 100); 
    strcpy(s, "Hello World!"); 
    puts(s); 
    unsigned long l = reverse_string_asm(s); 
    printf("Size of rev str: %lu\n", l); 
    puts(s);
    printf("\n");

虽然当我运行我的代码时,我得到了正确的长度输出,但输出的反转字是:!dl

什么时候应该是:!dlroW elloH

我找不到代码在哪里产生了这个问题,或者我在做什么是不正确的。 我是汇编语言的新手,对于解决这个问题的任何帮助,我将不胜感激。 谢谢你。

问题是您一次读取和写入 8 个字节,但您的行为就像一次只有 1 个字节。 例如,给定char *str ,相当于 C 的str[end_index] = temp; mov %cl, (%rdi, %r8, 1) ,但你写mov %rcx, (%rdi, %r8, 1) ,在 C 中将是*(long *)(str + end_index) = temp; . 要修复它,当您移入和移出mov时,请使用 1 字节寄存器而不是 8 字节寄存器。 将所有出现的%rcx替换为%cl并将%r9替换为%r9b应该可以修复您的程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM