Asembler średnia arytmetyczna

0

siemanko. Mam 2 programiki napisane w asemblerze w których specjalnie zostało nasadzone kilka błędów. I wszystko byłoby dobrze gdybym umiał te błędy odnaleść i poprawić. Licze na waszą pomoc.
Oto te nieszczęsne programy

Program obliczajacy srednia arytmetyczna liczb w tablicy

  .MODEL  TINY

Kod             SEG

                ORH     .120h
                ASSUM   CS:Kod, DS:Dane, SS:Stos

Start:
                jmp     Petla

DL_TABLICA      EQU     12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      !

Poczatek:
                xor     bl, bl
                mov     bx, SEGMEMT Tablica
                mov     ch, DL_TABLICY

Petla:
                add     al, [bh]
                lop     Poczatek
                dec     bx

                mov     ah, Srednia
                div     DL_TABLICY

                mov     ax, 4C76h
                int     21h

Kod             ENDSEG

                END     Stop

no i drugi...

Program obliczajacy wzor: a*(b-c)/d

 .MODEL  SMALLER

Dane            SEGMN

a               =       20
b               DW      10
c               DB      5
d               EQU     3
Wynik           DB      ?

Kod             END_SEGMN

Dane            SEGMN

                ASJUME  CS:Start, DS:Kod, SS:Stos

Start:
                mov     ds, OFSET Dan
                mov     ax, ds

                sub     ds, WORD PTR c
                mov     ah, b
                div     d

                mov     al, Wynik
                mul     a

                mov     ax, 4C0Gh
                int     21h

Kod             ENDSEGMN

Stosik          SEG     STAKC

?               DB      100h DUP [?]

Stosk           SEGEND

                END     Poczatek

z góry wielkie dzięki i pozdro:)

0

pierwszy program:
1 błąd: "ORH .120h" zamiast "ORG 120h"
2 błąd: "Srednia DB !" zamiast "Srednia DB ?"
3 błąd: "DL_TABLICA EQU 12" zamiast "DL_TABLICY EQU 12"
4 błąd: "END Stop" zamiast "END Start"

0

dzieki ale ten programik już rozpykałem. z tym drugim mam troszke problemów. pozdro

0

Jeżeli to program na zaliczenie przedmiotu czy coś w tym stylu to powiedz prowadzącemu, że jest debilem.

;Program obliczajacy wzor: a*(b-c)/d

 .MODEL  SMALL

Dane            SEGMENT

a               dw       20
b               dW      10
c               dw      5
d               dw     3
Wynik           dw      ?

Dane            ENDS

Kod            SEGMENT

                ASSUME  CS:Kod, DS:Dane, SS:Stosik

Start:
                mov     ax, Dane
                mov     ax, ds

                mov   ax, b
                sub     ax,  c
                div     d
                mul     a
                mov   Wynik, ax

                mov     ax, 4C00h
                int     21h

Kod             ENDS

Stosik          SEGMENT     STACK

               DB      100h DUP (?)

Stosik           ENDS

                END     Start
0

powiem mu to na pewno. dzięki wielkie, życie mi ratujecie:)

0

przepraszam za odkopanie kotleta ale czy bylaby mozliwosc rozwiazania do tego 1 programu? Bo tych bledow w nim jest ciut wiecej niz juz tutaj podano. Generalnie wiekszosci sie pozbylem ale program albo wykonuje mi sie w nieskonczonosc albo po drobnych zmianach nie wyswietla niczego oprocz pustej linii. zadanie jest takie samo jak w 1 poscie tylko ze oprocz znalezienia bledow mamy przedstawic dzialajaca wersje. z gory dzieki

0

Skoro się pozbyłeś, to dawaj kod z błędami „pozbytymi”. To wyżej nie nadaje się do czytania.

0
.MODEL  TINY

Kod             SEG

                ORG     100h
                ASSUM   CS:Kod, DS:Dane, SS:Stos

Start:
                jmp     Poczatek

DL_TABLICY      EQU     12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      ?

Poczatek:
                xor     ax, ax
                mov     bx, OFFSET Tablica
                mov     cx, DL_TABLICY

Petla:
                add     al, [bx]
                adc     ah,0
                inc     bx
                loop    Petla

                mov     bh, DL_TABLICY
                div     bh
                mov     Srednia, al

                mov     ax, 4C76h
                int     21h

Kod             ENDSEG

                END     Start

Trochę lepsza wersja. Nie testowałem.

Nevar:
mul powinien być przed divem.

0

