Komputery ze współczesnym światem

Program do konwersji liczby dziesiętnej na asembler binarny. Kod szesnastkowy

1. Podstawowe systemy liczbowe. Deklaracje danych w asemblerze

Cel pracy: zapoznanie studentów z systemami liczbowymi – binarnym, ósemkowym, szesnastkowym; reprezentacja danych w pamięci komputera, dyrektywy alokacji pamięci.

Część teoretyczna

Najmniejsza jednostka informacji, jaką można przechowywać w komputerze to kawałek (ang. fragment - bi mało digi T ), tj. 0 lub 1. Bit jest atomem informacji, nie można go podzielić. Bity są pogrupowane w grupy po 8, tworząc bajt. Informacje przetwarzane przez komputer to ciąg liczb binarnych. Z 8 bitów można utworzyć 256 kombinacji. Kombinacje te służą do kodowania dużych i małych liter, cyfr i znaków specjalnych.

Do pomiaru informacji na komputerze stosuje się następujące wielkości:

1 kilobajt = 1 KB = 2 10 bajtów = 1024 bajty;

1 megabajt = 1 MB = 2 20 bajtów = 1024 KB;

1 gigabajt = 1 GB = 2 30 bajtów = 1024 MB.

Systemy liczbowe

System liczbowy to zbiór reguł i liczb służących do przedstawiania liczb. W przypadku dowolnego systemu liczb pozycyjnych liczba reprezentowanych cyfr jest równa podstawie systemu liczbowego, na przykład w przypadku systemu binarnego podstawą jest liczba 2, dlatego do przedstawienia liczb stosuje się dwie cyfry 0 i 1 potrzebne, dla szesnastkowego systemu liczbowego jest to 0, 1, 2, ..., 9 , A, B, C, D, E, F, gdzie literom odpowiadają wartości 10, 11, 12, 13, Odpowiednio 14 i 15.

Aby rozróżnić systemy liczbowe, na końcu liczby umieszcza się literę: B dla systemu binarnego, Q dla ósemkowego, D dla dziesiętnego i H dla szesnastkowego. W przypadku liczby dziesiętnej D nie jest wymagane.

Jeżeli liczba jest zapisana w systemie liczb b-arnych w postaci

Nr(b) = do n do n-1 do n-2 … do 2 do 1 do 0 , re 1 re 2 re 3 … ,

wówczas w systemie dziesiętnym jego wartość można przedstawić jako sumę cyfr pomnożoną przez podstawę systemu liczbowego do potęgi równej numerowi pozycji cyfry w liczbie (numeracja rozpoczyna się od 0, od prawej do lewej):

Nr(10) = C n *b n +C n-1 *b n-1 +…+C 2 *b 2 +C 1 *b 1 +C 0 *b 0 +D 1 *b -1 +D 2 * b –2 +D 3 *b –3 +...

Na przykład:

Niech zostaną podane dwie liczby binarne 11b, 1100011b. Przekonwertujmy te liczby na system dziesiętny:

11b =1*2 1 +1*2 0 =3;

11100011b = 1*2 7 +1*2 6 +1*2 5 +0*2 4 +0*2 3 +0*2 2 +1*2 1 +1*2 0 = 227.

Spójrzmy na przykłady konwersji liczby ósemkowej na system dziesiętny:

11q = 1*8 1 +1*8 0 = 9;

210q =2*8 2 +1*8 1 +0*8 0 =136.

Przykład konwersji liczb szesnastkowych na dziesiętne:

11h = 1*16 1 +1*16 0 =17;

CA0h= C*16 2 +A*16 1 +0*16 0 = 3232

Aby przekonwertować liczby z systemu dziesiętnego na binarny lub szesnastkowy, stosuje się dzielenie liczb całkowitych. Liczbę dzieli się przez podstawę systemu liczbowego, aż do uzyskania niepodzielnej reszty. Iloraz uzyskany z dzielenia jest ponownie dzielony i proces kończy się, gdy iloraz również staje się niepodzielny. Resztę otrzymaną podczas dzielenia zapisuje się w odwrotnej kolejności. Schemat przedstawia konwersję liczby 25 do systemu liczb binarnych, w wyniku której otrzymujemy liczbę 11001b, a także konwersję liczby 418 do systemu liczb szesnastkowych, w wyniku czego otrzymujemy liczbę 1A2h, biorąc pod uwagę, że liczba dziesięć to A.

Do konwersji liczb z systemu szesnastkowego na binarny i odwrotnie wykorzystuje się następujący fakt: każda cyfra szesnastkowa odpowiada czterobitowej liczbie binarnej i odwrotnie, jak pokazano w tabeli. W związku z tym przy konwersji z systemu szesnastkowego na system binarny konieczne jest zapisanie jego kodu binarnego dla każdej cyfry szesnastkowej, a podczas konwersji z powrotem liczba binarna jest dzielona od prawej do lewej na grupy po cztery cyfry i zgodność szesnastkowa jest dla nich napisany.

Tabela zgodności cyfr szesnastkowych i liczb binarnych.

Na przykład przekonwertujmy liczbę 1FDh na reprezentację binarną:

1FDh = 0001-1111-1101b = 111111101b

Przekonwertujmy liczbę binarną 1110100101b na reprezentację szesnastkową: 0011-1010-0101b = 3A5.

Reprezentacja liczb całkowitych w pamięci komputera

System liczb binarnych służy do przedstawiania informacji na komputerze. Do przechowywania liczb całkowitych używana jest ściśle stała liczba bitów: 8, 16, 32, 64. W n pozycjach binarnych można zapisać liczbę całkowitą ze znakiem z zakresu od -2 n-1 do 2 n-1 -1. Pozycje są ponumerowane od 0 do n-1, od prawej do lewej. Na przykład liczba 67 na ośmiu pozycjach binarnych będzie reprezentowana jako 01000011b. Liczby bez znaku mogą być reprezentowane w zakresie od 0 do 2 n -1.

