Pascal czy Assembler?

0

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

3

Za bardzo nie chciało Ci się przyłożyć do zadania pytania, więc tylko się domyślam, o co pytasz :P

Podejrzewam, że sie zastanawiasz, czy podany kod jest w Pascalu, czy w Assemblerze. Jeśli rzeczywiście o to Ci chodziło, to odpowiadam: to jest Pascal, który zawiera wstawkę assemblera.

Zwróć uwagę na fragment

writeln('Przykładowy tekst: ALA MA KOTA');
asm
mov cx, 0h

W drugiej linii jest słowo kluczowe asm, które rozpoczyna blok pisany w Assemblerze. Poczytać o tym wynalazku możesz tutaj https://pl.wikibooks.org/wiki/Object_Pascal/Wstawki_w_asemblerze oraz tutaj https://wiki.freepascal.org/Asm

1
  1. Popraw wciecia
  2. zmien nazwy petli na wiecej znaczace
  3. zrób stała z "11"
0
  1. Zmień identyfikatory z polskich na angielskie.
  2. Kod pisany w Pascalu powinien być zgodny z przyjętą konwencją nazewnictwa i ze stylem jego formatowania.
2

Postanowiłem poduczyć się trochę assemblera i jest to mój pierwszy początkowy programik [...] . Czy takie zaczęcie uczenia się assemblera ma sens

Moim zdaniem obecnie, jeśli nie masz konkretnych powodów, dla których byś miał się uczyć asemblera, to jest to zupełna strata czasu. Jedynie w kilku niszowych zastosowaniach taka wiedza by mogła się Tobie przydać, poza tym jest to sztuka dla sztuki. Kod masz mocno rozciąganiety, bo coś, co w języku wysokiego poziomu zajmie jedną linie, w asm potrzebuje dwóch ekranów. Do tego kod jest znacznie mniej czytelny i trudniej się go pisze. Zysk na wydajności, który miał znaczenie w czasach komputerów 386, w dobie 4-rdzeniowych procków @3GHz jest nieodczuwalny.

Aktualnie jest tendencja do stosowania języków wysokiego poziomu, gotowych bibliotek, modułów, komponentów, frameworków, programowania obiektowego itp. Nawet, jak się nauczysz asm, to masz nikłe szansę, że gdzieś ci się do czegoś przyda. Lepiej ten czas poświęcić na naukę czegoś bardziej perspektywicznego.

1
    mov cx, 0h
    mov cx, seg tekst

Dwa razy zapisujesz wartość do tego samego rejestru. Pierwsza instrukcja jest bezcelowa.

    mov ds, cx

Wydaje mi się, że ds jest prawidłowo zainicjalizowane i nie trzeba tego robić, ale mogę się mylić.

    mov di, si
    mov cx, 0Bh
    @petla:
          mov ah, 08h
          int 21h
          mov ds:[di], al

ile według ciebie wynosi al i dlaczego?

0
program Zadanie1;
uses Crt;
const
     n = 27;
var
   tekst: array[1..n] of char;
   i: integer;
begin
     ClrScr;
     writeln('Wersja numer dwa :)');
     { ALA MA KOTA, ALA MA KOTA :) }
     asm
        mov cx, 0h
        mov cx, seg tekst
        mov si, offset tekst
        mov ds, cx
        mov di, si
        mov cx, n
        @petla:
              mov ah, 08h
              int 21h
              mov dl, al
              mov ah, 02h
              int 21h
              mov ds:[di], dl
              add di, 1
        loop @petla
     end;
     writeln;
     writeln('-------------------Sprawdzenie----------------');
     for i := 1 to n do
        write(tekst[i])
end.

O to program wpisujący znaki do tablicy typu char :). Jeśli będziecie mieli jakieś sugestie to chętnie się z nimi zapoznam :).

0

W ASM z tego co ja się orientuję pętli się nie wcina, czyli raczej:

     asm
        mov cx, 0h
        mov cx, seg tekst
        mov si, offset tekst
        mov ds, cx
        mov di, si
        mov cx, n
     @petla:
        mov ah, 08h
        int 21h
        mov dl, al
        mov ah, 02h
        int 21h
        mov ds:[di], dl
        add di, 1
        loop @petla
1

Jeśli będziesz kiedyś pisał więcej kodu w asmie to nie używaj instrukcji loop, bo jest wolna --> https://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it-efficiently. (chyba że optymalizujesz kod pod względem rozmiaru a nie czasu wykonania) Zamiast tego używaj konstrukcji cmp + conditional jump jcc. Ewentualnie zamiast cmp możesz używać test kiedy porównujesz daną wartość z zerem.

1

Moje uwagi w komentarzach, jest tam też opisane co się dzieje przy wywoływaniu przerwania.

program Zadanie1;
uses Crt;
const
  n = 27;
var
  tekst: array[1..n] of char;
  i: integer;