Wpierw kilka ważnych uwag:

  1. Sądząc po dyrektywie org myślę, że to ma być program .COM. Jeśli tak to wszystkie rejestry segmentowe trzeba (a przynajmniej powinno się) ustawić na ten sam segment.
    W twoim jednak przypadku ds i ss są ustawione na NIEISTNIEJĄCE SEGMENTY!
    Powinno być
    ASSUM CS:Kod, DS:Kod, SS:Kod
    stos jest liczony od końca segmentu więc póki twój program jest mały nie powinno być problemów jak damy go na ten sam segment;)

  2. Jak ci się wydaje co robią poniższe dwie instrukjce?

mov ax, 4C76h
int 21h

Bo według mnie i według opisów w necie (jakie dla pewności wyszukałem: http://rudy.mif.pg.gda.pl/~bogdro/dos/dos_int.htm#int21h ) jest to zamknięcie programu z kodem powrotnym 76h (a nie wypisywanie tekstu tak jak to powinno chyba być w tym miejscu programu)

  1. Offsety zwykle powinno przechowywać się w rejestrach si i di ("source index" i "destination index") bo po to one w sumie są a nie w bx jak u ciebie

  2. Nie wiem czy o tym wiesz ale jest takie coś w asemblerze co można nazwać "segmentami domyślnymi". Chodzi o to że zapis np. [si] w rzeczywistości oznacza ds:[si] itp. Podstawowe domyślne segmenty:
    [si]->ds:[si]
    [di]->es:[di]
    [sp]->ss:[sp]

Kod trochę poprawiony:

.MODEL  TINY

Kod             SEG

                ORG     100h
                ASSUM   CS:Kod, DS:Kod, SS:Kod

Start:
                jmp     Poczatek

DL_TABLICY      EQU     12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      ?

Poczatek:
                xor     ax, ax
                mov     si, OFFSET Tablica
                mov     cx, DL_TABLICY

Petla:
                add     al, [si]
                adc     ah,0
                inc     si
                loop    Petla

                mov     bl, DL_TABLICY
                div     bl
                mov     Srednia, al

;
;   tu musisz dodac zamiane liczby na tekst i jej wypisanie (int 21h ah=09h!!!)
;

                mov     ax, 4C00h
                int     21h

Kod             ENDSEG

                END     Start
0

Co do segmentow w plikach com to mysle, ze ich ustawienie ma niewielkie znaczenie, poniewaz to tylko pliki .com, nie .exe.
Natomiast co do offsetow to masz racje ale rownie dobrze mogby je dac i w zmiennej :)

0

ASSUME niczego nie ustawia, segmenty trzeba ustawić samodzielnie za pomocą instrukcji. np. tak:

Start:
   push cs
   pop ds
   push cs
   pop es
   ...
0

Spoko, kierowalem sie wypowiedzia Valdemart'a poniewaz nie pisalem nigdy w Tasm'ie, a w Nasm sie nie spotkalem z assume lub nie bylo mi nigdy spotkanie z nia potrzebne ;)

0
t0m_k napisał(a)

Co do segmentow w plikach com to mysle, ze ich ustawienie ma niewielkie znaczenie, poniewaz to tylko pliki .com, nie .exe.

No znaczenie jest w sumie niewielkie ale to co on tam zrobił to po prostu zwala z nóg:) żeby ustawić ds na nieistniejący segment... to już lepiej assum ds:nothing zrobić niż takie coś;)

1
t0m_k napisał(a)

Spoko, kierowalem sie wypowiedzia Valdemart'a poniewaz nie pisalem nigdy w Tasm'ie, a w Nasm sie nie spotkalem z assume lub nie bylo mi nigdy spotkanie z nia potrzebne ;)

Nasm, Fasm, Yasm nie mają ASSUME i bardzo dobrze. Ich składnia jest bardziej przejrzysta niż "starych" asemblerów.

0

W plikach com jest co do segmentów jeszcze jedna ciekawa rzecz: podczas ładowania wszystkie segmenty są domyślnie ustawiane na ten sam co cs w niektórych systemach więc i na to można zwrócić uwagę ;-)

0

Witam, pozwolę sobie odkopać temat.

mam takie pytanie odnośnie tego kodu :

 .MODEL  TINY
 
Kod             SEG
 
                ORG     100h
                ASSUM   CS:Kod, DS:Kod, SS:Kod
 
Start:
                jmp     Poczatek
 
DL_TABLICY      EQU     12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      ?
 
Poczatek:
                xor     ax, ax
                mov     si, OFFSET Tablica
                mov     cx, DL_TABLICY
 
