Pascal czy Assembler?

Odpowiedz Nowy wątek
2019-07-23 13:52
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


Nieoszlifowany diament
edytowany 14x, ostatnio: furious programming, 2019-07-27 01:14

Pozostało 580 znaków

2019-07-23 14:08
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[...]t_Pascal/Wstawki_w_asemblerze oraz tutaj https://wiki.freepascal.org/Asm


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-07-23 14:10
1

1) Popraw wciecia
2) zmien nazwy petli na wiecej znaczace
3) zrób stała z "11"


Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2019-07-23 14:11

Pozostało 580 znaków

2019-07-23 15:46
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.

edytowany 1x, ostatnio: furious programming, 2019-07-23 15:46

Pozostało 580 znaków

2019-07-23 21:48
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-07-23 22:22
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?

edytowany 1x, ostatnio: Azarien, 2019-07-23 22:22
Rejestral to wyjście przerwania 21h(o ile wywołujemy funkcje która coś zwraca) Przy wywołaniu tego przerwania z numerem funkcji (rejestr ah) 08h na wyjściu czyli w al jest odczytany znak. Jeżeli chodzi o optymalizację tam niepotrzebne inkrementuje di instrukcją add di, 1a przecież inc di można zrobić to samo. Dawno nie bawiłem się asmem ale coś mi się przypomina, że zerowanie rejestru przez xor też jest szybsze od mov ale tu nie chodzi o szybkość. - kAzek 2019-07-24 02:12

Pozostało 580 znaków

2019-07-24 15:02
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 :).


Nieoszlifowany diament
@Shizzer: na temat odpowiadaj w postach. - furious programming 2019-07-24 15:56

Pozostało 580 znaków

2019-07-24 15:09
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

Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2019-07-24 15:11

Pozostało 580 znaków

2019-07-24 16:11
1

Jeśli będziesz kiedyś pisał więcej kodu w asmie to nie używaj instrukcji loop, bo jest wolna --> https://stackoverflow.com/que[...]ve-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.


Pozostało 580 znaków

2019-07-24 21:03
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.

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2019-07-24 21:18

Pozostało 580 znaków

2019-07-25 08:56
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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