Sumowanie elementów tablicy

Sumowanie elementów tablicy
0

Witam,mam za zadanie zsumować elementy tablicy w asemblerze.Oto mój kod:

Kopiuj
 ;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ć kolejną liczbę: ",0
    ALIGN    4
    rozmA    DD    $ - zaprA    ;liczba znaków w tablicy
    zaprB    DB    0Dh,0Ah,"Suma wprowadzonych liczb wynosi: ",0
    ALIGN    4
    rozmB    DD    $ - zaprB    ;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
    liczby    DB    10 dup(?)
    rLiczby    DD    10
_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
    
cld    ;wyzerowanie flagi kierunku
mov EDI, OFFSET liczby ; pod tym adresem umieścimy wczytane liczby
mov ecx, 10
petla:
push ecx

;--- 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   EDX,rinp
    mov   BYTE PTR [EBX+EDX-2],0 ;zero na końcu tekstu
;--- przekształcenie A
    push    OFFSET bufor
    call    ScanInt    ;pobraną liczbę mamy teraz w akumulatorze
    stosb ; i przesyłamy ją do pamięci w miejce wskazywane przez EDI (po operacji edi zwiększany automatycznie o 1)
pop ecx
loop petla    

    mov eax,0
    ;ToDo - wykonaj stosowne obliczenia (wynik ma być zwrócowny w eax)
     mov ebx,0 
     cld 
     mov esi,OFFSET liczby
     mov ecx,lengthof liczby ; loop counter 
     L1: lodsb ; copy [ESI] into AL
     add ebx, eax 
     loop L1
     mov eax, ebx
;--- wyprowadzenie wyniku obliczeń ---
    push    EAX
    push    OFFSET zaprB
    push    OFFSET bufor
    call    wsprintfA    ; zwraca liczbę znaków w buforze 
    add    ESP, 12        ; czyszczenie stosu
    mov    rinp, EAX    ; zapamiętywanie liczby znaków
;--- wyświetlenie wyniku ---------
    push    0         ; rezerwa, musi być zero
    push    OFFSET rout     ; wskaźnik na faktyczną liczbę wyprowadzonych znaków 
    push    rinp        ; liczba znaków
    push    OFFSET bufor     ; 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 mi dokładnie o tą część:

Kopiuj
 mov ebx,0 
     cld 
     mov esi,OFFSET liczby
     mov ecx,lengthof liczby ; loop counter 
     L1: lodsb ; copy [ESI] into AL
     add ebx, eax 
     loop L1
     mov eax, ebx

Z góry dzięki za pomoc

edytowany 1x, ostatnio: madmike
madmike
A skąd do głowy przyszedł pomysł stosowania znaczników w postaci <code></code=asm>? Wpisując kod znaczniki mają mieć postać <code=asm></code> :)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Tuchów
  • Postów:12167
0

Witam,mam za zadanie zsumować elementy tablicy w asemblerze.Oto mój kod:

Chodzi mi dokładnie o tą część:

Z góry dzięki za pomoc

No, napracowałeś się z opisem problemu; Może tak zadasz pytanie? Czy pomagierzy mają zgadywać dlaczego pomocy potrzebujesz?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

A co to ma znaczyć?
mov ecx,lengthof liczby ; loop counter
Zauważ że liczby zapisywane przez stosb czyli edi wskazuje ci za ostatnią liczbę.
Jeżeli od edi odejmiesz OFFSET liczby dostaniesz ilość wczytanych liczb.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
0

Pytanie: co zrobiłem źle,że nie działa:D
Faktycznie,zmieniłem na mov ecx,rLiczby
ale dalej nie działa;(

_13th_Dragon
A powiedz mi którego słowa nie rozumiesz z mojego poprzedniego posta? No chyba że chcesz gotowca, bo wtedy @madmike ...
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)