W segmencie danych mam tak zadeklarowaną zmienną: bufor db 100, 101dup('$')
. Czego adres znajdzie się w rejestrze si
, jeśli napiszę mov si, offset bufor
? Czego adres tam będzie, jeśli napiszę potem inc si
, a czego, jeśli add si, 2
?
W si
będzie offset na którym znajduje się bufor (jego początek) w ramach segmentu w którym jest. Nie bardzo rozumiem pytanie. Gdyby ten bufor był na początku segmentu to jego offset mógłby być np. 0
. Ale to nie jest cały adres, jak nie trudno zauważyć. Adres wymaga podania w którym to jest segmencie.
Sama wartość offsetu to za mało.
Jeśli zrobisz inc si
to przesuniesz się o 1 bajt do przodu, więc dla segmentu w którym jest bufor będziesz pokazywać na drugi bajt twojego bufora. Analogicznie po add si, 2
na bajt trzeci.
@Shalom: dziękuję, ale dalej nie wiem, dlaczego ten kod działa (chyba, nie mam możliwości odpalenia go u siebie). Chodzi o wypisanie łańcucha znaków.
mov dx,offset bufor
mov ah,10
int 21h
call nowalinia
mov si,offset bufor
add si,2
mov di,si
dec di
petla:
mov dl,[si]
cmp dl,13
je dalej
inc si
jmp petla
dalej: dec si
mov ah,2
pet1: cmp si,di
je koniec
mov dl,[si]
int 21h
dec si
jmp pet1
Chodzi o wypisywanie łańcucha znaków od tyłu. Po co jest to 100
na początku? Dlaczego zwiększamy si o 2
?
Jakby ktoś ten kod napisał jak człowiek, to może dałoby się go zrozumieć. Generalnie idea jest taka że ta pierwsza pętla przesuwa się od początku, licznikiem si
, do końca bufora i szuka znaku numer 13 i jak go znajdzie to zakłada że do koniec stringa. Następnie leci druga pętla, która dekrementuje si
czyli przesuwa się od końca bufora i przerywa kiedy si == di
, czyli kiedy dojdzie do początku.
Nie wiem czemu w tym kodzie z jakiegoś powodu pomijany jest pierwszy znak stringa.
@Shalom: dziękuję, właśnie też nie rozumiałem, dlaczego pierwszy znak jest pomijany. Teraz wiem, że to po prostu czyjś błąd.