Liczbę całkowitą można przechowywać w postaci uzupełnienia do dwóch lub uzupełnienia do dwóch. Do przedstawienia znaku liczby używany jest bit zwany bitem znaku. Znajduje się na pozycji n-1 i jest najbardziej znaczącym bitem liczby. Dla liczb dodatnich ten bit wynosi zero, dla liczb ujemnych jest to jeden.

Kod bezpośredni używany do przechowywania liczb dodatnich lub bez znaku.

Dodatkowy kod używany do przechowywania liczb ujemnych. Aby uzyskać reprezentację liczby w dodatkowy kod Najpierw znajduje się bezpośredni kod modułu liczby, a następnie jego kod odwrotny. Kod odwrotny uzyskuje się poprzez odwrócenie każdej cyfry reprezentacja binarna liczby: 0 jest konwertowane na 1, a 1 na 0. W ostatnim kroku do kodu odwrotnego dodawana jest 1.

Na przykład, aby przedstawić liczbę -65, mamy:

01000001b numer bezpośredni +65

Kod powrotu 10111110b

10111111b numer dodatkowy o kodzie -65

Kod uzupełnienia do dwójki służy do zastąpienia operacji odejmowania liczb całkowitych operacją dodawania liczby reprezentowanej w kodzie uzupełnienia do dwójki. W takim przypadku procesor nie musi wykonywać operacji odejmowania liczb całkowitych.

Typy danych

BAJT. Ten typ danych zajmuje 1 bajt (8 bitów). Używając tego typu, można zaszyfrować liczbę całkowitą ze znakiem w zakresie od -128 do +127 lub liczbę całkowitą bez znaku w zakresie od 0 do 255, dowolny znak ASCII, który jest również zakodowany jako liczba całkowita. Definicja Dyrektywa – D.B.(Zdefiniuj bajt).

SŁOWO. Ten typ danych zajmuje 2 bajty (16 bitów). Do zmiennej tego typu Można umieścić liczbę całkowitą z zakresu od -32768 do +32767 lub od 0 do 65535, dwa znaki ASCII lub względny adres pamięci typu Near. W tym przypadku zapis do pamięci odbywa się w następujący sposób: dolna część numeru znajduje się pod dolnym adresem, a wyższa część pod wysokim adresem. Dotyczy to również innych typów danych. Na przykład, jeśli szesnastkowa liczba całkowita 1234h jest zlokalizowana pod adresem 1000h, wówczas część niższego rzędu 34h będzie zlokalizowana pod adresem 1000h, a 12h będzie zlokalizowana pod adresem 1001h. Definicja Dyrektywa – DW(Zdefiniuj słowo).

DWORD– 4 bajty (2 słowa) mogą pomieścić 32-bitową liczbę całkowitą ze znakiem lub bez znaku, liczbę zmiennoprzecinkową, 32-bitowy adres pamięci lub 4 znaki ASCII. Podczas zapisywania adresu adres segmentu znajduje się w dwóch starszych bajtach, a przesunięcie w dwóch najniższych bajtach pamięci. Definicja Dyrektywa – DD(Zdefiniuj podwójne słowo).

QWORD– 8 bajtów. Może być liczbą całkowitą ze znakiem lub bez znaku, liczbą lub liczbą zmiennoprzecinkową podwójnej precyzji. Definicja Dyrektywa – DQ(Zdefiniuj quad).

TEN-BAJTY– 10 bajtów. Służy do przechowywania danych w pamięci głównej lub koprocesorze. Może to być upakowany numer BCD, rozszerzona liczba całkowita lub rozszerzona liczba zmiennoprzecinkowa. Definicja Dyrektywa - DT(Zdefiniuj dziesięć bajtów).

Ogólna składnia definiowania danych jest następująca:

< Nazwa> < typ> < listawartości>

< Nazwa> < typ> < numer>dup(wyrażenie),

Gdzie Nazwa– identyfikator, typ– jedna z omówionych powyżej dyrektyw alokacji pamięci, lista wartości– lista, która może zawierać stałe znakowe lub numeryczne. Może również zawierać symbol ? , jeśli wartość jest niezdefiniowana, lub adres - nazwa zmiennej lub etykieta, ciąg znaków ASCII ujętych w cudzysłów lub apostrofy. Dyrektywa dup określa powtarzalność wartości zdefiniowanych przez określone wyrażenie <число> raz. Wyrażenie może być stałą, stałymi, operatorami arytmetycznymi, listą wartości lub symbolem ? , jeśli wartość jest niezdefiniowana.

Na przykład,

var_a db 2 dup (0, 3 dup (1)) ; odpowiednik var_a db 0,1,1,1,0,1,1,1 var_b db 1, 2, 3, ?, ? adr_a dw var_a adr_b3 dd var_b+3

Określmy wielkość pamięci przydzielonej dla każdej z następujących zmiennych:

m1 db 4, 5, 1, 6; 4*1=4 bajty m2 db „xzyqw” ; 5*1=5 bajtów m3 dw 12 dup(?) ; 12*2=24 bajty m4 dd 345h, 234h; 2*4=8 bajtów

m1 db 4, 5, 1, 6 ; 4*1=4 bajty m2 db „xzyqw” ; 5*1=5 bajtów m3 dw 12 dup(?) ; 12*2=24 bajty m4 dd 345h, 234h ; 2*4=8 bajtów

Całkowita liczba bajtów przydzielonych przez te dyrektywy wynosi 41 bajtów. Zmienna m1 znajduje się pod względnym adresem 00h, m2 – 04h, m3 – 09h i m4 – 021h.

Zadania indywidualne:

1. Zamień liczby dziesiętne na systemy binarne, szesnastkowe i ósemkowe:

