198
7. Wybrane techniki programowania
CLD
PI: MOVSB
; modyfikacja adresu źródła
; następny bajt
INC SI INC SI INC SI LOOP PI
W dotychczasowych przykładach rozkazów łańcuchowych z przedrostkiem (wielokrotnych) był wykorzystywany przedrostek REP powodujący wykonanie rozkazu wielokrotnego, kończącego się z chwilą wyzerowania rejestru CX. Zastosowanie przedrostków REPE/REPZ/REPNE/REPNZ umożliwia dodatkowe testowanie znacznika ZF i uzależnienie zakończenia wykonywania rozkazu od jego stanu.
• Przykład przeszukiwania tablicy TAB10 począwszy od jej końca (tzn. większych adresów) do chwili napotkania bajtu zawierającego kod różny od kodu spacji (20H)
MOV CX, S1ZE TAB 10
STD ; przeszukiwanie od końca
MOV AL, 20H ; szukany wzorzec
LES DI, TAB_10_ADRES
ADD DI, (LENGTH TAB_10)-1 ; adres ostatniego bajtu
REPNE SCASB JZ ZNALEZIONO
JMP NIE ZNALEZIONO <
• Czasem zachodzi potrzeba znalezienia wzorca składającego się z kilku bajtów (znaków), np. czterech. Jeżeli w przeszukiwanej (tym razem od początku) tablicy znaki te są umieszczone kolejno jeden pod drugim, to program może mieć postać
; przeszukiwanie od poczÄ…tku
; kod dwóch pierwszych znaków ; kod kolejnych dwóch znaków
♦
MOV CX, LENGTH TAB J1 CLD
MOV DI, SEG TAB ll MOV ES, DI
MOV DI, OFFSET TAB ll PI: MOV AX, ZNAKI12
REPNE SCASW JNZ NIE ZNALEZIONO P2: MOV DX, ZNAKI 3_4
CMP WORD PTR ES:[DI], DX JNZ PI
• Podprogram zamieniający w tekście wszystkie przecinki na spacje
; adres początku tekstu jest przekazywany do pod-; programu przez stos, długość tekstu ; natomiast przez rejestr CX
powered by
7.3. Przetwarzanie łańcuchów (tablic)
STOS
STOS
PROGRAM
ZAMIEŃ
PORÓWNAJ:
KONIEC:
ZAMIEŃ
PROGRAM
SEGMENT STACK -
DW 10 DUP ?
ENDS
SEGMENT
; kierunek
; adres tekstu
; koniec tekstu!
; zamiana
; odtworzenie ; stanu rejestrów
ASSUME CS:PROGRAM, SS:STOS PROC FAR PUSH BP MOV BP, SP PUSH AX PUSH CX PUSH ES PUSH DI PUSHF CLD
MOV AL, V
LES DI, DWORD PTR [BP + 6]
REPNE SCASB JCXZ KONIEC
MOV BYTE PTR ES:[DI-1], 20H JMP PORÓWNAJ POPF POP Dl POP ES POP CX POP AX POP BP
RET 4 ; powrót do podprogramu
; wywołującego i zwolnienie ENDP ; obszaru przeznaczonego
ENDS ; na parametry wywołania ♦