PROGRAMOWANIE NISKOPOZIOMOWE PN.01 c Dr inż. Ignacy Pardyka UNIWERSYTET JANA KOCHANOWSKIEGO w Kielcach Rok akad. 2011/2012 1 2 4 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 1 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 2 / 27 Pamięć Niezbędna znajomość systemów liczbowych dziesiętny binarny hexadecymalny adresowanie bajtowe (adres 32-bitowy) jednostki pamięci: word (słowo 2-bajtowe) double word (4 bajty) quad word (8 bajtów) paragraph (16 bajtów) dane w pamięci (reprezentowane numerycznie) instrukcje w pamięci (zakodowane binarnie) c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 3 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 4 / 27
Dane i instrukcje programu CPU reprezentacje znaków (char) kodowanie: ASCII, Unicode reprezentacje liczb typu: int unsigned int float double operacje arytmetyczne w zbiorze danych określonego typu reprezentacja instrukcji maszynowych w języku natywnym procesora reprezentacja kodu źródłowego instrukcji w językach wyższego poziomu struktura: rejestry (PC, IR, robocze) ALU jednostka sterująca cykl pracy procesora: etapy pętli (IF, ID, OF, EX, WB, Int) szczególna rola PC zdolność do dekodowania instrukcji zdolność do wykonywania operacji na operandach reakcja na przerwanie (rola stosu) c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 5 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 6 / 27 Procesory 16-bitowe Procesory 32-bitowe 8088, 8086 rejestry 16-bitowe AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS tryb pracy: real mode dostęp do całej fizycznej pamięci (1M) podział na segmenty 64k-bajtowe adres w postaci: selector:offset adres 20 bitowy: 2 4 selector + offset 80286 rejestry 16-bitowe AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS tryb pracy: protected mode dostęp do obszarów 16M ochrona wzajemna programów segmenty 64k 80386 rejestry 32-bitowe EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP, FLAGS rejestry 16-bitowe FS,GS tryb pracy: 32 bit protected mode dostęp do 4G fizycznej pamięci podział na segmenty do 4G adres 32-bitowy 80486, Pentium, Pentium Pro, MMX implementacja technologii przyspieszania pracy wzrost złożoności strukturalnej c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 7 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 8 / 27
1 2 4 instrukcje w pamięci zakodowane numerycznie kod operacji zmienna długość rozkazów w instrukcji może być operand lub jego adres np. 0x03C3 (EAX := EAX + EBX) asembler koduje na podstawie kodu źródłowego instrukcje asemblera instrukcje maszynowe, np. add eax, ebx asemblery: NASM, MASM, TASM,... c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 9 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 10 / 27 Instrukcje asemblera Fragment programu w asemblerze x86 add eax, ebx lista instrukcji typy operandów immediate (operand w instrukcji) register (rejestrowy) memory (w rejestrze adres względem początku segmentu) implied (domyślny) np. mov dest, src operandy nie mogą być typu memory (obydwa jednocześnie) rozmiary operandów muszą być identyczne mov eax, 3 mov bx, ax add eax, 4 ; eax = eax + 4 add al, ah ; al = al + ah sub bx, 10 ; bx = bx - 10 sub ebx, edi ; ebx = ebx - edi inc ecx ; ecx++ dec dl ; dl-- c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 11 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 12 / 27
nie tłumaczy dyrektyw lecz je wykonuje: symbol equ value %define SIZE 100 mov eax, SIZE definiowanie miejsca w segmentach danych Dyrektywy definiujące miejsce w segmentach danych Dane będą pamiętane pod kolejnymi adresami pamięci z inicjalizacją: db, dw, dd, dq, dt L1 db 0 L2 dw 1000 L3 db 110101b L6 dd 1A92h L8 db A L9 db 0, 1, 2, 3 L10 db w, o, r, d, 0 ; łańcuch (string) L11 db word, 0 L12 times 100 db 0 bez inicjalizacji: resb, resw, resd, resq, rest L7 resb 1 L13 resw 100; rezerwacja 100 słów c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 13 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 14 / 27 Dereferencja i adresowanie Operacje wejścia i wyjścia dostęp do danych w pamięci mov al, [L6]; pobierane tylko pierwsze słowo mov dword [L6], 1; specyfikacja formatu dla danej specyfikacje formatu: byte, word, dword, qword, tword zastosowania: mov al, [L1]; bajt spod L1 -> AL mov eax, L1; adres bajtu -> EAX mov [L1], ah; AH -> pamięci pod adres L1 mov eax, [L6]; dword spod L6 -> EAX add eax, [L6] add [L6], eax brak bibliotek standardowych bezpośredni dostęp do urządzeń jest operacją uprzywilejowaną wymaga trybu protected mode trzeba używać funkcji systemu operacyjnego można wykorzystać funkcje języka C można wykorzystać procedury z pliku: asm io.asm %include "asm_io.inc" ; makrodefinicje c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 15 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 16 / 27
Funkcje we/wy Makra służące do debugowania wywoływane za pomocą instrukcji CALL print int EAX ekran monitora print char AL ekran (kod znaku) print string [EAX] ekran print nl nowa linia read int EAX liczba całkowita z klawiatury read char EAX kod znaku z klawiatury dump regs zawartości rejestrów ekran monitora dump mem zawartość pamięci ekran dump stack stos ekran dump math rejestry koprocesora ekran c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 17 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 18 / 27 Programowanie hybrydowe Programowanie hybrydowe 1 2 4 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 19 / 27 Program główny w języku C Plik: driver.c #include "cdecl.h" int PRE_CDECL asm_main( void ) POST_CDECL; int main() { int ret_status; ret_status = asm_main(); return ret_status; } tryb pracy: protected mode 32-bit. kompilator C zainicjalizuje segmenty można korzystać z bibliotek C wywołuje funkcję asm main() napisaną w asemblerze c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 20 / 27
Programowanie hybrydowe Programowanie hybrydowe Struktura podprogramu w asemblerze (wołanego z C) Plik: first.asm %include "asm_io.inc" segment.data prompt1 db "Wprowadź liczbę: ", 0... segment.bss ; dane niezainicjalizowane input1 resd 1... segment.text global _asm_main _asm_main: enter 0,0 pusha... popa mov eax,0 leave ret c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 21 / 27 Korzystając z NASM i DJGPP na platformie Windows: > gcc -c driver.c > nasm -f coff asm_io.asm > nasm -f coff first.asm -l first.lst > gcc -o first.exe driver.o first.o asm_io.o c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 22 / 27 1 2 4 : I 1 Przeprowadzić kompilację, asemblacje i konsolidację przykładowego programu, a następnie przeanalizować listing i uruchomić program 2 Napisać podprogram w asemblerze definiujący zmienne z nadanymi wartościami początkowymi. Zbadać stan pamięci dla reprezentacji a) 16-bit, b) 32-bit i wyprowadzić na standardowe wyjście zawartość paragrafów pamięci z tymi zmiennymi. Zbadać sposób pamiętania danych wielobajtowych. Ustalić adresy zmiennych. int n = -3; int h = 0xAAFF; m = 0b11110000; char ch = A ; string adres = Kielce, ul. Nowa 1A ; c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 23 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 24 / 27
: II : III 1 Wprowadzić dodatkowe dyrektywy definiujące zmienne bez nadawania wartości początkowych: int A[20]; byte B[100]; 2 Rozbudować program o instrukcje czytania ze standardowego wejścia nowych wartości dla zmiennych (wypisać też zawartość odpowiednich obszarów segmentu danych). Rozbudować program o niżej wskazane elementy (na standardowe wyjście wyprowadzać wartości modyfikowanych zmiennych oraz zawartość rejestrów i stosownych paragrafów pamięci) 1 instrukcje wprowadzania wartości do wskazanych rejestrów roboczych procesora 2 instrukcje kopiowania zmiennych do wskazanych rejestrów roboczych procesora 3 instrukcje nadawania ustalonych wartości zadeklarowanym zmiennym (wskazując typ zmiennej) 4 instrukcje zapamiętywania w zmiennych wartości zaproponowanych wyrażeń arytmetycznych (w wyrażeniach użyć operacji dodawania, odejmowania, inkrementacji, dekrementacji). c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 25 / 27 c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 26 / 27 A. S. Tanenbaum, Strukturalna organizacja systemów komputerowych, Helion, 2006. J. Biernat, Architektura komputerów, OWPW, 2005. R. Hyde, Profesjonalne programowanie, Helion, 2005. R. Hyde,. Sztuka programowania, Helion, 2004. G. Mazur, Programowanie niskopoziomowe, http://wazniak.mimuw.edu.pl. P.A. Carter, PC Assembly Language, http://www.drpaulcarter.com/pcasm/. D.W. Lewis, Między asemblerem a językiem C. Podstawy oprogramowania wbudowanego, RM, 2004. c Dr inż. Ignacy Pardyka (Inf.UJK) PN.01 Rok akad. 2011/2012 27 / 27