1)42;31;113 5 )46;35;119 9 ) 49;30;103 13 )29;37;97
2 )45;81;89 6)66;25;110 10 )19;53;101 14 )21;87;98
3 )12;38;118 7 )17;63; 96 11)34;50;107 1 5) 28;45;130
4 )11;43;67 8 )13;69;88 1 2 )14;70;99 16)15;72;100

2. Konwertuj liczby szesnastkowe na binarne:

1)A45;12;56B 5)7C;72EB;31DB 9)34A;6AB;9AD 13)2B9;6F1;81B
2)1EF3;5AB;46F 6)3EB;4D8;A61 10)5AB;79F;AB8 14)7CD;2A1;B53
3)A56;5E9;CDE 7)6A3;9D0;8BE 11)9A;4DE;EF7 15)10B;87F;CD9
4)3B8;DE1;BAE 8)BC;7F9;78A 12)AB;8E4;C17 16)38E;9C7;B89

3. Konwertuj liczby binarne na ósemkowy i szesnastkowy system liczbowy:

1) 00101011; 00100110;
01110011
5 ) 11110010; 01101010;
11111100;
9 ) 10000101; 11100010;
11001011
13 ) 00011101; 11111001;
00111101
2 ) 01100001; 01101110;
11110011
6) 00110110; 00111011;
10001100
10 ) 00011101; 01010110;
10110010
14 ) 00011100; 01001100;
01101110
3) 11100100; 01011100; 11000001 7 ) 11010010; 01001100; 11000111 11) 11100010; 10100001; 10001110 1 5 ) 10101001; 11010101; 111001100
4 ) 00001111; 10100101; 10010001 8 ) 11100000 11111000; 01000011 1 2 ) 10100101; 01101100; 11100001 16) 11100111; 01100101; 10110010;

4. Przedstaw w kodzie uzupełniającym następujące liczby:

1)-42;-31;-96 5)-46;-35;-94 9) -49;-30;-103 13)-29;-37;-97
2)-52;-41;-93 6)-66;-25;-85 10)-19;-53 ; -101 14)-21;-87;-98
3)-12;-38;-93 7)-17;-63;-99 11)-34;-50;-94 15)-28;-45;-95
4)-11;-43;-67 8)-13;-69;-88 12)-14;-70;-99 16)-15;-72;-89

5. Podano następujące definicje zmiennych:

1) a db 45,16,76,-6
Bdb "abcd"
Cdw 15 dup(0),3,3
dd 345 godz
2) dodaj 2,24
b db „aaa”, -8,23h,11101b
c db 6 dup(0), 45, 6
d dw -7,4Dh.8 dup(0)
3) a DB „Salut”, 10,13
b db -16,-20,13h,2 dup(0)
c dw 62,34,-15
d dd 456C9h,4567
4) a dd 92,45h,90,-54,-67
b db 10 dup(‘$’),10.13
c db „amdto”, 10,13,’$’
d dw 5 dup(?),7,-80h
5) db „lucrarea_1”, 10,13
b db 2 dup(0)
c dw 38,-15,78,41,12
d dd 678EFh,3489,456
6) db 12,24, „sss”
b pierś „ab”, -8,23h
c dd 6 dup(0),45
d dw -7,5 dup(0)
7) pierś 35,53
b db 10 dup(' ),10,13,"$"
c dw 5 dup(0)
d dd 555 godz
8) a rzem. 34,6,3,-8,-2
b db „Witam”, „$”
c dw 6 dup(0),‘$’,10,13
d dw -68,46h,7 dup(0)
9) pierś 45.16
b db 5 dup(?),10,13,“$”
c dw 55 dup(0)
d dd 34567h
10) pierś 76,87,92,45h
b db 20 dup(‘$’),10.13
c db „qwert”
d dw 10 dup(0)
11) dodaj 78,34,67
b db „Wynik”, „$”
c db 16 dup(0),‘$’,10,13
12) a pierś 73,74,75,77,78,-67
b db 15 dup(‚?’),10,13
Cdn 777 godz
13) pierś 24,76,-56
b db „abc”, 11101b
c dd 45,4 dup(?)
d dw 4 dup(0),8,3
14) a db „testul_nr_2”,13,10
b db -18,-22,18h,2 dup(0)
c dw 81,-16,44,18
d dd 568ABh
15) dodaj 87,45h, -9
b db 10 dup(?)
c db „test_1$”
d dw 4 dup(0),2,7
16) a db „Matematica”, 10,13
b db 10,20h,2 dup(0)
c dw 60,30,-10,-20,-50
d dd 56789Bh

a) określić, ile bajtów przydzielają te dyrektywy;
b) określić adresy, pod którymi znajduje się każda ze zmiennych.

Cześć! Jest taka linia:

Var BD 2,2,3,3,4,4; 223344 dziesiętna 6-cyfrowa liczba w formacie rozpakowanym ze zwiększoną precyzją (format ASCII)

Jak mogę przekonwertować tę liczbę 223344 na liczbę szesnastkową? Znalazłem kod, który konwertuje z jednocyfrowego na dwucyfrowy liczba dziesiętna do szesnastu cyfr:

