Asembler średnia arytmetyczna

VA
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 14 lat
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"

Nevar
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 7 lat
0

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

Kopiuj
;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

Azarien
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 2 godziny
0

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

Wibowit
  • Rejestracja:ponad 20 lat
  • Ostatnio:dzień
  • Lokalizacja:XML Hills
0
Kopiuj
.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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Shalom
VA
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 14 lat
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?

Kopiuj
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:

Kopiuj
.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
edytowany 1x, ostatnio: Shalom
TK
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 14 lat
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 :)

Azarien
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 2 godziny
0

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

Kopiuj
Start:
   push cs
   pop ds
   push cs
   pop es
   ...
TK
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 14 lat
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 ;)

VA
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 14 lat
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ś;)

Azarien
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 2 godziny
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.

VA
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 14 lat
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ę ;-)

S6
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:1
0

Witam, pozwolę sobie odkopać temat.

mam takie pytanie odnośnie tego kodu :

Kopiuj
 .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 ?

edytowany 1x, ostatnio: Shalom
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:5
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

Shalom
Oj, chyba będzie waruneczek...
Shalom
o rly? nawet z tym "assum" się kompiluje? ;]
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:5
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.

Kopiuj
.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:

Kopiuj
.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.

edytowany 2x, ostatnio: Shalom
Shalom
!nie
Shalom
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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....


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:5
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...

edytowany 1x, ostatnio: disater984
Shalom
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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)

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:5
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.

edytowany 1x, ostatnio: disater984
Shalom
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
D9
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 11 lat
  • Postów:5
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 :)
edytowany 1x, ostatnio: disater984
Shalom
"materiałów brak" - hahahahaha, no tak, bo ten asembler ma raptem 34 lata więc nie powstały jeszcze na jego temat żadne materiały ;]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.