begin
  ClrScr;
  writeln('Wersja numer dwa :)');
  { ALA MA KOTA, ALA MA KOTA :) }
  asm
    {mov cx, 0h} {calkiem niepotrzebne}
    mov cx, seg tekst
    mov si, offset tekst
    mov ds, cx
    mov di, si
    mov cx, n
  @petla:
    {po co wywolywac 2 funkcje (odczyt i wypisanie
    znaku na ekran jak jest jedna robiaca to i to
    wiec to co w komentarzu nizej do wywalenia}
    { mov ah, 08h
    int 21h
    mov dl, al
    mov ah, 02h
    int 21h
    mov ds:[di], dl
    add di, 1}
    mov ah, 1 {funkcja nr 1 przerwania 21h czyli odczyt}
    int 21h   {znaku z klawiatury z wypisaniem na ekran}
    mov ds:[di], al  {zapis odczytanego znaku do tablicy}
    inc di {dodaje 1 do di po to aby w kolejnym obiegu petli zapisywac znak 
             jako nastepny element tablicy (zastepuje add di, 1)}
    loop @petla
  end;
  writeln;
  writeln('-------------------Sprawdzenie----------------');
  for i := 1 to n do
    write(tekst[i]);
end.
2

Ja bym na twoim miejscu sprobowal teraz napisac to samo, ale przy uzyciu funkcji z WinApi/libc w zaleznosci z jakiego systemu korzystasz. Uzywanie przerwan to wg. mnie znak minionej epoki, przydatne gdy procesor nie jest jeszcze w trybie chronionym

1

Nie widzę powodu aby to pisać w czystym WinApi wystarczy w Delphi czy FP (stosując funkcje które są nakładkami na WinApi). Tak samo jak nie widzę powodu miałby być napisany w assemblerze poza jednym bardzo ważnym nauczyciel jest idiotą, który w tych czasach uczy stosowania wstawek assemblera w 16 bitowym Pascalu.

0

Czy ja wiem, asm przydatna rzecz, jednak jeśli OP będzie chciał dalej się rozwijać w tym kierunku to polecam przenieść się na coś 32 bitowego, a tam już sobie nie poprzerywa :)

0

asm przydatna rzecz

@FL4RE - a tak właściwie to do czego? Chodzi mi oczywiście o "typowe" zastosowania, takie jak jakaś apka desktopowa, stronka w React czy baza w SQL :P

1
cerrato napisał(a):

asm przydatna rzecz

@FL4RE - a tak właściwie to do czego? Chodzi mi oczywiście o "typowe" zastosowania, takie jak jakaś apka desktopowa, stronka w React czy baza w SQL :P

Do robienia programów rozruchowych :D . A tak na poważnie: do optymalizacji.

0

No co wy Panowie, a taki pentester czy badacz bezpieczeństwa czy nawet pospolity cracker to bez asma sie nie obejdzie.
Sam najbardziej skorzystałem na tej znajomości pisząc cheaty do gierek

0

Oczywiście masz rację, ale nadal jest to nisza. @cerrato pytał o typowe rozwiązania, a w takich rozwiązaniach jak apki desktopowe, a już tym bardziej webowe Asm nie jest przydatny w dzisiejszych czasach. Co do security to Asm jest świetnym narzędziem - sam często korzystam ;)

3

Czy wszystko na tym forum musi być mainstreamowe, nowe i przynoszące zarobek? Czasami ktoś może chcieć napisać coś pod starą czy niszową platformę.

0

Oczywiście, że może się bawić assemblerem w ramach pasji/hobby/pracy w jakiejś niszy, ale polecanie komuś asm w kontekście przyszłej pracy jest zwyczajnie nieetyczne i niemoralne :p

0
Azarien napisał(a):

Czy wszystko na tym forum musi być mainstreamowe, nowe i przynoszące zarobek?

Też mnie wnerwia takie gadanie. Wiadome, że nie wszystkie technologie nadają się w tym momencie do robienia kariery, jednak masa ludzi programuje z innego powodu niż dla pieniędzy.

cerrato napisał(a):

Oczywiście, że może się bawić assemblerem w ramach pasji/hobby/pracy w jakiejś niszy, ale polecanie komuś asm w kontekście przyszłej pracy jest zwyczajnie nieetyczne i niemoralne :p

Nie przesadzaj – systemy wbudowane to nie nisza, a język bardzo się przydaje. Nie wszystko stoi na Arduino. ;)

0

systemy wbudowane to nie nisza

No jednak tak. Zobacz, ile jest wątków o Java, C#, webmastering, Pythonie, PHP czy nawet tym nieszczęsnym Delphi ;) A ile wątków jest o programowaniu kontrolerów (i to niekoniecznie w assemblerze)? Oczywiście, sama liczba postów nie jest ostatecznym wyznacznikiem, ale jednak o czymś świadczy. Sam osobiście znam wiele osób, które robią desktopach czy web, ale chyba nikogo, kto na poważnie siedzi w kontrolerach.

Moim zdaniem jest to bardzo niszowa działka, a to co napisałem wcześniej (że w 99% przypadków asm się do niczego nie przyda) jest prawdziwe.

1
PerlMonk napisał(a):

Do robienia programów rozruchowych :D . A tak na poważnie: do optymalizacji.