; Var. 17. Tył 1. Napisz podprogram konwertujący tablicę ułamków dziesiętnych; bajty ASCII. do tablicy bajtów BCD. Użyj tego podprogramu, aby przetworzyć dwie tablice; Użyj stosu do przekazania parametrów. Nazwa programu ; Opis stałych Opis zmiennych Segment danych x1 db 2h db 1h db 3h db 1h db 4h db 1h ; liczby w formacie ASCII y1 db 3 dup (?) ; tablica w formacie BCD x2 db 8h ;98 db 9h db 5h ;95 db 9h db 7h ;87 db 8h db 2h ;92 db 9h ; tablica grudzień Bajty ASCII Y2 db 4 dup (?) ; tablica grudzień Bajty BCD Końce danych Stos SEGMENT DW 16 dup(?) StkTOp LABEL słowo Końce stosu Kod SEGMENT ZAKŁADA CS: Kod, DS: Dane, ES: Dane, SS: Stos ; W tym miejscu opisano podprogramy abc proc push bp mov bp, sp. przyciągnij do góry stosu mov cx, ; odczyt parametrów ze stosu (ilość liczb) mov di, ; adres zmiennej Y1 mov si, ; adres zmiennej X1 M1: mov al, +1 ; załaduj pierwszą liczbę w formacie ASCII shl ax, 1 ; przesuń o 4 cyfry w prawo shl ax, 1 shl ax, 1 shl ax, 1 lub al, ;przywróć numer, który zapamiętałeś mov, al ; wpisz liczbę w formacie BCD, inc si ; przejdź do innego numeru inc si inc di ; zmodyfikuj adres BCD - liczby dec cx; zmniejszyć liczbę liczb jnz M1 ; jeśli się nie skończyły, przejdź do M1 pop BP ret 6 abc endp ; Program główny Start: mov AX, Data mov DS, AX mov ES, AX mov Ax, Stack mov SS, AX mov SP, offset StkTop ; załaduj parametry na stos zgodnie z warunkami zadania mov ax, offset x1 ; załaduj adres pierwszej tablicy Push ax mov ax, przesunięcie Y1 ; załaduj adres wyniku Push ax mov ax, 3 ; liczba liczb push ax call abc ; wywołanie podprogramu mov ax, offset x2 ; załaduj adres drugiej tablicy push ax mov ax, przesunięcie Y2 ; załaduj adres wyniku Push ax mov ax, 4 ; liczba liczb push ax call abc ; wywołanie kodu podprogramu kończy koniec start


Systemy liczb binarnych, ósemkowych, dziesiętnych i szesnastkowych są pozycyjne. System liczb pozycyjnych to taki, w którym wartość cyfry zależy od jej pozycji w liczbie; pozycje cyfr w liczbie nazywane są rzędami lub cyframi. Podstawą systemu liczb pozycyjnych jest licznik, po osiągnięciu którego wypełniany jest kolejny rząd liczby. W przeciwnym razie podstawa systemu liczbowego jest równa liczbie cyfr, łącznie z zerem, które liczby są zapisane w tym systemie.

Asembler pozwala na użycie liczb w formacie binarnym, ósemkowym, dziesiętnym i szesnastkowym. Domyślnie asembler traktuje wszystkie liczby występujące w programie jako dziesiętne. Możesz jawnie wskazać podstawę liczby za pomocą znaczników (dla MASM32 wersja 11): b lub y - dla liczb binarnych; o lub q - dla ósemkowego; d lub t - dla liczb dziesiętnych; h - dla liczb szesnastkowych. Znacznik jest zapisywany na końcu numeru, razem z numerem. Jeżeli w liczbie użyte są znaki alfabetu (cyfry szesnastkowe), na początku wpisuje się zero - zgodnie z zasadami asemblera oznaczenia liczb muszą zaczynać się od cyfry. Na przykład:

.data zmienna1 bajt 00001111b ; 15 w reprezentacji binarnej var2 bajt 00001111y ; 15 w reprezentacji binarnej var3 bajt 17o ; 15 w notacji ósemkowej var4 bajt 17q ; 15 w notacji ósemkowej var5 bajt 15d ; 15 w notacji dziesiętnej var6 bajt 15t ; 15 w zapisie dziesiętnym var7 bajt 0Fh ; 15 w formacie szesnastkowym

Możesz ustawić typ liczb używanych w programie w sekcji dyrektyw za pomocą instrukcji takich jak

.RADIX (baza)

w którym podstawa liczby jest wskazywana jako liczba dziesiętna. Na przykład zgodnie z instrukcją

.RADIX 16

Istnienie dwóch wariantów znaczników dla liczb binarnych i dziesiętnych wynika ze względów kompatybilności pomiędzy wcześniejszymi wersjami MASM32, które nie miały możliwości zapisywania liczb w formacie szesnastkowym, z późniejszymi wersjami. W przypadku liczb szesnastkowych cyfry arabskie nie wystarczą, dlatego serię liczb uzupełnia się literami:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Łatwo zauważyć, że znaczniki z wcześniejszych wersji MASM32 – b i d – są takie same jak cyfry szesnastkowe, co uniemożliwia ich użycie z dyrektywą .RADIX 16. Znacznik o jest duplikowany przez znacznik q ze względu na podobieństwo pierwszego do zera. Z tych powodów preferowanymi znacznikami są y, q, t.

W komputerze wszystkie liczby są przechowywane jako ciągi zer i jedynek. Gdy zapiszemy liczbę w tekście programu, to asembler dokona jej tłumaczenia na reprezentację czytelną maszynowo i liczba ta zostanie zapisana w odpowiedniej postaci (binarnej) w pliku wykonywalnym. Ale my sami musimy zorganizować wyjście liczby z programu w formacie, który jest już zrozumiały dla użytkownika, co oznacza, że ​​​​jeśli musimy pokazać użytkownikowi liczbę, musimy wykonać w programie następujące czynności: a) przekonwertować liczba z systemu binarnego na system dziesiętny - od reprezentacji maszynowej do ludzkiej; b) zastąp powstałą liczbę dziesiętną jej symbolem, czyli odpowiednim obrazem, ponieważ monitor wyświetla obrazy, a nie liczby.

