Przedmiot: SYSTEMY INFORMATYCZNE W BANKOWOŚCI
Transkrypt
Przedmiot: SYSTEMY INFORMATYCZNE W BANKOWOŚCI
Przedmiot : Programowanie w języku wewnętrznym str. 1. Ćwiczenie nr 4 1. Użycie Asemblera. Polecenie JMP. Polecenie nakazuje procesorowi wykonywanie kodu programu od nowego innego miejsca. Miejsce to jest identyfikowane poprze etykietę, która na etapie kompilacji jest przekształcane przez asembler na postać adresu. Jeżeli skok jest wykonywany do etykiety w obrębie aktualnego segmentu to przesunięcie etykiety jest ładowane do rejestru IP. Natomiast w przypadku skoku do innego segmentu także adres tego segmentu jest umieszczany w rejestrze CX. Formaty polecenia JMP : JMP SHORT miejsce_docelowe JMP NEAR PTR miejsce_docelowe JMP FAR PTR miejsce_docelowe Polecenie JMP umożliwia skok do etykiety w aktualnej procedurze, skok do innej procedury, do iinego segmentu, do adresu poza aktualnym programem oraz do dowolnego adresu w pamięci RAM i ROM. Przykłady użycia polecenia JMP : jmp K1 : near - miejsce docelowe w aktualnym segmencie jmp near ptr K1 : near - miejsce docelowe w aktualnym segmencie jmp short K2 : short – skok do miejsca w zakresie od -128 do 127 bajtów jmp far ptr K3 : far - skok do innego programu Opis operatorów polecenia JMP : short – skok do etykiety w zakresie od -128 do 127 bajtów od adresu kolejnego rozkazu. Do rejestru IP jest dodawana 8-bitowa wartość przemieszczenia. near ptr – skok do etykiety w dowolnym miejscu aktu1alnego segmentu kodu. W rejestrze IP umieszczana jest 16-bitowa wartość przemieszczenia. far ptr – skok do etykiety w inny segmencie. Adres segmentu etykiety umieszczany jest w rejestrze CS, a jej przesunięcie w rejestrze IP. Polecenie LOOP. Polecenie to jest prostym sposobem wykonywania określonego bloku kodu wiele razy. Rejestr CX jest używany jako licznik, który jest zmniejszany przy każdym wykonaniu pętli. „Loop” odejmuje wartość „1” z rejestru CX, jeżeli CX jest jest większy od zera, to sterowanie jest przekazywane do miejsca docelowego. mov cx, 5 start: ... loop start Po osiągnięciu przez licznik wartości „0” skok nie jest wykonywany i wykonywany jest dalszy kod programu. Znacznik „Zero” nie jest zmieniany pomimo pomimo osiągnięcia przez CX wartości „0”. Przykład 1. Program zlicza do 5 inkrementując rejestr AX. mov ax, 0 mov cx, 5 petla : inc ax 1 : ustawienie AX na 0 : ustawienie licznika pętli : inkrementacja rejestru AX loop petla Przykład 2. Program drukuje na ekranie znak „*” mov cx, 2*10 petla : mov ah, 2 mov dl, '*' int 21h loop petla Przykład 3. : powtarzanie inkrementacji do momentu osiągnięcia przez CX wartości „0” str. 2. : ustawienie licznika : funkcja Dos wyświetlająca znak : wyświetlanie znaku „*” : wywołanie Dos Zmiana licznika pętli. Zmiana licznika pętli w trakcie wykonywania pętli nie jest dobrą techniką programowania. Może to doprowadzić do sytuacji w której licznik nigdy nie osiągnie wartości „0” przez co pętla nigdy się nie skończy. Modyfikacja licznika pętli w językach wysokiego poziomu nie jest możliwa, ponieważ wewnętrzny rejestr nie jest dostępny dla programisty. mov ah, 2 mov cx, 2*5 mov dl, '+' petla : int 21h inc cx loop petla : funkcja Dos wyświetlająca znak : ustawienie licznika : wyświetlanie znaku „+” : wywołanie Dos : dodanie 1 do CX !!! 2. Usuwanie błędów w Asemblerze. Około 20% czasu jest poświęcone na tworzenie kodu, a 80% czasu na usuwanie popełnionych w kodzie błędów. Usuwanie błędów w aplikacjach jest niezwykle cenną umiejętnością. W przypadku wystąpienia błędu asembler wyświetla komunikat zawierający nazwę programu źródłowego, numer wiersza z pliku źródłowego. Błędy w programie – Przykład 1. title Przykład błędów .model small .stack 100h .code main proc mov ax, 4C00h int 21h end main. Wprowadź powyższy przykład, dokonaj kompilacji i popraw błędy w programie. Jako pomoc użyj analizy programu z pkt. 3. Błędy w programie – Przykład 2. title Przykład błędów .model small .stack 100h .code main proc mov ax, @data 2 mov ds, ax mov ax, value1 mov ah, value2 mov ax, 4C00h int 21h main endp .data value1 db value2 dw end main str. 3. 0Ah 1000h Standardowe dyrektywy asemblera : Dyrektywa Opis end oznacza koniec asemblowania programu endp oznacza koniec procedury page oznacza ustawienie formatu strony dla pliku wydruku proc oznacza początek procedury title oznacza tytuł pliku wydruku .code oznacza początek segmentu kodu .data oznacza początek segmentu danych .model oznacza ustawienie modelu pamięci .stack oznacza ustawienie wielkości segmentu stosu Dyrektywy alokacji danych - są używane do zarezerwowania miejsca w pamięci na podstawie zdefiniowanych typów danych : Mnemonik Opis Bajty Atrybut DB Definiuje bajt 1 Bajt DW Definiuje słowo 2 Słowo DD Definiuje dwusłowo 4 Dwusłowo DF, DP Definiuje odległy wskaźnik 6 Odległy wskaźnik DQ Definiuje słowo poczwórne 8 Słowo poczwórne DT Definiuje dziesięć bajtów 10 Dziesięć bajtów 3. Przykładowy program w języku Asemblera i jego analiza. Program Hello World : title Program Hello World ( hello.asm ) .model small .stack 100h .data message db „Hello World” , 0dh, 0ah, '$' .code main proc mov ax,@data mov ds, ax mov ah, 9 3 mov dx, offset message int 21h mov ax, 4C00h int 21h main endp end main Powyższy program wyświetla na ekranie napis „Hello World”. Występują tu najważniejsze składniki programu napisanego w asemblerze. Powyższy kod jest napisany w asemblerze i musi być skompilowany do kodu maszynowego przed uruchomieniem. Program jest zgodny z asemblerami Borlanda i Microsoftu. – .model small – dyrektywa informuje iż program wykorzystuje strukturę pamięci, w ramach której na dane i kod przeznaczono po 64 kB pamięci. – .stack - dyrektywa rezerwuje dla programu 100h ( 256 ) bajtów na stosie – .data – dyrektywa oznacza początek segmentu danych, w którym przechowywane są zmienne. W ramach deklaracji komunikatu message asembler rezerwuje pamięć dla ciągu „Hello World” oraz dwa bajty znaków nowego wiersza ( 0dh, 0ah ). Symbol $ jest wymaganym znakiem terminacji ciągu dla określonej podprocedury wyjściowej DOS. – .code – dyrektywa oznacza początek segmentu kodu. – proc – dyrektywa oznacza początek procedury o nazwie „main” – pierwsze dwa polecenia głównej procedury oznaczają, że segment danych (@data) zostanie skopiowany do rejestru DS. – kolejna część „main” jest odpowiedzialna za umieszczenie ciągu znaków na ekranie. Odbywa się to poprzez wywołanie funkcji DOS wyświetlającej ciąg, którego adres jest w rejestrze DX. Numer funkcji jest umieszczany w rejestrze AH. – ostatnie dwie instrukcje głównej procedury ( mov ax,4C00h i int 21h ) powodują zatrzymanie programu i przekazanie sterowania do systemu operacyjnego. Microsoft Asembler zawiera program ML.EXE. Asembluje on i konsoliduje jeden lub więcej plików źródłowych w języku asembler. Składnia ML.EXE : ML opcje nazwa_pliku.asm Przykłady asemblowania i konsolidowania z różnymi opcjami : ML /Zi hello.asm ; Dołączenie informacji debuggera ML /Fl hello.asm ; Utworzenie pliku wydruku ( hello.lst ) ML /Fm hello.asm ; Utworzenie pliku mapy ( hello.map ) ML /Zm hello.asm ; Tryb zgodności z MASM 5.12 ML /Zi /Zm /Fm /Fl hello.asm ; asemblacja i konsolidacja w jednej linii 4. Zadania do wykonania w ćwiczeniu a).Korzystając z opisu przykładu z pkt 3. wykonaj praktycznie przykłady z pkt 1 i 2 kompilując przykłady programem ML z pakietu Masm 6.13. b). Dokonaj analizy poniższego kodu i odpowiedz jaka będzie zawartość rejestru bx po zakończeniu programu. mov cx, 2 cw1: mov bx, 20 loop cw1 mov ax, 4C00h int 21h 4 cw2 : mov bx, 10 c). Wykorzystując program debug napisz program dodający do rejestru BX wartość „5” pięć razy z wykorzystaniem pętli LOOP. Program rozpocznij od polecenia „A 100”. Następnie wykonaj JMP do adresu 0200, gdzie zapiszesz program odejmujący w pętli LOOP od rejestru BX wartość „5” pięć razy. Jaka będzie końcowa wartość rejestrów BX i CX. Wykorzystując w debugerze śledzenie zademonstruj działanie programu prowadzącemu. d). Program z punktu 4 c). napisz w postaci mnemoniki asemblera, skompiluj z użyciem ML i wykonaj śledzenie skompilowanego programu przy użyciu debugera debug. str. 4. 5