Petla:
                add     al, [si]
                adc     ah,0
                inc     si
                loop    Petla
 
                mov     bl, DL_TABLICY
                div     bl
                mov     Srednia, al
 
;
;   tu musisz dodac zamiane liczby na tekst i jej wypisanie (int 21h ah=09h!!!)
;
 
                mov     ax, 4C00h
                int     21h
 
Kod             ENDSEG
 
                END     Start
 

Czy duzo trzeba tutaj poprawic zeby to chodzilo ?

1

Znów odkop i prośba o pilną pomoc - zupełnie nie potrafię odpalić programu 1 - stanąłem na tym samym co w poście wyżej... Ktoś coś może pomóc?
Kompilator wyrzuca problem 20 błędów - pierwszy jest z undefined PETLA.

Pomocy!

Już zrobione :)

W Segment zamiast seg i ends na koncu i poszlo :P

EDIT: chyba poszło - na tyle na ile w debbugerze się odnajduje

0

a mógłby ktoś opisać która linijka za co odpowiada?

Najbardziej zależy mi na dokładnym wytłumaczeniu pierwszej częśći tj.

.MODEL  TINY
 
Kod             SEG
 
                ORG     100h
                ASSUM   CS:Kod, DS:Kod, SS:Kod
 
Start:
                jmp     Poczatek
 
DL_TABLICY      EQU     12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      ?
 
Poczatek:
                xor     ax, ax
                mov     si, OFFSET Tablica
                mov     cx, DL_TABLICY

Wiem że kolejno wygląda to mniej więcej tak:

.MODEL  TINY
 
Kod             SEGMENT									;poczatek segmentu Kod
 
                ORG     100h							;organizacja 100h, informacja, że będzie to program typu .COM
                ASSUME   CS:Kod, DS:Kod, SS:Kod			;segment kodu - Kod, segment danych - Kod, segment stosu - Kod
 
Start:													;funckja Start
				jmp     Poczatek						;przeskocz to funkcji Poczatek, aby ominąć deklaracje danych
 
DL_TABLICY      EQU     12								;przypisanie DL_TABLICY=12
Tablica         DB      01h, 02h, 00h, 10h, 12h, 33h	;deklaracja tablicy Tablica o 12 elementach
                DB      15h, 09h, 11h, 08h, 0Ah, 00h
Srednia         DB      ?								;deklaracja zmennej Srednia z niewiadomą wartością
 
Poczatek:												;funkcja Poczatek
                xor     ax, ax							;czyszczenie rejestru ax
                mov     si, OFFSET Tablica				;przypisanie do si początku zmiennej Tablica
                mov     cx, DL_TABLICY					;przypisanie do cx wartości zmiennej DL_TABLICY, czyli 12 

ale na tym moja wiedza się kończy, a zakres wymagany na zajęciach jest o wiele większy. Jeśli nikt nie chce pomóc to chociaż wskażcie literaturę po Polsku w której miałbym sensownie to potłumaczone.
Bo nam jako podręcznik na zajęciach wskazano... manul intela.

0
  1. Ten kod nadal jest po prostu błędny.
  2. Start i Poczatek to nie są funkcje. Poza tym mniej więcej dobrze napisałeś.

Co do literatury to rozumiem że jesteś w szkole podstawowej i skoro "pani nie podała podręcznika" to nie wiesz co ze sobą zrobić? Odpuść sobie studiowanie i informatykę, bo ewidentnie nie jest to dla ciebie....

0
  1. skoro są błędy to może raczyłbyś je wskazać?
    Tak, Pani nie podała więc nie wiem, a na nasze różne propozycje kurczowo upierała się że się nie da nauczyć bo wszystko jest do d...
    Więc pytam tu - osób które miały z tym styczność i wiedzą która pozycja będzie pomocna...

BTW szybko wysnuwasz wnioski :) dwa posty i już wiesz co powinienem a czego nie...

0
  1. hohoho rubaszny śmiech, raczyłbym wskazać? Ależ jak najbardziej, za odpowiednią opłatą. Bo widzisz czym innym jest prośba o pomoc a czym innym jest żebranie o gotowca (chociaż ewenementem jest żebranie o gotowca kiedy w tym temacie padły już informacje jak ten kod poprawić).
  2. I ma racje, bo polskie książki są zwykle bezużyteczne. Popatrz na to: http://www.csi.ucd.ie/staff/jcarthy/home/alp/
  3. Czy szybko wysnuwam? Przez miesiąc nie potrafisz poprawić błędów w kilkunastu linijkach kodu prostego jak budowa cepa, mając pod nosem temat gdzie wyjaśniono co jest w tym kodzie nie tak.
    BTW, tak dla ustalenia uwagi, moja pierwsza styczność z asemblerem to było takie zadanie (blog nie jest mój, ale zadanie to samo bo ta sama uczelnia):
    http://slonka.net/pl/programy/assembler-skrót-klucza-publicznego-w-postaci-grafiki-ascii
    (do wykonania w ciągu pierwszego miesiąca nauki asemblera)