Tłumaczenie numeru maszynowego na dany system liczbowy odbywa się poprzez kolejne podzielenie tej liczby i otrzymanego wyniku przez podstawę żądanego systemu liczbowego. Pozostałą część dzielenia wpisuje się do najmniej znaczącej cyfry, iloraz ponownie dzieli się przez podstawę systemu liczbowego, resztę wpisuje się do kolejnej cyfry – i tak dalej, aż dzielenie osiągnie zero. Załóżmy, że chcesz przekonwertować liczbę dziesiętną 250 na liczbę szesnastkową:
250 / 16 = 15 , reszta = A (10),
15 / 16 = 0, reszta = F (15),
zatem 250 (dziesiętnie) = FA (szesnastkowo).

Maksymalna liczba, jaką można zapisać w bajcie to 255. Jeżeli na podstawie wyników programu konieczne jest wyświetlenie liczby w formacie dziesiętnym ze zmiennej jednobajtowej, liczbę tę należy podzielić przez 10 nie więcej niż trzy razy - w 255 trzech rzędach po przecinku. W zmiennych typu słowo (dwa bajty) maksymalna wartość wynosi 65 535, w zmiennych typu podwójnego słowa (cztery bajty) - 4 294 967 295. W związku z tym liczby słów do konwersji na format dziesiętny są dzielone przez 10 nie więcej niż pięć razy, double słowo - nie więcej niż dziesięć razy.

Kody znaków to: „0” - 48; „1” - 49; „2” - 50; „3” - 51; „4” - 52; „5” - 53; „6” - 54; „7” - 55; „8” - 56; „9” - 57. Oczywiście, aby przeliczyć wartość liczby na postać symboliczną, wystarczy dodać do niej 48.

Fragment programu konwertujący zmienną bajtową na dziesiętną postać symboliczną:

.dzielnik danych bajt 10 ; dzielnik bufor_dec bajt 3 dup (?) parametr bajt 255 ... .code start: ... ; pobierz wartości bajtu parametru w dziesiętnej formie symbolicznej mov AH, 0 ; reset AH mov AL, parametr; skopiuj zmienną bajtową do dzielnika AL DIV; podziel AX przez 10 mov bufor_dec, AH ; skopiuj pozostałą część podziału do bufora_dec mov AH, 0 ; zresetuj dzielnik AH DIV ; podziel AX przez 10 mov bufor_dec, AH ; skopiuj pozostałą część podziału do bufora_dec mov bufor_dec, AL ; skopiuj iloraz do bufora_dec ADD bufor_dec, 48 ; dodaj 48 - otrzymamy symbol liczby "2" ADD bufor_dec, 48 ; dodaj 48 - otrzymamy symbol liczby "5" ADD bufor_dec, 48 ; dodaj 48 - otrzymamy symbol liczby „5”

Dodaj komentarz

1. Wstęp

2. Ogólne informacje o języku asemblera

3. Część oprogramowania

· Opis programu

· Etapy rozwoju programów montażowych ___

· Program do konwersji liczb dziesiętnych na systemy binarne i szesnastkowe

4. Referencje


Wstęp

Narzędzia zapewniające funkcjonowanie technologii komputerowej dzielą się na 2 części: sprzęt i oprogramowanie.

W skład sprzętu wchodzą następujące urządzenia:

· centralny procesor;

· BARAN;

· urządzenia peryferyjne;

Wszystkie powyższe urządzenia zbudowane są na układach scalonych (IC).

Układ scalony to produkt mikroelektroniczny, który realizuje określone funkcje przetwarzania, charakteryzuje się dużą gęstością upakowania elektrycznie połączonych elementów i komponentów oraz stanowi jedną całość pod względem wymagań dotyczących testów odbiorowych i operacyjnych.

Przykładem układu scalonego są obwody urządzeń cyfrowych: rejestry, sumatory, półsumatory, liczniki, kodery, dekodery itp.

Część programowa obejmuje: zestaw programów i reguł wraz z całą powiązaną dokumentacją, która umożliwia korzystanie komputer aby rozwiązać różne problemy.

Program - pełna sekwencja polecenia maszyny lub operatory języka programowania, które definiują sekwencję działań mających na celu rozwiązanie określonego problemu.

Zadaniem naszej pracy jest: zamiana trzycyfrowej liczby dziesiętnej na system dwójkowy i szesnastkowy. Zadanie to jest realizowane przy użyciu języka asemblera. Ten język niskiego poziomu wykorzystuje notację symboliczną (mnemoniczną) dla instrukcji maszynowych i adresów. Zaletą tego języka jest: po pierwsze, że napisane w nim programy wymagają znacznie mniej pamięci; po drugie, znajomość tego języka i powstałego kodu maszynowego daje wyobrażenie o architekturze maszyny, jakiego raczej nie da się uzyskać pracując w języku programowania wysokiego poziomu.


Ogólne informacje o języku asemblera

Symboliczny język asemblera może w dużym stopniu wyeliminować wady programowania w języku maszynowym.

Jego główną zaletą jest to, że w języku asemblera wszystkie elementy programu są prezentowane w formie symbolicznej. Za konwersję symbolicznych nazw poleceń na ich kody binarne odpowiada firma specjalny program– asembler uwalniający programistę od pracochłonnej pracy i eliminujący nieuniknione błędy.

Nazwy symboliczne wpisywane podczas programowania w języku asemblera zazwyczaj odzwierciedlają semantykę programu, a skróty poleceń odzwierciedlają ich główną funkcję. Przykładowo: PARAM – parametr, TABLE – tabela, MASK – maska, ADD – dodawanie, SUB – odejmowanie itp. itp. Takie nazwy są łatwe do zapamiętania przez programistę.

Do programowania w języku asemblera potrzebne są bardziej złożone narzędzia niż do programowania w języku maszynowym: potrzebne są systemy komputerowe oparte na mikrokomputerze lub PC z zestawem urządzenia peryferyjne(klawiatura alfanumeryczna, wyświetlacz znakowy, napęd pływakowy i urządzenie drukujące), a także systemy programowania rezydentnego lub krzyżowego dla wymaganych typów mikroprocesorów. Język asemblera pozwala efektywnie pisać i debugować znacznie bardziej złożone programy niż język maszynowy (do 1 - 4 KB).

