Loops 颠倒颠倒的单词组合

Loops 颠倒颠倒的单词组合,loops,assembly,x86,masm,irvine32,Loops,Assembly,X86,Masm,Irvine32,我在组装作业上遇到了麻烦。该程序的目标是将每个字母反转,因此CIS 335/535是一个伟大的过程到esruoc taerg a si 535/533 SIC,我的程序会这样做,但它也应该将其转换为过程,伟大的a是335/535 CIS,我的程序不会这样做,因此我对最终输出进行注释。我的代码在最后一个块中输出了类似于cis 335/535的内容,这是一个很好的过程 TITLE MASM Assignment 3 reverse a string word by word

我在组装作业上遇到了麻烦。该程序的目标是将每个字母反转,因此
CIS 335/535是一个伟大的过程
esruoc taerg a si 535/533 SIC
,我的程序会这样做,但它也应该将其转换为
过程,伟大的a是335/535 CIS
,我的程序不会这样做,因此我对最终输出进行注释。我的代码在最后一个块中输出了类似于cis 335/535的内容,这是一个很好的过程

    TITLE MASM Assignment 3 reverse a string word by word                   (main.asm)

; Description: Reverse a string character by character in-place then reverse word for word using nested loops
; 
; Revision date:

INCLUDE Irvine32.inc
.data
source    BYTE   "CIS 335/535 is a great course",0
ecxbkp DWORD  ?     ;save ecx if necessary 


.code
main PROC

mov  edx,OFFSET source
    call WriteString
    call Crlf                       ; print\r\n


mov ecx, LENGTHOF source                ;initialize loop counter                                               
mov esi, OFFSET source                  ;esi starting address of string           
mov edi, OFFSET source                                                
dec edi                           

END_STRING:
inc edi
mov al,[edi]
cmp al,0                             ;find zero byte
jnz END_STRING                       ;jump back to END_STRING if al is not 0

dec edi                              ;edi points to end of string
shr ecx, 1                           ;ecx is  loop count (shift one = length/2)


L1: 
 mov bl, [esi]                      ;load characters
 mov al, [edi]
 mov [esi], al                      ;swap characters
 mov [edi], bl
 inc esi                            ;update forward pointer by 1
 dec edi                            ;decrement backward pointer by 1


 loop L1                            ;and loop

 ; display the string

    mov  edx,OFFSET source
    call WriteString
    call Crlf                    ; print\r\n


;Use nested loops to reverse word for word

mov ecx, LENGTHOF source              ;set outer loop count ecx= entire length
mov esi, OFFSET source                ;esi points to start of string
mov edi, OFFSET source
dec edi

mov ecxbkp, ecx                     ;save outer loop count

L2:                                 ; go through beginning to end of string copy space character for length

inc edi
mov al, [edi]                       ;move edi address into al register
cmp al, ' '                         ;find space character 
loop L2

mov ecx, 16                         ;modify inner loop count (length/2) (for swap) 
dec edi

L3:                                 ; reverse/swap word for word
 mov bl,[esi]               
 mov al,[edi]                       ;load words
 mov [esi], al
 mov [edi],bl                       ;swap words
 inc esi                            ;update forward pointer by 1
 dec edi                            ;decrement backward pointer by 1

 loop L3                            ;and loop

 mov ecxbkp, ecx                    ;restore outer loop count

 ; display the string

    ;mov     edx,OFFSET source
    ;call WriteString
    ;call Crlf                       ; print\r\n

exit
main ENDP

END main

    enter code here

为让您顺利进行,请进行以下更改:

循环L2
更改为
jne L2

不要在ECX中使用固定值16,而是计算单词的确切长度。
将EDI中的位置保存在变量中,以便在L3循环中反转该单词后,能够继续使用下一个单词

L2:
inc edi
mov al, [edi]     ;move edi address into al register
cmp al, ' '       ;find space character 
jne L2
mov SavedPointer, edi
lea ecx,[edi-1]
sub ecx,esi       ;ECX is length of current word

惰性方法:循环字符串并将每个字符推到堆栈上,返回字符串的开头,通过从堆栈中弹出相同数量的字母来填充它。