🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2276

Re: Tablica

#2276
From: 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
Technical Details
Message-ID: <hvdhum$nlt$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <dd5aa12f-284f-4e03-b29b-529270d19ecb@b35g2000yqi.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl>
Newsgroups: pl.comp.lang.asm
Subject: Re: Tablica
Date: Thu, 17 Jun 2010 18:19:31 +0200
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 124
Message-ID: <hvdhum$nlt$1@inews.gazeta.pl>
References: <dd5aa12f-284f-4e03-b29b-529270d19ecb@b35g2000yqi.googlegroups.com>
NNTP-Posting-Host: rudy.mif.pg.gda.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1276791579 24253 153.19.42.16 (17 Jun 2010 16:19:39 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Thu, 17 Jun 2010 16:19:39 +0000 (UTC)
X-User: bog.d
In-Reply-To: <dd5aa12f-284f-4e03-b29b-529270d19ecb@b35g2000yqi.googlegroups.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit