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"
Asembler średnia arytmetyczna

- Rejestracja:prawie 23 lata
- Ostatnio:około 7 lat
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

- Rejestracja:ponad 20 lat
- Ostatnio:dzień
- Lokalizacja:XML Hills
.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.
- Rejestracja:około 17 lat
- Ostatnio:ponad 14 lat
Wpierw kilka ważnych uwag:
-
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;) -
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)
-
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
-
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
- Rejestracja:około 17 lat
- Ostatnio:ponad 14 lat
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ś;)

- Rejestracja:prawie 22 lata
- Ostatnio:około 2 godziny
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.
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 13 lat
- Postów:1
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 ?
- Rejestracja:ponad 11 lat
- Ostatnio:około 11 lat
- Postów:5
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


- Rejestracja:ponad 11 lat
- Ostatnio:około 11 lat
- Postów:5
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.

- Rejestracja:prawie 22 lata
- Ostatnio:ponad 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
- Ten kod nadal jest po prostu błędny.
- 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....
- Rejestracja:ponad 11 lat
- Ostatnio:około 11 lat
- Postów:5
- 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...

- Rejestracja:prawie 22 lata
- Ostatnio:ponad 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
- 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ć).
- I ma racje, bo polskie książki są zwykle bezużyteczne. Popatrz na to: http://www.csi.ucd.ie/staff/jcarthy/home/alp/
- 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)
- Rejestracja:ponad 11 lat
- Ostatnio:około 11 lat
- Postów:5
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.

- Rejestracja:prawie 22 lata
- Ostatnio:ponad 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
- 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.
- Forum jest żeby dyskutować (bo to forum dyskusyjne) i czasami POMAGAĆ ludziom. Pomagać to nie znaczy odwalać za kogoś całą robotę.
- 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...
- 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.
- Rejestracja:ponad 11 lat
- Ostatnio:około 11 lat
- Postów:5
- 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. - Patrz wyżej, nigdzie nie oczekiwałem zrobienia za mnie programu...
- 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.
- 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 :)
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.