Jak działa offset w asm

0

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?

0

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.

0

@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
0

Chodzi o wypisywanie łańcucha znaków od tyłu. Po co jest to 100 na początku? Dlaczego zwiększamy si o 2?

0

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.

0

@Shalom: dziękuję, właśnie też nie rozumiałem, dlaczego pierwszy znak jest pomijany. Teraz wiem, że to po prostu czyjś błąd.

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