Witajcie
Postanowiłem poduczyć się trochę assemblera i jest to mój pierwszy początkowy programik z wykorzystaniem stawek assemblerowych. Być może sobie trochę i ułatwiłem, gdyż nic nie instalowałem na kompie a wykorzystałem jedynie kompilator pascala. W celach ćwiczeń, postanowiłem rozwiązać jakiś prosty problem w tym przypadku poruszony na forum.
Napisz program który wprowadzi z klawiatury napis(8znakow) i wyświetli go na ekranie w porządku odwrotnym.
Jestem ciekawy też waszego zdania. Czy takie zaczęcie uczenia się assemblera ma sens i czy można jakoś lepiej rozwiązać owe zadanie. W tym momencie moja wiedza i praktyka pozwalają na zrobienie owego zadania w ten sposób.
{ Ps. zamiast 8 jest 11 :). }
program Zadanie1;
uses Crt;
var
tekst: array[1..11] of char;
i: integer;
begin
ClrScr;
writeln('Napisanie i wyświetlenie tekstu na ekranie');
writeln('Zawartość tablicy TEKST typu char');
for i := 1 to 11 do
write(tekst);
writeln;
writeln('Przykładowy tekst: ALA MA KOTA');
asm
mov cx, 0h
mov cx, seg tekst
mov si, offset tekst
mov ds, cx
mov di, si
mov cx, 0Bh
@petla:
mov ah, 08h
int 21h
mov ds:[di], al
add di, 1
loop @petla
mov dx, 0h
mov cx, 0Bh
mov di, si { Wyświetlanie od końca - sub di, 1 }
@petla_dwa:
mov dl, ds:[di]
mov ah, 02h
int 21h
add di, 1 { Wyświetlanie od końca - sub di, 1 }
loop @petla_dwa
end;
writeln;
writeln('-------------------Sprawdzenie----------------');
for i := 1 to 11 do
write(tekst[i])
end.
Proszę o wasze opinie ewentualnie o jakieś drobne sugestie.
Pozdrawiam
al
to wyjście przerwania21h
(o ile wywołujemy funkcje która coś zwraca) Przy wywołaniu tego przerwania z numerem funkcji (rejestrah
)08h
na wyjściu czyli wal
jest odczytany znak. Jeżeli chodzi o optymalizację tam niepotrzebne inkrementujedi
instrukcjąadd di, 1
a przecieżinc di
można zrobić to samo. Dawno nie bawiłem się asmem ale coś mi się przypomina, że zerowanie rejestru przezxor
też jest szybsze odmov
ale tu nie chodzi o szybkość.