Parę pytań o podstawy Asemblera

0

Dzień dobry!
Mam kilka pytań odnośnie asemblera (16-bitowy NASM na DOSa)

Chodzi o deklaracje poniższych dwóch 'zmienych':

dlugosc	db		5
tekst:		times 	22 	db	'$'

Czy dwukropek po zmiennej tekst coś zmienia?
O co chodzi z times 22?
Czy 5 oznacza ilość bajtów w zmiennej dlugosc?

1
dlugosc db      5

dlugosc to nazwa, db to defined byte czyli jeden bajt, a 5 to wartość czyli tam będzie 0x05.

tekst:      times   22  db  '$'

tekst: to etykieta, czyli offset do miejsca tego, potem wszędzie gdzie użyjesz tekst zostanie wpisany offset miejsca od początku kodu.
times oznacza, że 22 razy zdefiniuj po jednym bajcie db o wartości ascii '$' dolara

0

Ok, dzięki

A co oznacza taka instrukcja?

mov		byte [tekst+bx+1], '$'

gdzie tekst jest tym labelem, który wkleiłem wyżej.
Z tego co wiem [nazwa] odnosi się do wartości, na którą wskazuje adres zapisany w zmiennej nazwa. Co oznacza 'byte'? Jakieś rzutowanie?

1

Tak to będzie działało tak, zapisz bajt '$' w miejsce gdzie jest zdeklarowana etykieta tekst na bajcie przesuniętym + bx + 1 bajtów.

Jak zapisujesz byte to wpisze '$', czyli 0x24, a jakbyś miał dword, to by było 0x00000024, czyli 4 bajty i byś nadpisał inne bajty, dlatego bajt, bo w tekstach zwykle się na bajtach operuje, bo jeden bajt w ascii to jeden znak.

0

Dziekuję pięknie za pomoc Szalony Karpie Wielkanocny :)

Mam jednak kolejne pytango

mov		ah, 0ah 
mov		dx, bufer
int		21h

xor		bx, bx 
mov		bl, [dlugosc]	;tutej

bufer	db		20
dlugosc	db		0

; zakonczenie programu

I nie wiem jakim cudem, ale w miejscu gdzie napisałem tutej w rejestrze bl mam liczbę znaków, które wpisałem w przerwaniu 0ah z 21h, które zostały wrzucone do zmiennej bufer. Tzn. jak wpisałem abcdef, to bl ma wartość 6. Jak? :O

0

Znalazłem na necie bo sam nigdy na dosie nie robiłem.

"After the interrupt, BYTE [Buffer + 1] will contain the number of characters read, and the characters themselves will start at Buffer + 2."

Tak za bufforem + 1 czyli odczytane, zostanie wypełnione odczytanymi znakami, a potem robisz mov bl, [odczytane] czyli przypisujesz to co odczytało do rejestru bl.

0

Czekaj, powoli
Odpalam program, wpisuję np 'abcdefg'. Ten tekst przypisuje mi się do zmiennej bufor. Natomiast w [dlugosc] mam liczbę 7, czyli tyle ile wprowadziłem znaków.
W pierwszym bajcie w buforze jest zapisana ilość znaków.
Jednakże jakim prawem zmienna dlugosc wskazuje na tą ilość znaków?

0

tak wygląda program binarnie

buffor:
0x14 // 20 - 1bajt
0x0 // drugi bajt to jest bajt od ilości znaków.
0x0 // tu nie wiadomo co jest trzeci bajt

dajesz adres buffora do przerwania.
A on buffor + 1 bajt czyli na drugim bajcie tym od dlugosci wpisuje ile znaków odczytał.
A buffor +2 pod tym ile odczytał wpisuje odczytane bajty i na końcu znak karetki.

0

No ok, rozumiem to.
Ale jak zmienna dlugosc wskazuje na ten bajt z ilością znaków (drugi bajt z bufora)?

0

Bo one leżą koło siebie

O tak 0001 0000 0000 0000

buffor wskazuje na (tutaj)0001 0000 (tutaj wskazuje dlugosc) 0000 0000

buffor + 1 to jest to samo co dlugosc, a dlugosc -1 == buffor :) jeden bajt do przodu/ do tylu.

0

Aaaaa, to tyle oznacz ten cały define byte :D Aby się upewnić:

0000 0000 0000 0000
bufor     dlugosc

Dobrze mówię?

Czyli gdybym ustawił bufor na DW to wówczas wskaźnik dlugosc byłby przesunięty o jeden bajt dalej?

A co jeśli zrobię takie coś?

zmienna1 db "dlugi test ble ble $"
zmienna2 db "kolejny tekst $"
zmienna3 db 0

To wówczas zmienna1 wskazuje na literkę d z napisu "dlugi tekst ble ble", a zmienna2 na literkę k z napisu "kolejny tekst".?
Na co będzie wskazywać zmienna3? Na bajt po obu tekstach?

0

akurat db jest dosyć elastyczne, kompilator nasma zamienia to sobie.

jak zrobisz zmienna
asdf db 0
to zdeklarujesz 1 bajta
asdf db 'ab'
zdeklarujesz dwa bajty
ogólnie to db można używać do deklaracji stringów, czyli łancuchów znaków.
asdf+0 = a
asdf+1 = b
Jeśli będziesz czytał po bajcie, bo jak przeczytasz jako word słowo
To otrzymasz ab jako liczbę czyli 0x61 = a, 0x62 = b, czyli rejestr bx będzie miał 0x6161 wartość itp.

0

I ostatnie (prawdopodobnie) pytanie - jak odczytać klawisz F10?
Otóż chciałbym, aby program zakończył się po naciśnięciu klawisza F10

0

Ktoś coś? Głowię się nad tym drugi trzeci dzień i nic nie mogę wykombinować.
Wiem tyle, że tak jak by klawisz F10 jest przechwytywany jako 00 44 (hex)

1 użytkowników online, w tym zalogowanych: 0, gości: 1