Języki asemblera są zorientowane maszynowo, tj. zależą od języka maszynowego i struktury odpowiedniego mikroprocesora, ponieważ w nich każdej instrukcji mikroprocesora przypisana jest określona nazwa symboliczna.

Języki asemblera zapewniają znaczny wzrost produktywności programisty w porównaniu do języków maszynowych i jednocześnie zachowują możliwość wykorzystania wszystkich dostępnych programowo zasobów sprzętowych mikroprocesora. Umożliwia to wykwalifikowanym programistom pisanie programów, które działają krócej i zajmują mniej pamięci niż programy napisane w języku wysokiego poziomu.

Pod tym względem prawie wszystkie programy sterujące urządzeniami wejścia/wyjścia (sterowniki) są napisane w języku asemblera, pomimo obecności dość dużej gamy języków wysokiego poziomu.

Używając języka asemblera, programista może ustawić następujące parametry:

mnemoniki (nazwa symboliczna) każdego polecenia języka maszynowego mikroprocesora;

standardowy format dla linii programu opisanego w asemblerze;

format określania różnych metod adresowania i opcji poleceń;

format określania stałych znakowych i stałych całkowitych w różnych systemach liczbowych;

pseudopolecenia sterujące procesem asemblowania (tłumaczenia) programu.

W języku asemblera program jest pisany wiersz po wierszu, to znaczy na każde polecenie przydzielana jest jedna linia.

W przypadku mikrokomputerów zbudowanych w oparciu o najpopularniejsze typy mikroprocesorów może istnieć kilka odmian języka asemblera, jednak zazwyczaj jeden jest powszechnie stosowany w praktyce - jest to tzw. standardowy język asemblera. Poniżej rozważymy standardowe języki asemblera.

Każda linia programu napisanego w języku asemblera zawiera cztery pola:

ETYKIETA KOD OPERAND KOMENTARZ

Pole LABEL jest opcjonalne, wyznacza adres komórki pamięci, w której znajduje się pierwszy bajt zaznaczonego polecenia. Etykiety służą jako adresy przejścia dla poleceń przekazania sterowania, a dzięki ich obecności programista nie może operować adresami bezwzględnymi, lecz korzystać z adresów symbolicznych, co jest znacznie wygodniejsze. Etykieta może mieć od jednego do sześciu znaków, z których pierwszy musi być literą. Wiele asemblerów pozwala na etykiety o dowolnej długości, ale rozpoznawanych jest tylko pierwszych sześć znaków. Etykieta nie może zawierać spacji ani znaków interpunkcyjnych. W niektórych asemblerach po ostatnim znaku etykiety musi nastąpić dwukropek.

W polu etykiety każda etykieta musi być zdefiniowana tylko raz, ale odniesienia do niej można stosować dowolną liczbę razy. W W przeciwnym razie Asembler wyda komunikat diagnostyczny dotyczący wielokrotnie zdefiniowanej etykiety.

Pole CODE zawiera symboliczną nazwę polecenia lub pseudokomendy, która ma zostać wykonana. Mnemonik większości poleceń to skrót zdań w języku angielskim, które charakteryzują ich główną funkcję.

Na przykład:

MOV (MOVE) - transfer, do przodu

DODAJ (DODAWANIE) - dodatek

SUB (ODEJMIJ) - odejmowanie

LDA (ŁADUJ BEZPOŚREDNIO

AKUMULATOR) - ładowanie bezpośrednie

INR (WZROST akumulatora

REJESTRACJA) - przyrost rejestru

REJESTRACJA) ubytek rejestru

Mnemoniki poleceń są słowami kluczowymi asemblera i jeśli nie znajdują się w zestawie prawidłowych mnemoników, asembler zgłasza nieprawidłowe polecenie.

Pole OPERAND jest zwykle definiowane w zależności od pola kodu instrukcji. Może zawierać jeden lub więcej operandów oddzielonych przecinkami lub może nie zawierać żadnych operandów dla instrukcji, które działają na wewnętrznych rejestrach roboczych.

Operand to wyrażenie zawierające zapis mnemoniczny, stałe i operatory.

Najprostsze operandy zawierają jeden mnemonik lub jedną stałą.

Jako mnemonik można zastosować identyfikatory wewnętrznych rejestrów roboczych, etykiety i aktualną wartość licznika programu.

Stałe można przedstawić w różnych systemach liczbowych.

Część oprogramowania

Opis programy

W tej pracy przyjrzymy się jednemu ze sposobów konwersji liczby z systemu dziesiętnego na binarny i szesnastkowy przy użyciu języka asemblera. Przed utworzeniem programu zastanowimy się szczegółowo, jakie kroki należy w tym celu podjąć, czyli innymi słowy napiszemy algorytm rozwiązania naszego problemu. Aby komputer mógł przetworzyć dane, musi te dane wprowadzić, co oznacza, że ​​pierwszym krokiem w rozwiązaniu naszego problemu będzie wprowadzenie liczby. Drugim krokiem pracy będzie wyświetlenie komunikatu o wprowadzonym numerze. Następnie konwertujemy liczbę dziesiętną na system binarny i wyświetlamy na ekranie naszą liczbę w odpowiedniku binarnym. Następnym krokiem jest konwersja liczby na jej odpowiednik szesnastkowy, a ostatnim krokiem jest pętla, która pozwala na kontynuację wprowadzania nowej liczby dziesiętnej. Teraz połączmy wszystkie punkty w całość:

1. Wpisanie cyfry z klawiatury.

2. Wyświetl komunikat o wprowadzonym numerze.

