mov cx, 3 ;pętla wykona 3 iteracje
petla:
dec cx ;zmniejsz o 1 licznik pętli
...
cmp cx, 0 ;sprawdzamy czy cx == 0
jne petla
Dawid, żaden coder nie testuje stanu (e)cx
poprzez przyrównanie do zera, w miarę możliwości w ogóle unika się jawnego porównywania, instrukcja jecxz
dla samego skoku warunkowego, loop
jako odpowiednik wszystkich powyższych instrukcji, najlepiej zaś opierając skok warunkowy na zmianach flag po wykonanej operacji, dla tak użytego dec
byłoby to js
.
@Papec, @0DFh, nie mieszajcie kodu z danymi, chociaż dla czytelności, to naprawdę pomaga.
mov bx,bufor ;do bx adres bufora
add bx,3 ;bx wskazuje na początek znaków bufora + 1
add bx,dx ;bx wskazuje na koniec znaków bufora + 1
mov byte [bx],'$'
Tak się NIE adresuje w trybie 16 bit :| Nawet bez użycia prefiksu address-size override można to wszystko załatwić JEDNĄ instrukcją, do tego właśnie służą rejestry indeksowe i rejestr bazowy. Całość można zapisać pojedynczą instrukcją jeżeli tylko wybierze się ODPOWIEDNI rejestr do przechowywania indeksu.
mov ah, 09h ;funkcja wyświetlają napis
mov dx, Tekst ;do dx kopiujemy adres napisu
int 21h ;wywołujemy przerwanie
...
call nl ;wywołujemy podprogram wypisujący znak nowej linii
...
mov ah, 09h ;funkcja wyświetlająca napis
mov dx, bufor+2 ;dx wskazuje na początek znaków w buforze
int 21h ;wywołujemy przerwanie
call nl ;wywołujemy podprogram wypisujący znak nowej linii
...
nl:
mov ah, 09h
mov dx, nowalinia
int 21h
Można było podejść zdecydowanie lepiej: jeżeli już posługujemy się dodatkowymi funkcjami to fajnie by było zbudować sobie z nich sensowne abstrakcje, poza nową linią na pewno powinno być to wypisywanie stringa na ekran, co można uzyskać za nawet darmo. Po uwzględnieniu powyższych uwag:
org 100h
start:
mov cx, 3
main_loop:
mov dx, prompt
call print
mov ah, 0Ah
mov dx, buffer
int 21h
call print_newline
xor bx, bx
mov bl, [buffer+1]
mov byte [buffer+bx+3], '$'
mov dx, buffer+2
call print
call print_newline
loop main_loop
mov ax, 4C00h
int 21h
print_newline:
mov dx, newline
print:
mov ah, 09h
int 21h
retn
newline db 13, 10, "$"
prompt db "Podaj tekst: $"
buffer db 20
Jest różnica? Jak tak na to patrzę to chyba powinienem napisać książkę o assemblerze...