String 字符串反转
好吧,我会继续讨论这个问题,也许这是一个非常复杂的解决方案,但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转“源”字符串,而不使用“目标”字符串(临时变量)。。这是我的尝试String 字符串反转,string,assembly,masm,irvine32,String,Assembly,Masm,Irvine32,好吧,我会继续讨论这个问题,也许这是一个非常复杂的解决方案,但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转“源”字符串,而不使用“目标”字符串(临时变量)。。这是我的尝试 INCLUDE Irvine32.inc .data source BYTE "This is the source string", 0 count DWORD ? .code main PROC mov ecx, LENGTHOF source L1: mov count, ecx
INCLUDE Irvine32.inc
.data
source BYTE "This is the source string", 0
count DWORD ?
.code
main PROC
mov ecx, LENGTHOF source
L1:
mov count, ecx ; save our outer loop count
mov al,[source+0] ; get the first character in the string
mov ecx,LENGTHOF source ; set out inner loop count
mov esi, OFFSET source
inc esi
L2:
mov bl,[esi]
dec esi
mov [esi],bl
add esi, 2
loop L2
mov ecx, count
loop L1
mov edx,OFFSET source
call WriteString
exit
main ENDP
END main
现在。。这方面的“算法”基本上是这样的:从字符串中取出第一个字符,将所有其他字符在字符数组中下移一个空格,将第一个取出的字符放在数组的后面。现在,我要说的是,这太复杂了。事实上,我该如何到达阵列的后部。。我想我需要另一个循环?我当然不需要三个循环,甚至不想处理这个问题
也许我在正确的轨道上,甚至不知道这一点。任何建议、提示、代码或其他算法都会有所帮助 您可以通过两个循环按自己的方式完成。在执行第一个循环后,您必须再次执行,但长度减少1,以便将当前第一个(最初第二个)字符放在第二个最后位置,而不使用当前最后一个(最初第一个)字符。然后继续,直到长度降到零
但是这是非常低效的,因为你有嵌套的循环,O(n2)。这里有一个更好的算法,它只使用一个循环O(n):
它基本上维护一个开始和结束指针,该指针最初交换第一个和最后一个字符,然后指针相互移动
第二次循环时,交换第二个和第二个最后一个字符,第三次交换第三个和第三个最后一个字符,依此类推
当指针相等(对于奇数长度字符串)或开始指针大于结束指针(对于偶数长度字符串)时,此过程停止
因为这可能是一个家庭作业(而且您似乎已经熟悉x86),所以您应该执行将其转换为汇编程序的练习
如果结果不是家庭作业,您可以使用下面的masm32代码作为基线。请不要试图把这当作你自己的教育工作,因为你几乎肯定会被抓住。如果您自己解决转换问题,您将学到更多(作为家庭作业或非家庭作业),如果您在完成转换时遇到困难,我将提供一些回退代码
.586
.model flat
.data
source byte "This is the source string", 0
.code
_main proc
mov esi, offset source ; load up start pointer.
mov edi, offset source ; set end pointer by finding zero byte.
dec edi
find_end:
inc edi ; advance end pointer.
mov al, [edi] ; look for end of string.
cmp al, 0
jnz find_end ; no, keep looking.
dec edi ; yes, adjust to last character.
swap_loop:
cmp esi, edi ; if start >= end, then we are finished.
jge finished
mov bl, [esi] ; swap over start and end characters.
mov al, [edi]
mov [esi], al
mov [edi], bl
inc esi ; move pointers toward each other and continue.
dec edi
jmp swap_loop
finished:
int 3 ; trap to enter debugger and check string.
; replace with whatever you need.
_main endp
end _main
.586
.model flat
.data
source byte "This is the source string", 0
.code
_main proc
mov esi, offset source ; load up start pointer.
mov edi, offset source ; set end pointer by finding zero byte.
dec edi
find_end:
inc edi ; advance end pointer.
mov al, [edi] ; look for end of string.
cmp al, 0
jnz find_end ; no, keep looking.
dec edi ; yes, adjust to last character.
swap_loop:
cmp esi, edi ; if start >= end, then we are finished.
jge finished
mov bl, [esi] ; swap over start and end characters.
mov al, [edi]
mov [esi], al
mov [edi], bl
inc esi ; move pointers toward each other and continue.
dec edi
jmp swap_loop
finished:
int 3 ; trap to enter debugger and check string.
; replace with whatever you need.
_main endp
end _main