Thread View: pl.comp.lang.asm
7 messages
7 total messages
Started by przemo12146
Wed, 16 Jun 2010 18:38
Tablica
Author: przemo12146
Date: Wed, 16 Jun 2010 18:38
Date: Wed, 16 Jun 2010 18:38
60 lines
2722 bytes
2722 bytes
Cześć, Jestem początkujący mam kilka pytań do mojego kodu: format binary org 100h poczatek: mov bx,tablica mov ax,a mov cx,b mov [bx+5],ax mov [bx+7],cx mov dx,[bx+5] mov ah,9h int 21h mov dx,[bx+7] mov ah,9h int 21h mov ah,0h int 16h mov ax,4C00h int 21h tablica: times 10 db 0 a db 1100001b,'$' b db 10000001b,'$ 1.Dlaczego jak wpisuje do rejestru bx+1 lub bx+2 aż do bx+4 zmienną a lub b pokazuje mi śmieci zamiast tego co pod nią się znajduje, zacząć mogę dopiero od bx+5 tak jak wyżej ? 2.Dlaczego pomiędzy wpisywaniem zmiennych do tablicy pod adresy bx+5 czy tez bx+7 itp. muszą być od siebie w odstepie 2 bo inaczej zamiast zmiennych na pulpicie widzie śmieci ? 3.Litera 'a' w kodzie ascii ma wartość szesnastkowo 61 binarnie 1100001 czyli jest 7 bitowa pomijając uzupelnienie liczby do 8 bitów dlaczego znajduje sie w odległości 2 bajtów w tablicy skoro tablica jest zainicjonowana na 10 bajtów rownych 0 ? 4.Wpisując do tablicy np: 255 bajtowej, zmienną składającą sie z 8 bitów chcąc ją wpisać pod 10 bajt użyjemy operacji np: [bx+9] gdzie do rejestru bx zostala przypisana tablica ale czy można zapisać to w sposób [bx-245] przecież zadeklarowana tablica to etykieta obliczana przez linker wraz z zadeklarowaną przestrzenią czyli wpisując jakąś zmienną pod x przestrzeń to np: [tablica] jest początkiem czy końcem czyli bajtem 0 czy 255 ? 5.W jaki inny sposób mogę przedstawić sumę elementów znajdujących się w tablicach? Gdybym popelnił gape prosze o wyrozumiałość.
Re: Tablica
Author: Michoo
Date: Thu, 17 Jun 2010 09:05
Date: Thu, 17 Jun 2010 09:05
56 lines
3274 bytes
3274 bytes
przemo12146 pisze: > Cześć, > Jestem początkujący mam kilka pytań do mojego kodu: Co to jest - TASM, czy jakiś inny staroć? > > 1.Dlaczego jak wpisuje do rejestru bx+1 lub bx+2 aż do bx+4 zmienną a > lub b pokazuje mi śmieci zamiast tego co pod nią się znajduje, zacząć > mogę dopiero od bx+5 tak jak wyżej ? Nie miałem kontaktu z asm pod dosem dobre 5 lat, ale stara ściąga mówi, że to, że to działa to jakiś cud - używasz 09h, które wypisuje string, a ładujesz do rejestru dx znak, a nie wskaźnik (jakbyś chciał użyć 02h) > > 2.Dlaczego pomiędzy wpisywaniem zmiennych do tablicy pod adresy bx+5 > czy tez bx+7 itp. muszą być od siebie w odstepie 2 bo inaczej zamiast > zmiennych na pulpicie widzie śmieci ? ax, bx mają rozmiar słowa, bajt ma rozmiar bajtu > > 3.Litera 'a' w kodzie ascii ma wartość szesnastkowo 61 binarnie > 1100001 czyli jest 7 bitowa pomijając uzupelnienie liczby do 8 bitów > dlaczego znajduje sie w odległości 2 bajtów w tablicy skoro tablica > jest zainicjonowana na 10 bajtów rownych 0 ? Co masz na myśli? > > 4.Wpisując do tablicy np: 255 bajtowej, zmienną składającą sie z 8 > bitów chcąc ją wpisać pod 10 bajt użyjemy operacji np: [bx+9] gdzie do > rejestru bx zostala przypisana tablica ale czy można zapisać to w > sposób [bx-245] przecież zadeklarowana tablica to etykieta obliczana > przez linker Z C ci się pomieszało - linker policzy [tablica+10], a nie [bx+10], bo nie zajmuje się zgadywaniem co będzie w bx. Poza tym skąd pomysł, że rejestr bx jest 8 bitowy? > wraz z zadeklarowaną przestrzenią czyli wpisując jakąś zmienną pod x > przestrzeń to np: [tablica] jest początkiem czy końcem czyli bajtem 0 > czy 255 ? Jak się chcesz odwołać do 3 pola 8 bajtowej tablicy to znacznie łatwiej jest napisać [tablica-6] niż [tablica+2], więc odpowiedź jest oczywista - końcem. > > 5.W jaki inny sposób mogę przedstawić sumę elementów znajdujących się > w tablicach? Najlepiej użyć masm'a i przedstawiać w LISTBOX/EDIT jako kolejne linijki, albo w zestawie pól STATIC. > > Gdybym popelnił gape prosze o wyrozumiałość. Wyrozumiałość wyrozumiałością, ale ty prawie nic nie wiesz. Zacznij od kursu assemblera a potem bierz się za pisanie programów - odwrotna kolejność jest długa, trudna, bolesna i frustrująca. -- Pozdrawiam Michoo
Re: Tablica
Author: przemo12146
Date: Thu, 17 Jun 2010 10:15
Date: Thu, 17 Jun 2010 10:15
4 lines
1429 bytes
1429 bytes
Dziękuje za odpowiedź. Co do kompilatora używam starej wersji MASM'a. Może znasz jakieś dobre ksiązki dla początkujących co do programowania w asemblerze?
Re: Tablica
Author: Bogdan (bogdro)
Date: Thu, 17 Jun 2010 16:19
Date: Thu, 17 Jun 2010 16:19
124 lines
5345 bytes
5345 bytes
W dniu 16.06.2010 20:38, przemo12146 pisze: > Cześć, > Jestem początkujący mam kilka pytań do mojego kodu: > > format binary > > org 100h > > poczatek: > > mov bx,tablica > mov ax,a > mov cx,b > > mov [bx+5],ax > mov [bx+7],cx > > mov dx,[bx+5] > mov ah,9h > int 21h To tak nie podziała. W DX musisz mieć adres zmiennej, którą chcesz wyświetlić, a nie wartość tej zmiennej. Najchętniej by się napisało: mov dx, bx+5 ale tak się nie da. Spróbuj mov dx, bx ; DX = BX add dx, 5 ; DX = BX + 5 (reszta dobrze - bez zmian). > mov dx,[bx+7] > mov ah,9h > int 21h Jak wyżej. > mov ah,0h > int 16h > > mov ax,4C00h > int 21h > > tablica: times 10 db 0 > a db 1100001b,'$' > b db 10000001b,'$ > > 1.Dlaczego jak wpisuje do rejestru bx+1 lub bx+2 aż do bx+4 zmienną a > lub b pokazuje mi śmieci zamiast tego co pod nią się znajduje, zacząć > mogę dopiero od bx+5 tak jak wyżej ? Prawdopodobnie dlatego, że wpisywałeś wartość zmiennej, a nie jej adres. Wpisywałeś do DX adres 2461h (dolar w starszym bajcie, wartość zmiennej 'a' w młodszym) lub 2481h (w drugim przypadku). Swoją drogą, znak w zmiennej 'b' może nie być drukowalny (więc i tak dostaniesz śmieci). > 2.Dlaczego pomiędzy wpisywaniem zmiennych do tablicy pod adresy bx+5 > czy tez bx+7 itp. muszą być od siebie w odstepie 2 bo inaczej zamiast > zmiennych na pulpicie widzie śmieci ? Być może ma to związek z problemem BX+5 vs. [BX+5]. Ale pamiętaj też, że zapisujesz całe słowo (2 bajty) - wartość zmiennej 'a' lub 'b' plus następujący po nich znak dolara, aby zakończyć napis dla DOSa. Praktyka jak najbardziej słuszna, ale stąd właśnie bierze się odległość 2 bajtów, jeśli nie chcesz zamazywać tego, co już jest. > 3.Litera 'a' w kodzie ascii ma wartość szesnastkowo 61 binarnie > 1100001 czyli jest 7 bitowa pomijając uzupelnienie liczby do 8 bitów > dlaczego znajduje sie w odległości 2 bajtów w tablicy skoro tablica > jest zainicjonowana na 10 bajtów rownych 0 ? Skąd wiesz, że w odległości 2 bajtów? Może ją tam wpisałeś, a teraz pokazałeś inny kod? Może wyświetlasz co innego, niż myślisz, np. wyświetlasz nie od początku tablicy, a od środka? Może wyświetlasz całą tablicę, bajty zerowe się po prostu nie wyświetlają, co powoduje błędną interpretację wyświetlanego wyniku? Przedstawiony kod nie świadczy o tym, co mówisz. > 4.Wpisując do tablicy np: 255 bajtowej, zmienną składającą sie z 8 > bitów chcąc ją wpisać pod 10 bajt użyjemy operacji np: [bx+9] gdzie do > rejestru bx zostala przypisana tablica ale czy można zapisać to w > sposób [bx-245] Według mnie nie można. Offsety w adresacji nie zawiną się tak, jak trzeba. Spójrz na ten wynik disasemblacji: <adres> <kod instrukcji> <instrukcja> 00000000 8A870BFF mov al,[bx-0xf5] 00000004 8A870AFF mov al,[bx-0xf6] 00000008 8A87F500 mov al,[bx+0xf5] 0000000C 8A87F600 mov al,[bx+0xf6] Jak widać, offset zrobił się 16-bitowy (4 ostatnie znaki/2 ostatnie bajty kodu instrukcji). Używając ujemnych wartości, naprawdę cofasz się przed tablicę w pamięci (czego zazwyczaj się nie robi). > przecież zadeklarowana tablica to etykieta obliczana > przez linker > wraz z zadeklarowaną przestrzenią czyli wpisując jakąś zmienną pod x > przestrzeń to np: [tablica] jest początkiem czy końcem czyli bajtem 0 > czy 255 ? Jest początkiem, tak samo jak równoważny zapis [tablica+0]. > 5.W jaki inny sposób mogę przedstawić sumę elementów znajdujących się > w tablicach? Zawęź trochę pytanie. Możesz dodawać do siebie elementy dwóch tablic i wynik wyświetlać na ekranie. Możesz, jak kolega zasugerował, wyświetlić wynik w okienku win32. Możesz zwrócić jako kod wyjścia z programu (ERRORLEVEL). Pytasz o książki? Spróbuj z moim kursikiem na http://rudy.mif.pg.gda.pl/~bogdro/. Jak Ci się nie spodoba, mam trochę linków na http://rudy.mif.pg.gda.pl/~bogdro/linki.htm. -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: Tablica
Author: przemo12146
Date: Thu, 17 Jun 2010 17:07
Date: Thu, 17 Jun 2010 17:07
1 lines
1267 bytes
1267 bytes
Jeszcze raz dziękuje chętnie skorzystam z kursu.
Re: Tablica
Author: Bernard
Date: Fri, 18 Jun 2010 15:23
Date: Fri, 18 Jun 2010 15:23
56 lines
2278 bytes
2278 bytes
On 2010-06-16 20:38, przemo12146 wrote: > Cześć, > Jestem początkujący mam kilka pytań do mojego kodu: > > format binary > > org 100h > > poczatek: > > mov bx,tablica - ładujesz dwa bajty spod adresu tablica do bx, a potem używasz ich jako adresu > mov ax,a > mov cx,b > > mov [bx+5],ax > mov [bx+7],cx > > mov dx,[bx+5] Tym razem do dx załadowałeś dawniejszą wartość zmiennej a na szczęście jeden błąd maskuje drugi i to zadziała tak, jak chciałeś. > mov ah,9h > int 21h > > mov dx,[bx+7] A teraz zmiennej b - jak wyżej. > mov ah,9h > int 21h > > mov ah,0h > int 16h > > mov ax,4C00h > int 21h > > tablica: times 10 db 0 > a db 1100001b,'$' > b db 10000001b,'$ > > 1.Dlaczego jak wpisuje do rejestru bx+1 lub bx+2 aż do bx+4 zmienną a > lub b pokazuje mi śmieci zamiast tego co pod nią się znajduje, zacząć > mogę dopiero od bx+5 tak jak wyżej ? > > 2.Dlaczego pomiędzy wpisywaniem zmiennych do tablicy pod adresy bx+5 > czy tez bx+7 itp. muszą być od siebie w odstepie 2 bo inaczej zamiast > zmiennych na pulpicie widzie śmieci ? Bo Twoje zmienne mają po 2 bajty (w każdym razie jako 2-bajtowe ładujesz je do rejestrów)
Re: Tablica
Author: identifikator: 20040501
Date: Sun, 20 Jun 2010 18:29
Date: Sun, 20 Jun 2010 18:29
7 lines
1409 bytes
1409 bytes
Dziękuje za odpowiedź. Co do kompilatora używam starej wersji MASM'a. Może znasz jakieś dobre ksiązki dla początkujących co do programowania w asemblerze? Vlad Pirogow Asembler Podręcznik Programisty - hardkor, normalnie jak Ktoś nie ćwikał standardów w DOSie to się zamęczy tą pozycją...
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads