Wyświetlanie zawartości bufora w kolejności odwrotnej

0

Witam,jak w temacie mam za zadanie wyświetlić zawartość bufora w kolejności odwrotnej.
Dodam,że piszę w masmie.
Oto kod:

 ;Aplikacja korzystająca z otwartego okna konsoli
.386
.MODEL flat, STDCALL
;--- stale ---
STD_INPUT_HANDLE                     equ -10
STD_OUTPUT_HANDLE                    equ -11
;--- funkcje API Win32 ---
;--- z pliku  user32.inc ---
CharToOemA PROTO :DWORD,:DWORD
;--- z pliku kernel32.inc ---
GetStdHandle PROTO :DWORD
ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
wsprintfA PROTO C :VARARG
lstrlenA PROTO :DWORD
;-------------
includelib .\lib\user32.lib
includelib .\lib\kernel32.lib
;-------------
_DATA SEGMENT
    hout    DD    ?
    hinp    DD    ?
    naglow    DB    "Autor aplikacji Jan Masztalski.",0
    ALIGN    4    ; przesuniecie do adresu podzielnego na 4
    rozmN    DD    $ - naglow    ;liczba znaków w tablicy
    zaprA    DB    0Dh,0Ah,"Proszę wprowadzić znaki znaki do bufora: ",0
    ALIGN    4
    rozmA    DD    $ - zaprA    ;liczba znaków w tablicy
    zaprB    DB    0Dh,0Ah,"Bufor po wprowadzeniu danych: ",0
    ALIGN    4
    rozmB    DD    $ - zaprB    ;liczba znaków w tablicy
    zaprC    DB    0Dh,0Ah,"Bufor po zmianach: ",0
    ALIGN    4
    rozmC    DD    $ - zaprC    ;liczba znaków w tablicy
    ALIGN    4
    rout    DD    0 ;faktyczna liczba wyprowadzonych znaków
    rinp    DD    0 ;faktyczna liczba wprowadzonych znaków
    lZnakow    DD    0 
    bufor    DB    128 dup(?)
    rbuf    DD    128
    bufor2    DB    128 dup(?)
    rbuf2    DD    128
_DATA ENDS
;------------
_TEXT SEGMENT
start:
;--- wywołanie funkcji GetStdHandle 
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle    ; wywołanie funkcji GetStdHandle
    mov    hout, EAX    ; deskryptor wyjściowego bufora konsoli
    push    STD_INPUT_HANDLE
    call    GetStdHandle    ; wywołanie funkcji GetStdHandle
    mov    hinp, EAX    ; deskryptor wejściowego bufora konsoli
;--- nagłówek ---------
    push    OFFSET naglow
    push    OFFSET naglow
    call    CharToOemA    ; konwersja polskich znaków
;--- wyświetlenie ---------
    push    0        ; rezerwa, musi być zero
    push    OFFSET rout    ; wskaźnik na faktyczną liczba wyprowadzonych znaków 
    push    rozmN        ; liczba znaków
    push    OFFSET naglow     ; wskażnik na tekst
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA
;--- zaproszenie A ---------
    push    OFFSET zaprA
    push    OFFSET zaprA
    call    CharToOemA    ; konwersja polskich znaków
;--- wyświetlenie zaproszenia A ---
    push    0        ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczba wyprowadzonych znaków 
    push    rozmA        ; liczba znaków
    push    OFFSET zaprA     ; wskażnik na tekst
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA   
;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
    push    0         ; rezerwa, musi być zero
    push    OFFSET rinp     ; wskaźnik na faktyczną liczba wprowadzonych znaków 
    push    rbuf         ; rozmiar bufora
    push    OFFSET bufor ;wskażnik na bufor
     push    hinp        ; deskryptor buforu konsoli
    call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
    lea   EBX,bufor
    mov   EDI,rinp
    mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
;--- przekształcenie A
    push    OFFSET bufor
    call    lstrlenA
    mov    lZnakow, EAX
    
;--- wyświetlenie bufora przed zmianami ---------
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    rozmB        ; liczba znaków
    push    OFFSET zaprB     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsol
    
    
    push    OFFSET bufor
    call    lstrlenA
    mov    lZnakow, EAX
    
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    lZnakow        ; liczba znaków
    push    OFFSET bufor     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA        
    
    
    ;--- wypełnienie bufora2 wartością 0
    lea   EBX,bufor2
    mov   ECX,rbuf2
