Cześć. Proszę nie przenosić nigdzie tego wątku, bo tutaj podejrzewam wiecej osób spojrzy. A rozwiązanie jest pewnie banalne, ale ja go nie znam. I dlatego, jak rzadko się mi to zdarza, muszę popytać. Problem dotyczy dosowego TSR'a uruchamianego pod DosBOX'em.
Wcześniej wygooglowałem taki kod i on działa ok:
model small
.386
.data
greeting db 'Hello There!'
greeting_len = ($-greeting)
.code
main PROC
mov ax,@data
mov ds,ax
mov ecx,greeting_len
lea si, greeting
start_loop:
mov dl, [si]
inc si
mov ah,6
int 21h
loop start_loop
mov ah,4ch
int 21h
main ENDP
END main
Jednak ja chciałbym w swoim TSR'ze działającym na przerwaniu 16h przepisać zawartość zmiennej po znaku do pamięci. Normalnie robiłem tak, że porównywałem co trzeba. Oto wycinek:
mov esi,6E8BCh
cmp byte ptr ds:[si+0],56h
je Step1
jmp MagicPatch
Step1:
cmp byte ptr ds:[si+1],49h
je Step2
jmp MagicPatch
Step2:
cmp byte ptr ds:[si+2],4Bh
je Step3
jmp MagicPatch
Step3:
mov byte ptr ds:[si+00],50h
mov byte ptr ds:[si+01],52h
mov byte ptr ds:[si+02],45h
Jednak takich bajtów po mov
jest mnóstwo i chciałem to sobie uprościć stosując zmienne z tekstem i wpisać w ten sposób do pamięci po jednym znaku w kolejne miejsca. Kombinuję tak, jak poniżej. Ale gra, w której pamięci kombinuje z takim kodem się wiesza. Bez niego jest ok. Prosiłbym o podpowiedź jak to poprawić. Wycinek kodu:
mov ebx, 6E8BCh
greeting db 'OLESIO'
greeting_len = ($-greeting)
mov ecx, greeting_len
lea si, greeting
start_loop:
mov dl, [si]
mov byte ptr ds:[ebx], dl
inc si
inc bx
loop start_loop
Użyłem innych rejestrów, bo gdzieś musiałem dodatkowo wcisnąć adres początkowy do zmiany. Jak to zrobić żeby działalo bez zawieszania, bo kompiluje się bez warningów czy errorów? TSR kompilowany pod TASMem, jako plik wynikowy *.com. Z góry dziękuję za wszelkie przykłady kodu z rozwiązaniem problemu.