簡體   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