[ Pobierz całość w formacie PDF ]

" parametry przekazywane sÄ… od prawej do lewej, czyli tak jak w C.
Bogdan Drozdowski 101
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
" jeśli to jest tylko możliwe, wszystkie parametry przekazywane są przez referencję, czyli przez
wskaznik. Gdy to jest niemożliwe, przekazywane są przez wartość.
" jeśli na liście parametrów pojawia się łańcuch znakowy, to na stosie przed innymi parametrami
umieszczana jest jego długość.
" wyniki są zwracane w tych samych miejscach, co w języku C.
Na przykład, następujący kod:
REAL FUNCTION aaa (a, b, c, i)
CHARACTER a*(*)
CHARACTER b*(*)
REAL c
INTEGER i
aaa = c
END
[...]
CHARACTER x*8
CHARACTER y*5
REAL z,t
INTEGER u
t=aaa (x, y, z, u)
[...]
będzie przetłumaczony na asemblera tak (samo uruchomienie funkcji):
push 5
push 8
push u_ ; adres, czyli offset zmiennej "u"
push z_
push y_
push x_
call aaa_
(to niekoniecznie musi wyglądać tak ładnie, gdyż zmienne x, y, u i z są lokalne w funkcji MAIN__, czyli są
na stosie, więc ich adresy mogą wyglądać jak [ebp-28h] lub podobnie).
Funkcja uruchamiajÄ…ca sprzÄ…ta stos po uruchomieniu (podobnie jak w C).
Dołączać moduły można bezpośrednio z linii poleceń (w każdym razie pod Linuksem z kompilatorem
F77/G77).
Podam teraz przykład łączenia Fortrana 77 i asemblera. W oryginale użyłem narzędzi Linuksowych: NASMa
i F77, ale po minimalnych przeróbkach powinno to też działać pod Windows. Oto pliki:
; NASM - asm1fl.asm
section .text use32
global suma_
suma_:
; po wykonaniu push ebp i mov ebp, esp:
; w [ebp] znajduje siÄ™ stary EBP
; w [ebp+4] znajduje siÄ™ adres powrotny z procedury
102 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
; w [ebp+8] znajduje siÄ™ pierwszy parametr,
; w [ebp+12] znajduje siÄ™ drugi parametr
; itd.
%idefine a [ebp+8]
%idefine b [ebp+12]
push ebp
mov ebp, esp
; przypominam, że nasze parametry są w rzeczywistości
; wskaznikami do prawdziwych parametrów
mov edx, a ; EDX = wskaznik do 1-szego parametru
mov eax, [edx] ; EAX = 1-szy parametr
mov edx, b
add eax, [edx]
leave
ret
I teraz plik asmfl.f:
PROGRAM funkcja_zewnetrzna
INTEGER a,b,suma
a=1
b=2
WRITE (*,*) suma(a,b)
END
Po skompilowaniu (ewentualnie zmieniajÄ…c opcjÄ™ -f u NASMa):
nasm -f obj -o asm1fl.obj asm1fl.asm
f77 -o asmfl.exe asmfl.f asm1fl.obj
i uruchomieniu na ekranie powinna ponownie pojawić się cyfra 3.
Informacji podanych w tym dokumencie NIE należy traktować jako uniwersalnych, jedynie słusznych reguł
działających w każdej sytuacji. Aby uzyskać kompletne informacje, należy zapoznać się z dokumentacją
posiadanego kompilatora.
Poprzednia część kursu (Alt+3)
Kolejna część kursu (Alt+4)
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)
wiczenia:
Bogdan Drozdowski 103
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
1. Napisz plik asemblera, zawierający funkcję obliczania reszty z dzielenia dwóch liczb całkowitych.
Następnie, połącz ten plik z programem napisanym w dowolnym innym języku (najlepiej w C/C++,
gdyż jest najpopularniejszy) w taki sposób, by Twoją funkcję można było uruchamiać z tamtego
programu. Jeśli planujesz łączyć asemblera z C, upewnij się że Twoja funkcja działa również z
programami napisanymi w C++.
104 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
Jak pisać programy w języku asembler?
Część 11 - Pamięć jest nietrwała, czyli jak posługiwać się plikami.
Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do
najbliższego wyłączenia prądu. Dlatego trzeba je zapisywać do pliku, a potem umieć je z tego pliku odczytać.
W tej części zajmiemy się właśnie operacjami na plikach.
Do operowania na plikach posłużymy się kilkoma funkcjami przerwania 21h:
" AH = 3Ch - utworzenie pliku (wymazanie, gdy już istnieje).
W rejestrze CX podajemy atrybuty pliku (ustawiony bit 0 oznacza plik tylko do odczytu, bit 1 - czy
plik ma być ukryty, bit 2 - plik systemowy, 3 - etykieta woluminu, 4 - zawsze zero, 5 - plik
archiwalny), a DS:DX wskazuje na nazwÄ™ pliku.
UWAGA: Nazwa musi być zakończona bajtem zerowym
Niewypełnienie powyższego warunku jest przyczyną wielu błędów w programach.
W rejestrze AX otrzymujemy uchwyt do pliku (file handle) - specjalną wartość przydzielaną nam
przy otwieraniu pliku. [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ssaver.htw.pl