@@:    mov   BYTE PTR [EBX+ECX-1],0
    loop  @B 
    
    ;ToDo: TWOJE DZIAŁANIA NA BUFORZE
    <div class="_38 direction_ltr"><span class="null"><p>mov ecx, rozmN
mov eax, bufor
mov esi, eax  
add eax, ecx
mov edi, eax
dec edi      
shr ecx, 1    </p><p>reverseLoop:
mov al, [esi] 
mov bl, [edi]
mov [esi], bl 
mov [edi], al
inc esi     
dec edi
dec ecx       
jnz reverseLoop</p></span></div>



;--- wyświetlenie bufora po zmianach ---------
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    rozmC        ; liczba znaków
    push    OFFSET zaprC     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsol
    
    push    OFFSET bufor2
    call    lstrlenA
    mov    lZnakow, EAX
    
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    lZnakow        ; liczba znaków
    push    OFFSET bufor2     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA    

;--- zakończenie procesu ---------
    push    0
    call    ExitProcess    ; wywołanie funkcji ExitProcess
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ScanInt   PROC 
;; funkcja ScanInt przekształca ciąg cyfr do liczby, którą jest zwracana przez EAX 
;; argument - zakończony zerem wiersz z cyframi 
;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy 
;--- początek funkcji 
   push   EBP 
   mov   EBP, ESP   ; wskaźnik stosu ESP przypisujemy do EBP 
;--- odkładanie na stos 
   push   EBX 
   push   ECX 
   push   EDX 
   push   ESI 
   push   EDI 
;--- przygotowywanie cyklu 
   mov   EBX, [EBP+8] 
   push   EBX 
   call   lstrlenA 
   mov   EDI, EAX   ;liczba znaków 
   mov   ECX, EAX   ;liczba powtórzeń = liczba znaków 
   xor   ESI, ESI   ; wyzerowanie ESI 
   xor   EDX, EDX   ; wyzerowanie EDX 
   xor   EAX, EAX   ; wyzerowanie EAX 
   mov   EBX, [EBP+8] ; adres tekstu
;--- cykl -------------------------- 
pocz: 
   cmp   BYTE PTR [EBX+ESI], 0h   ;porównanie z kodem \0 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 0Dh   ;porównanie z kodem CR 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 0Ah   ;porównanie z kodem LF 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 02Dh   ;porównanie z kodem - 
   jne   @F 
   mov   EDX, 1 
   jmp   nast 
@@: 
   cmp   BYTE PTR [EBX+ESI], 030h   ;porównanie z kodem 0 
   jae   @F 
   jmp   nast 
@@: 
   cmp   BYTE PTR [EBX+ESI], 039h   ;porównanie z kodem 9 
   jbe   @F 
   jmp   nast 
;---- 
@@:    
    push   EDX   ; do EDX procesor może zapisać wynik mnożenia 
   mov   EDI, 10 
   mul   EDI      ;mnożenie EAX * EDI 
   mov   EDI, EAX   ; tymczasowo z EAX do EDI 
   xor   EAX, EAX   ;zerowani EAX 
   mov   AL, BYTE PTR [EBX+ESI] 
   sub   AL, 030h   ; korekta: cyfra = kod znaku - kod 0    
   add   EAX, EDI   ; dodanie cyfry 
   pop   EDX 
nast:   
    inc   ESI 
   loop   pocz 
;--- wynik 
   or   EDX, EDX   ;analiza znacznika EDX 
   jz   @F 
   neg   EAX 
@@:    
et4:;--- zdejmowanie ze stosu 
   pop   EDI 
   pop   ESI 
   pop   EDX 
   pop   ECX 
   pop   EBX 
;--- powrót 
   mov   ESP, EBP   ; przywracamy wskaźnik stosu ESP
   pop   EBP 
   ret    4
ScanInt   ENDP 
_TEXT    ENDS    

END start

Chodzi o tą część kodu bo nie wiem co mam dopisać,żeby działało:D

mov ecx, rozmN
mov eax, bufor
mov esi, eax  
add eax, ecx
mov edi, eax
dec edi      
shr ecx, 1    </p><p>reverseLoop:
mov al, [esi] 
mov bl, [edi]
mov [esi], bl 
mov [edi], al
inc esi     
dec edi
dec ecx       
jnz reverseLoop

dodanie znaczników <code class="asm"> - fp