3. Konwersja liczby na jej odpowiednik binarny.

4. Wyświetl liczbę binarną.

5. Konwersja liczby na postać szesnastkową.

6. Wyświetl liczbę szesnastkową.

7. Cykl (kontynuujemy?) jeśli TAK to punkt 1, w innym wypadku punkt 8

8. Wyjdź z programu.

Jest to algorytm programu w języku naturalnym.

etapy rozwoju programów w asemblerze

1. Opis problemu. Zawiera sensowny opis problemu i rozwój algorytmu.

2. Opracowanie tekstu programowego.

3. Wprowadzanie tekstu do komputera. Tekst programu w kodach mnemonicznych wprowadza się do komputera za pomocą dowolnego edytora tekstu. Spowoduje to również utworzenie pliku tekstowego z rozszerzeniem *.ASM.

4. Kompilacja lub montaż. Konwersja w toku plik tekstowy z rozszerzeniem *.ASM do pliku obiektowego zawierającego program w kodzie maszynowym z rozszerzeniem *.OBJ. Również na tym etapie można stworzyć listę programów. Plik z rozszerzeniem *.LST zawierający podstawowe informacje o programie oraz plik Cross-Reference File z rozszerzeniem *.CRF. Na tym etapie tekst programu jest sprawdzany pod kątem błędów. Montaż odbywa się przy pomocy programu tłumaczącego TASM.EXE (ASM.EXE - w asemblerze, MASM.EXE - w makro asemblerze). TASM [opcje] *.ASM [,] - polecenie wykonania tłumaczenia. Jeśli w poleceniu zostanie podany jeden przecinek, zostanie wygenerowany plik z listą. TASM ma dwie opcje: /ZI i /N. Nazywają się: TASM.

5. Układ. Na tym etapie tworzony jest relokowalny program, który można załadować do dowolnego obszaru pamięci. Zapisane w pliku z rozszerzeniem *.EXE lub *.COM. Aby to zrobić, użyj TLINK.exe (dla asemblera makr LINK.EXE). Dostępne opcje to /T i /X.

6. Wykonywanie i debugowanie (DEBUG).

7. Wpisanie kodu maszynowego programu do ROM (może go brakować) Teraz przyjrzymy się schematowi blokowemu naszego programu, czyli uporządkowanym działaniom.


; PROGRAM DO KONWERSJI UKŁADU DZIESIĘTNEGO NA; SYSTEMY BINARNE I SZESNASTKOWE; KUMULACJE

;Segment danych

;Tabela konwersji„cyfra – ASCII-kod

tabl_ascii db "0123456789abcdef"

;____________________________________________________________________

;Tabela konwersji„ASCII-numer kodu

db 0,1,2,3,4,5,6,7,8,9

db 0ah, 0bh, 0ch, 0dh, 0eh, 0fh

;____________________________________________________________________

;Rezerwacja i inicjalizacja zmiennych w pamięci

x_ascii db 20h dup(?)

t1 db 0dh,0ah,"Wpisz liczbę i naciśnij Enter"

db 0dh, 0ah, "$"

t2 db 0dh,0ah,"Wpisałeś liczbę",0dh,0ah "$"

t3 db 0dh, 0ah, „W systemie binarnym wygląda to tak”

t4 db 0dh, 0ah, „W formacie szesnastkowym w ten sposób”

db 0dh, 0ah, "$"

buf db 16 dup(?),"$"

t5 db 0dh,0ah, „Czy będziemy kontynuować proces? (T/N)?”

;____________________________________________________________________

; Segment kodu

;Główna procedura

D: lea dx, t1

;Procedura wprowadzania liczby dziesiętnej

;Procedura wyświetlania liczby dziesiętnej

r1: ruch dl,

; Konwersja liczby (dziesiętnej) na binarną

v1: mul si

;Procedura wyświetlania liczby binarnej

; Procedura konwersji liczby (binarnej) na szesnastkową

; i wyświetlić go na ekranie

Notatki :

Poniżej znajdują się polecenia użyte w programie:

pod– odejmowanie binarne. Odejmuje zawartość drugiego operandu od pierwszego operandu

Mnemonika:pod< operand 1>,< operand 2>

dzwonić– wywołanie procedury. Przekazuje kontrolę do procedury, której adres jest określony przez operand; po zakończeniu procedury wykonywanie jest kontynuowane od polecenia następującego po poleceniu wywołania

Mnemonika: dzwonić< nazwa procedury>

gnić– powrót do procedury

shr– przesuń się logicznie w prawo

xor– wyłączne OR

Mnemonika:xor<операнд 1>,<операнд 2>

polanka– pobierz EA

Mnemonika:lea reg,<операнд>

naciskać– dołącz do stosu

Mnemonika: naciskać< operand>

Muzyka pop– pobrać ze stosu

Mnemonika: Muzyka pop<операнд>

ruch- do przodu

Mnemonika:ruch< odbiorca>,<источник>

Inc– wzrost o 1

Mnemonika:inc<операнд>

grudzień– zmniejszenie o 1

Mnemonika: grudzień< operand>

stosb– przekazuje połączenia do rejestru al lub ax, na który wskazuje rejestr di

pętla– komenda zorganizowania pętli z licznikiem, także krótkich przejść (127b) komenda zmniejsza wartość licznika cx bez zmiany flag, jeżeli połączenie cx > 0 to następuje przejście do podanej etykiety, w przeciwnym razie pętla się kończy.

Mnemonika: pętla< etykieta>

.KOD– otwiera segment kodu

. DANE-- otwiera segment danych

.STOS N– definiuje stos segmentów(a); W tym przypadku nie stosuje się dyrektyw zamykających segmenty; N – pokazuje rozmiar stosu (a) w bajtach