0

Am... czyli żebraniem o gotowca jest pytanie gdzie jest błąd jeśli go widzisz bo ja nie dostrzegam(z racji braków wiedzy)? Świetna logika.
Za opłatą? TO po co jest to forum w sumie?

Twoją pomocą jest dopisywanie komentarzy o warunkach i tego że dziwne że mi odpaliło. Cała tutaj pomoc uzyskana.
Z wcześniejszych stron nie wyciągam nic do podanego wyżej przykładu bo po zmianach takich jakie zrobiłem program działa i wykonuje się prawidłowo. Nie rozumiem pewnych mechanizmów - co rozumiem to wykomendowałem. Poprosiłem o ewentualnie dodatkowe informacje istotne dla danych punktów :)
I średnio rozumiem zarzut o "żebranie o gotowca" bo ja zwyczajnie proszę o pomoc. Widzisz błędy - to je wskaż. Nie oczekuje że masz mi je poprawiasz, ja ich nie widzę, program wykonuje się prawdiłowo (wylicza prawdiłowo) więc sądziłem że program działa prawidłowo...

Twoje podejście jest irytujące.

0
  1. Och bo widzisz problem w tym że to nie są kody które napisałes i zrobiłeś w nich błędy. Dostałeś błędne kody od prowadzącego i twoim zadaniem było je poprawić. Ergo prosisz tutaj o odrobienie za ciebie pracy domowej i juz za to twoje posty powinny polecieć do kosza, bo regulamin jasno stwierdza że jest zakaz umieszczania takich próśb.
  2. Forum jest żeby dyskutować (bo to forum dyskusyjne) i czasami POMAGAĆ ludziom. Pomagać to nie znaczy odwalać za kogoś całą robotę.
  3. Zauważ że ostatni kod który wstawiłeś jest inny niż poprzednie i on ma prawo się skompilować a może i zadziałać. Gdybys wstawił tyko ten kod i spytał o konkretne kilka linijek których z niego nie rozumiesz, to ta rozmowa toczyłaby się inaczej...
  4. Jak już napisałem wcześniej - twoje komentarze mają sens, oprócz tych o "funkcjach" których tam nie ma (etykietka do której skaczesz to nie jest funkcja), i tej o "przypisaniu początku tablicy", bo przypisujesz tam offset (czyli adres w danym segmencie) pod jakim znajdują się dane opatrzone etykietą "tablica". Więc przypisujesz adres.
0
  1. Nigdzie nie poprosiłem o zrobienie tego za mnie a o jakąkolwiek pomoc, jeśli ktoś poprawi to świetnie, jeśli ktoś powie gdzie błąd też dobrze :)
    A jak nawet tego nie wiecie (tudzież Twoje wiem ale nie powiem...) - niech wskaże choćby literaturę gdzie dowiem się o tego typu podstawach.
  2. Patrz wyżej, nigdzie nie oczekiwałem zrobienia za mnie programu...
  3. Owszem, bo dostaliśmy dwa programy - .exe i .com i teraz właśnie z tym mam problem. Tak jak pisalem - program kompiluje sie i dziala poprawnie (tak, przeliczalem z 16 i wynik sie zgadza). Jeśli widzisz w nim błędy to je wskaż bo ja ich nie dostrzegam.
  4. Wiem że moje komentarze mają sens - i rozumiem mniej więcej to co napisałem. Owszem, mogę się mylić choćby tak jak z tą funkcją bo nie znam jeszcze dobrze terminilogia, ale wiem w praktyce że dana komenda dodaje wartością taką do takiej. Ale sprwadzający wymaga więcej, więc poprosiłem o napisanie czegoś więcej - inne podstawowe informacji których ja nie mam.
    Skąd komputer wie skąd pobierać dane któe są w segmencie. Gdzie one znajdują się w pamięci? Co ile występują? Pytania mnie rozwalają bo jak przychodzi do odpowiedzi to choć wiem co program robi i jak to nic z typowo architektury komputerowej nie umiem. Materiałów na uczelni brak - na wykładzie mamy o historii komputerów :)

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