FASM x86 架构中的字符串反转

String Reverse in FASM x86 architecture

我正在制作一个程序来反转用户给定的字符串。 出现的问题是,如果字符串的长度为 5 个字节,程序运行良好,但如果字符串较短,那么当我执行它时,结果不会出现。另一个问题是,如果字符串长度超过 5 个字节,它只会反转前五个字节。

请记住,我是汇编新手,这个问题可能很基础,但如果有人告诉我问题出在哪里,我将不胜感激。

谢谢大家,祝你今天愉快:)

P.S 文件“training.inc”是一个实现了“print_str, read_line”方法的文件。

 entry start

 include "win32a.inc"
 MAX_USER_STR = 5h
 section '.data' data readable writeable
    enter_string db "Enter a string : ", 0
    newline db 13,10,0
    user_str db MAX_USER_STR dup(?), 0
    

 section ".text" code readable executable
 start:
        mov esi, enter_string
        call print_str
        mov edi, user_str
        call read_line
        call str_len
        mov edx, MAX_USER_STR
        mov ebx, 0
        mov ecx, 0
        mov esi, user_str
        call print_str
        mov esi, newline
        call print_str
        mov esi, user_str
        for_loop : 
            push eax
            mov al, byte[esi]
            inc esi
            inc ebx
            call print_eax
            cmp edx, ebx
            jb clear_register
            jmp for_loop    
        
        for_loop2 :
            call print_eax  
            mov byte[esi], al
            inc esi
            inc ecx
            pop eax
            cmp ecx, edx
            ja break_loop
            jmp for_loop2
            
        break_loop:
            ;mov edi, 0
            mov esi, user_str
            call print_str
            push 0
            call [ExitProcess]
        
        clear_register : 
            mov esi, user_str
            jmp for_loop2
        
        str_len : 
            push ecx
            sub ecx, ecx
            mov ecx, -1
            sub al, al
            cld
            repne scasb
            neg ecx
            sub ecx, 1
            mov eax, ecx
            pop ecx
            ret
    
  include 'training.inc'
MAX_USER_STR = 5h

名称MAX_已经说了,但是要根据最坏的情况定义缓冲区。如果您希望能够处理超过 5 个字符的字符串,请提高此值。

MAX_USER_STR = 256   ; A decent buffer

... if the string is lower then the result doesn't appear when I execute it. The other problem is that if the string is more than 5 bytes long it reverses only the first five bytes.

那是因为您的代码实际上并未使用字符串的长度,而是使用较小缓冲区的大小。我希望你看到这不应该发生,溢出缓冲区。您的代码没有太多抱怨,因为此缓冲区是数据部分中的最后一项。
如果您这样写,您的循环可以使用真实长度:

call str_len   ; -> EAX
mov  edx, eax

 for_loop : 
      push eax
      mov al, byte[esi]

如果您要推送的是字符,那么我希望 push eax 跟随字符串的负载!
请注意,在字符串反转中,您永远不想将字符串终止符移到字符串的前面。

这是通过堆栈进行的基本字符串反转:

    mov   ecx, edx       ; EDX has StrLen
    mov   esi, user_str
loop1:
    movzx eax, byte [esi]
    inc   esi
    push  eax
    dec   ecx
    jnz   loop1

    mov   esi, user_str
loop2:
    pop   eax
    mov   [esi], al
    inc   esi
    dec   edx
    jnz   loop2