Notatka : Podczas korzystania z takich dyrektyw rejestr ds jest inicjowany w następujący sposób: mov topór, @data

mov ds, ax

zakładać, że nie jest używane w tym przypadku

Bibliografia

1. „Jestem językiem asemblera dla IBM PC i programowania” Szkoła Wyższa 1992.

2. „Komputer osobisty IBM i system operacyjny MS-DOS” Radio i komunikacja 1991.

3. Ilyushechkin V.N., Kostin A.E., Khokhlov M.M. „Oprogramowanie systemowe”, M., „Szkoła Wyższa”, 1987

4. Norton P., Souhe D. „Język asemblera dla IBM PC”, M., Wydawnictwo „Komputer”, 1993

Ten artykuł jest przeznaczony głównie dla zupełnie początkujących. Jeśli jesteś dobrze zaznajomiony z systemami liczbowymi, możesz zwrócić uwagę jedynie na cechy składni asemblera FASM znajdujące się na końcu artykułu.

Tak naprawdę procesor działa tylko z liczbami binarnymi składającymi się z jedynek i zer :) Wszystkie dane i polecenia dowolnego programu są przechowywane i przetwarzane w postaci liczb binarnych. Jednak binarny zapis liczb jest zbyt uciążliwy i niewygodny dla człowieka, dlatego programy w języku asemblera używają także innych systemów liczbowych: dziesiętnego, szesnastkowego i ósemkowego.

Trochę teorii

Przede wszystkim zastanówmy się, jaka jest różnica między systemami liczbowymi. Dowolną liczbę dziesiętną można przedstawić w następujący sposób:

123 10 = 1 10 2 + 2 10 1 + 3 10 0

Indeks dolny poniżej wskazuje, że jest to liczba dziesiętna. Cyfrę każdej cyfry mnoży się przez 10 do potęgi równej liczbie cyfry, liczonej od zera od prawej do lewej. Bardziej ogólnie:

ABC R= za R 2 + b R 1 + ok R 0 ,

gdzie a, b i c to pewne liczby, a r to podstawa systemu liczbowego. Dla systemu dziesiętnego R= 10, dla binarnego - R= 2, dla trójskładnikowego R= 3 itd. Przykładowo ten sam numer w innych systemach:

443 5 = 4 5 2 + 4 5 1 + 3 5 0 = 4 25 + 4 5 + 3 1 = 123 10 (układ pięcioargumentowy)

173 8 = 1 8 2 + 7 8 1 + 3 8 0 = 1 64 + 7 8 + 3 1 = 123 10 (układ ósemkowy)

1111011 2 = 1,2 6 + 1,2 5 + 1,2 4 + 1,2 3 + 0,2 2 + 1,2 1 + 1,2 0 = 1,64 + 1,32 + 1,16 + 1 8 + 0 4 + 1 2 + 1 1 = 123 10 (binarnie)

System szesnastkowy

W systemie szesnastkowym litery A = 10, B = 11, C = 12, D = 13, E = 14, F = 15 służą do oznaczenia liczb większych niż 9. Na przykład:

C7 16 = 12 16 1 + 7 16 0 = 12 16 + 7 1 = 199 10

Wygoda systemu szesnastkowego polega na tym, że bardzo łatwo jest przekonwertować na niego liczby binarne (i w odwrotnym kierunku). Cztery cyfry liczby binarnej (tetrady) są reprezentowane przez jedną cyfrę w systemie szesnastkowym. Aby przetłumaczyć, po prostu podziel liczbę na grupy po 4 bity i zamień każdą tetradę na odpowiednią cyfrę szesnastkową.

Dwójkowy
tetrada
Szesnastkowy
numer
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 mi
1111 F

Aby zapisać jeden bajt, wymagane są tylko 2 cyfry szesnastkowe:

0101 1011 2 = 5B 16

0110 0000 2 = 60 16

1111 1111 2 = FF 16

Układ ósemkowy

Liczba ósemkowa jest również przydatna do przedstawiania liczb binarnych, chociaż jest znacznie rzadziej używana niż liczba szesnastkowa. Aby szybko przetłumaczyć, musisz podzielić liczbę binarną na grupy po 3 cyfry (trojaczki lub triady).

Dwójkowy
triada
ósemkowy
numer
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

Na przykład: 001 110 101 2 = 165 8

Składnia asemblera FASM

Domyślnie liczba w programie jest postrzegana przez asembler jako liczba dziesiętna. Aby oznaczyć liczbę binarną, należy dodać na jej końcu symbol 'B'. Liczbę ósemkową oznacza się podobnie za pomocą symbolu „o”. Aby zapisać liczbę szesnastkową, FASM obsługuje 3 formy notacji:

  • symbole są zapisywane przed liczbą „0x”(jak w C/C++);
  • symbol jest zapisany przed liczbą ’$’ (jak w Pascalu);
  • po liczbie zapisywany jest symbol 'H'. Jeśli liczba szesnastkowa zaczyna się od litery, należy dodać zero na początku (w przeciwnym razie nie jest jasne, czy jest to liczba, czy nazwa etykiety).

Ta składnia jest używana zarówno w deklaracjach danych, jak i w poleceniach. Oto przykłady zapisu liczb we wszystkich czterech systemach:

ruch toporem, 537 ;System dziesiętny movbl, 11010001b ;System binarny ruch ch, 57o ;Układ ósemkowy mov dl, $ C2;\ mov si, 0x013A; \mov ah, 18h ; / System szesnastkowy ruch al, 0FFh ;/ ruch al, FFh ;Błąd!

mov ax,537 ;System dziesiętny mov bl,11010001b ;System binarny mov ch,57o ;System ósemkowy mov dl,$C2 ;\ mov si,0x013A ; \mov ah,18h; / System szesnastkowy mov al,0FFh ;/ mov al,FFh ;Błąd!

Powiązane publikacje