Turbo Assembler, szyfr cezara

0

Cześć, mam problem z napisaniem programu symulującego szyfr cezara.
W pierwszym fragmencie kodu wczytuje ciąg znaków, w następnym fragmencie chciałbym je wyświetlić wykorzystuje do tego instrukcje push i pop.
Niestety całość nie daje oczekiwanego efektu, nie udaje mi się wyświetlić tego wcześniej wczytanego ciągu.

;program - szyfr cezara


.model small
.stack 100h
.data
      napis1 db 'Program',13,10,'$'
      ;nowa_linia db 13,10,'$'

.code
start:

      mov ax, seg napis1
      mov ds, ax
      mov dx, offset napis1
      mov ah, 9 ; wyswietl ciag znakow
      int 21h

        mov cx,20
        l1:
            mov ah, 01 ; wczytaj pojedynczy znak
            int 21h 
            push ax
            cmp al, 13 ;kiedy wczytana wartosc - enter, przerwij wczytywanie
            jz koniec
        loop l1

koniec:
        mov cx, 20
        l2:
        pop bx
        mov ah,9
        mov dl, bl
        int 21h
        loop l2

        mov ah, 4ch
        int 21h

end start
end
0

@user-SEC:
Dodaj do kodu komentarze bo podajesz przykład w technologii sprzed 30 lat i raczej mało kto pamięta co dokładnie robi przerwanie int21 w zależności od wartości rejestrów albo dlaczego warunek na wartość 13... Nigdzie też nie widzę dodawania ani odejmowania więc algorytm chyba jest mocno niekompletny.

0

@katakrowa: Uzupełniłem komentarze, sama pętla wczytywania znaków działa, coś jest nie tak z pętlą wyświetlającą potem te znaki

1

w następnym fragmencie chciałbym je wyświetlić wykorzystuje do tego instrukcje push i pop.

W jaki sposób i co chcesz wyświetlić za pomocą instukcji push i pop?
Czy w ogóle wiesz na czym polega szyfr cezara? No i tak właściwie co ma robić Twój program?

0

Wiem na czym polega szyfr cezara, na razie staram się poradzić z problemem wczytania danych od użytkownika i następnie wypisaniu ich, później będę myślał nad przesunięciem.
Więc chciałbym, żeby wczytany za pomocą przerwania ciąg znaków wrzucić na stos, a następnie go zdjąć i wyświetlić

0

To na początek zapoznaj się jak działają funkcje przerwania 0x21: http://bogdro.evai.pl/dos/dos_int.htm
Po co na stos wrzucasz cały AX skoro kod znaku masz w AL?
Do wyświetlenia pojedynczych znaków jest funkcja ah = 2 a nie 9. Ah=9 wymaga znaku dolara na końcu.

0

Z tego co wiem nie mozna używając instrukcji push wrzucić na stos rejestru mniejszego niż 16 bitowy

1

@user-SEC: być może, już nie pamiętam takich detali.
W takim razie Twój program będzie mógł szyfrować góra 128 znaków. Zapamiętywanie danych na stosie to średni pomysł chyba, że zwiększysz stos.

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