0

Pomoże ktoś?

0
 ;Aplikacja korzystająca z otwartego okna konsoli
.386
.MODEL flat, STDCALL
;--- stale ---
STD_INPUT_HANDLE                     equ -10
STD_OUTPUT_HANDLE                    equ -11
;--- funkcje API Win32 ---
;--- z pliku  user32.inc ---
CharToOemA PROTO :DWORD,:DWORD
;--- z pliku kernel32.inc ---
GetStdHandle PROTO :DWORD
ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
wsprintfA PROTO C :VARARG
lstrlenA PROTO :DWORD
;-------------
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
;-------------
_DATA SEGMENT
    hout    DD    ?
    hinp    DD    ?
    naglow    DB    "Autor aplikacji Jan Masztalski.",0
    ALIGN    4    ; przesuniecie do adresu podzielnego na 4
    rozmN    DD    $ - naglow    ;liczba znaków w tablicy
    zaprA    DB    0Dh,0Ah,"Proszę wprowadzić znaki znaki do bufora: ",0
    ALIGN    4
    rozmA    DD    $ - zaprA    ;liczba znaków w tablicy
    zaprB    DB    0Dh,0Ah,"Bufor po wprowadzeniu danych: ",0
    ALIGN    4
    rozmB    DD    $ - zaprB    ;liczba znaków w tablicy
    zaprC    DB    0Dh,0Ah,"Bufor po zmianach: ",0
    ALIGN    4
    rozmC    DD    $ - zaprC    ;liczba znaków w tablicy
    ALIGN    4
    rout    DD    0 ;faktyczna liczba wyprowadzonych znaków
    rinp    DD    0 ;faktyczna liczba wprowadzonych znaków
    lZnakow    DD    0 
    bufor    DB    128 dup(?)
    rbuf    DD    128
    bufor2    DB    128 dup(?)
    rbuf2    DD    128
_DATA ENDS
;------------
_TEXT SEGMENT
start:
;--- wywołanie funkcji GetStdHandle 
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle    ; wywołanie funkcji GetStdHandle
    mov    hout, EAX    ; deskryptor wyjściowego bufora konsoli
    push    STD_INPUT_HANDLE
    call    GetStdHandle    ; wywołanie funkcji GetStdHandle
    mov    hinp, EAX    ; deskryptor wejściowego bufora konsoli
;--- nagłówek ---------
    push    OFFSET naglow
    push    OFFSET naglow
    call    CharToOemA    ; konwersja polskich znaków
;--- wyświetlenie ---------
    push    0        ; rezerwa, musi być zero
    push    OFFSET rout    ; wskaźnik na faktyczną liczba wyprowadzonych znaków 
    push    rozmN        ; liczba znaków
    push    OFFSET naglow     ; wskażnik na tekst
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA
;--- zaproszenie A ---------
    push    OFFSET zaprA
    push    OFFSET zaprA
    call    CharToOemA    ; konwersja polskich znaków
;--- wyświetlenie zaproszenia A ---
    push    0        ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczba wyprowadzonych znaków 
    push    rozmA        ; liczba znaków
    push    OFFSET zaprA     ; wskażnik na tekst
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA   
;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
    push    0         ; rezerwa, musi być zero
    push    OFFSET rinp     ; wskaźnik na faktyczną liczba wprowadzonych znaków 
    push    rbuf         ; rozmiar bufora
    push    OFFSET bufor ;wskażnik na bufor
     push    hinp        ; deskryptor buforu konsoli
    call    ReadConsoleA    ; wywołanie funkcji ReadConsoleA
    lea   EBX,bufor
    mov   EDI,rinp
    mov   BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
;--- przekształcenie A
    push    OFFSET bufor
    call    lstrlenA
    mov    lZnakow, EAX
 
;--- wyświetlenie bufora przed zmianami ---------
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    rozmB        ; liczba znaków
    push    OFFSET zaprB     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsol
 
 
    push    OFFSET bufor
    call    lstrlenA
    mov    lZnakow, EAX
 
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    lZnakow        ; liczba znaków
    push    OFFSET bufor     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA        
 
 
    ;--- wypełnienie bufora2 wartością 0
    ;lea   EBX,bufor2
    ;mov   ECX,rbuf2
    ;@@:    mov   BYTE PTR [EBX+ECX-1],0
    ;loop  @B 

    mov ecx, lZnakow
    lea esi, bufor
    lea edi, bufor2
    add edi, lZnakow
    xor eax, eax
    mov [edi], al
