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
我正在制作一个程序来反转用户给定的字符串。 出现的问题是,如果字符串的长度为 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