Jak kiedyś coś zoptymalizujesz asmem i nie będzie to sztuka dla sztuki to opisz - bo będzie to niezła ciekawostka.
Plus, trzeba będzie twórców jakiegoś kompilatora ochrzanić, bo zrypali (fakt, że bywa).

A ten programik to straszna brydza - jest rok 2019, a tam:
uses crt
int 21h

Sorry, ale w końcówce lat 90tych to już był obciach.
Coś bardziej praktycznego dla asm;
http://www.int80h.org

Btw. sam czasem drapne coś małego w asm na C64. Ale nie służy to absolutnie niczemu.
To nie połowa 20 wieku, asm z programowaniem nie ma wiele wspólnego. Fajne do zabawy, akcji więcej niż w grach typu Battlefield (tylko bywa bardziej brutalny).

0

Warto znać asma – można pisać gry na NES-a i inne stare konsole. To dopiero nisza. :P

0
jarekr000000 napisał(a):
PerlMonk napisał(a):

Do robienia programów rozruchowych :D . A tak na poważnie: do optymalizacji.

Jak kiedyś coś zoptymalizujesz asmem i nie będzie to sztuka dla sztuki to opisz - bo będzie to niezła ciekawostka.
Plus, trzeba będzie twórców jakiegoś kompilatora ochrzanić, bo zrypali (fakt, że bywa).

Ale wiesz że te kompilatory też ludzie piszą, i to - uwaga - często znający asembler?

Ale nie służy to absolutnie niczemu.

Jak już napisałem – nie musi czemuś „służyć”.

4

Znajomość ASM przydaje się:

  • przy pracy ze sprzętem (myślę że to nie taki mały sektor jak nam się wydaje)
  • przy optymalizacji kodu C/C++ (bez wstawek ASM lub ze wstawkami - co kto lubi)
  • przy obserwowaniu UB w C/C++ na godbolt
  • przy pisaniu swojego kompilatora albo JITa (patrz JIT dla BF)
  • przy czytaniu kodu z lat 80-tych i wcześniejszych
  • po to żeby komuś wytłumaczyć że żeby zrobić left pada nie musi zaciągać pół internetu bo kiedyś kompy miały 1 kB RAM i ludzie na nich jakoś dawali radę pracować.
0

Do tego jeszcze RE i ogólnie praca związana z malware i antywirami.

4
cerrato napisał(a):

No jednak tak. Zobacz, ile jest wątków o Java, C#, webmastering, Pythonie, PHP czy nawet tym nieszczęsnym Delphi ;) A ile wątków jest o programowaniu kontrolerów (i to niekoniecznie w assemblerze)? Oczywiście, sama liczba postów nie jest ostatecznym wyznacznikiem, ale jednak o czymś świadczy. Sam osobiście znam wiele osób, które robią desktopach czy web, ale chyba nikogo, kto na poważnie siedzi w kontrolerach.

Moim zdaniem jest to bardzo niszowa działka, a to co napisałem wcześniej (że w 99% przypadków asm się do niczego nie przyda) jest prawdziwe.

Oczywiście programistów robiących systemy wbudowane jest mniej niż pozostałych, ale nisza to nie jest.
A czemu ich za bardzo nie widać na tym forum?

  1. W sumie to oni tu są, ale jescze o tym nie wiedzą - ludzie którzy za 5 -10 lat będą robić embedded obecnie zadają podstawowe pytania przede wszystkim w dziale C/C++
  2. Ponadto mają fora bardziej poświęcone tematom hardwareu i embedded, choćby Elektroda.
  3. Większość z obecnie zajmujących się embedded nie ma potrzeby zadawać pytań w takich miejscach - systemy którymi się zajmują są tak specyficzne że wiedzy na forach internetowych na ich temat nie ma.

Prosze nie traktować tych punktów w sposób zupełnie dosłowny, odstępstwa ovczywiście się mogą zdarzać.

Osobiście pracuję w zespole rozwijającym aplikację pracującą na procesorach sygnałowych, jest to ok 40 developerów C/C++ oraz ponad drugie tyle dzięki, którym możemy efektywnie pracować i testować nasz kod (głównie ludzie piszący w pythonie i matlabie choć nie tylko).

Co prawda w asemblerze nie piszemy, bo nie ma szans abyśmy zrobili to lepiej od kompilatora (procesory są VLIW), ale aby wykorzystać to co oferuje procesor a czego nie da się wyrazić przy pomocy C/C++ konieczne jest wykorzystanie intrinsic functions.
I tu pojawia się konieczność jako takiej znajomości asemblera - oglądamy to co wypluł kompilator, nie czysty asembler ale z komentarzami kompilatora, i możemy się zorientować czy i co można jeszcze w kodzie optymalizować.

I nie, nie optymalizujemy w ten sposób każdego kawałka kodu, zasadniczo jedynie kod wykonujący DSP gdzie zysk 1 cykla na iterację pętli przekładać się może na setki czy tysiące cykli wykonania funkcji.
A prosze pamiętać, że przekroczenie budżetu czasowego nawet o kilkanaście mikrosekund może oznaczać że wykonane obliczenia będą bezwartościowe.

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