🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
7 messages
7 total messages Started by przemo12146 Wed, 16 Jun 2010 18:38
Tablica
#2272
Author: przemo12146
Date: Wed, 16 Jun 2010 18:38
60 lines
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
#2273
Author: Michoo
Date: Thu, 17 Jun 2010 09:05
56 lines
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
#2274
Author: przemo12146
Date: Thu, 17 Jun 2010 10:15
4 lines
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
#2276
Author: Bogdan (bogdro)
Date: Thu, 17 Jun 2010 16:19
124 lines
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
#2277
Author: przemo12146
Date: Thu, 17 Jun 2010 17:07
1 lines
1267 bytes
Jeszcze raz dziękuje chętnie skorzystam z kursu.
Re: Tablica
#2278
Author: Bernard
Date: Fri, 18 Jun 2010 15:23
56 lines
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
#2275
Author: identifikator: 20040501
Date: Sun, 20 Jun 2010 18:29
7 lines
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