copy_loop:
    dec edi
    mov al,[esi]
    mov [edi],al
    inc esi
    loop copy_loop
    
    

    ;ToDo: TWOJE DZIAŁANIA NA BUFORZE
    ;mov ecx, rozmN
    ;mov eax, bufor
    ;mov esi, eax  
    ;add eax, ecx
    ;mov edi, eax
    ;dec edi      
    ;shr ecx, 1
    ;mov al, [esi] 
    ;mov bl, [edi]
    ;mov [esi], bl 
    ;mov [edi], al
    ;inc esi     
    ;dec edi
    ;dec ecx       
    ;jnz reverseLoop
 
 
 
;--- wyświetlenie bufora po zmianach ---------
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    rozmC        ; liczba znaków
    push    OFFSET zaprC     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsol
 
    push    OFFSET bufor2
    call    lstrlenA
    mov    lZnakow, EAX
 
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    lZnakow        ; liczba znaków
    push    OFFSET bufor2     ; wskaźnik na tekst w buforze
     push    hout        ; deskryptor buforu konsoli
    call    WriteConsoleA    ; wywołanie funkcji WriteConsoleA    
 
;--- zakończenie procesu ---------
    push    0
    call    ExitProcess    ; wywołanie funkcji ExitProcess
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ScanInt   PROC 
;; funkcja ScanInt przekształca ciąg cyfr do liczby, którą jest zwracana przez EAX 
;; argument - zakończony zerem wiersz z cyframi 
;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy 
;--- początek funkcji 
   push   EBP 
   mov   EBP, ESP   ; wskaźnik stosu ESP przypisujemy do EBP 
;--- odkładanie na stos 
   push   EBX 
   push   ECX 
   push   EDX 
   push   ESI 
   push   EDI 
;--- przygotowywanie cyklu 
   mov   EBX, [EBP+8] 
   push   EBX 
   call   lstrlenA 
   mov   EDI, EAX   ;liczba znaków 
   mov   ECX, EAX   ;liczba powtórzeń = liczba znaków 
   xor   ESI, ESI   ; wyzerowanie ESI 
   xor   EDX, EDX   ; wyzerowanie EDX 
   xor   EAX, EAX   ; wyzerowanie EAX 
   mov   EBX, [EBP+8] ; adres tekstu
;--- cykl -------------------------- 
pocz: 
   cmp   BYTE PTR [EBX+ESI], 0h   ;porównanie z kodem \0 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 0Dh   ;porównanie z kodem CR 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 0Ah   ;porównanie z kodem LF 
   jne   @F 
   jmp   et4 
@@: 
   cmp   BYTE PTR [EBX+ESI], 02Dh   ;porównanie z kodem - 
   jne   @F 
   mov   EDX, 1 
   jmp   nast 
@@: 
   cmp   BYTE PTR [EBX+ESI], 030h   ;porównanie z kodem 0 
   jae   @F 
   jmp   nast 
@@: 
   cmp   BYTE PTR [EBX+ESI], 039h   ;porównanie z kodem 9 
   jbe   @F 
   jmp   nast 
;---- 
@@:    
    push   EDX   ; do EDX procesor może zapisać wynik mnożenia 
   mov   EDI, 10 
   mul   EDI      ;mnożenie EAX * EDI 
   mov   EDI, EAX   ; tymczasowo z EAX do EDI 
   xor   EAX, EAX   ;zerowani EAX 
   mov   AL, BYTE PTR [EBX+ESI] 
   sub   AL, 030h   ; korekta: cyfra = kod znaku - kod 0    
   add   EAX, EDI   ; dodanie cyfry 
   pop   EDX 
nast:   
    inc   ESI 
   loop   pocz 
;--- wynik 
   or   EDX, EDX   ;analiza znacznika EDX 
   jz   @F 
   neg   EAX 
@@:    
et4:;--- zdejmowanie ze stosu 
   pop   EDI 
   pop   ESI 
   pop   EDX 
   pop   ECX 
   pop   EBX 
;--- powrót 
   mov   ESP, EBP   ; przywracamy wskaźnik stosu ESP
   pop   EBP 
   ret    4
ScanInt   ENDP 
_TEXT    ENDS    
 
END start

1 użytkowników online, w tym zalogowanych: 0, gości: 1