Ahoj, mám za úlohu do školy zoradiť čísla od najmenšieho po najväčšie. No nemám ani potuchy ako to v i8086 zoraďovať. Rovnako by som sa chcel spýtať aj na prevod desiatkového čísla do osmičkového tvaru. Ďakujem.
Fórum › Assembler
I8086 - zoradenie čísel
#1 Peter
https://www.fi.muni.cz/usr/brandejs/Brandejs_Mikroprocesory_Intel_8086_80486_2010.pdf
základy jsou v kapitole 2.x str.15-74 hlavní principy fungování jsou v
2.1-2.4 - data, paměť , registry
2.7 - způsoby adresace paměti
2.8 - základní instrukční set
u obou úloh je důležité vědět typ dat, protože podle toho se s tím pak pracuje:
8 bitů=1 Byte -> rozsah 0-255
16 bitů = 2 Byte -> rozsah 0-65 535
32 bitů = 4 Byte -> rozsah 0-4 294 967 295
také nepíšeš zda se bude překládat na 16 / 32 / 64 bit program
8 a 16 bit je jednoduchý lze s tím pracovat přímo
32 bit ve 32/64 bit programu přímo, ale u 16 bit programu je komplikovanější musí se porovnávat na 2x po 16bitech
řazení principiálně:
1) potřebuješ min 2 základní parametry adresu začátku pole a počet prvků
případné další 2 parametry volitelně pro funkci směr řazení (<>) a typ dat (8/16/32 bit)
2) pro adresování v poli použiješ dle 2.8
- kombinovanou adresu (Baze+Index) - dynamické umístění pole (pro funkci nebo při objektovém programování)
- indexovanou (Adresa + index) - pevné umístění pole
- báze nebo adresa bude ukazovat na začátek pole
- jako bázi použít ideálně segmentový registr DS, na procházení pak indeové registry SI a DI
3) pro základní řazení budou třeba 2 smyčky ideálně použít SI a DI sestupně
- SI = počet prvků -1, vnější smyčka - upravit podle typu dat (při 16b násobit 2, při 32b násobit 4)
- DI = SI - (1 * typ dat) , typy 1/2/4, vnořená smyčka
4) do základních registrů CL/CX/ECX a DL/DX/EDX (8/16/32 bit) načíst z adresy dle 1 hodnoty do jednoho z DS nebo adresa + SI do druhého DS nebo adresa +DI
5) porovnání C.. a D.. (nezmění se) na základě výsledku prohodit hodnoty na daných adresách nebo rovnou pokračovat na 6)
6) vnořená smyčka: DI - velikost typu dat
pokud není příznak záporné hodnoty opakuj smyčku
7) vnější smyčka: SI - velikost typu dat
pokud není příznak záporné hodnoty opakuj smyčku
- konec mělo by být seřazeno
Razeni, treba v js vypada takto
function cmp(a,b) {return a-b;}
sort(arr);
// if (cmp(arr[i],arr[j])>0) {neco proved}
sort je nejaky serazovaci algoritmus, ktery porovnava 2 hodnoty a pak s nimi neco provede. K porovnani si vola funkci cmp.
Serazovaci alg. muze vypadat treba nejak takhle
// pro 4 cisla
if (cmp(arr[n][i+0],arr[n][i+1])>0) {swap(n,i+0,i+1);}
if (cmp(arr[n][i+2],arr[n][i+3])>0) {swap(n,i+2,i+3);}
if (cmp(arr[n][i+0],arr[n][i+2])>0) {swap(n,i+0,i+2);}
if (cmp(arr[n][i+1],arr[n][i+3])>0) {swap(n,i+1,i+3);}
if (cmp(arr[n][i+1],arr[n][i+2])>0) {swap(n,i+1,i+2);}
// pro n cisel - kod z wiki
insertionSort(A)
pro i od 1 do počtu prvků opakuj:
hodnota = A[i];
j = i-1;
pokud j >= 0 a zároveň A[j] > hodnota opakuj:
A[j+1] = A[j];
A[j] = hodnota;
j--;
#2 MilanL
převod čísla v asm je jednoduchý, opět je třeba vědět jen velikost typu podle toho je třeba nastavit počet kroků - jde o rozklad binárního vyjádření po 3bitech
- potřebuješ místo pro ukládání výsledku 3-11 Bytů - a vyprázdnit (naplnit 0), v případě že půjde o string, tak +1 místo na ukončovací znak
- nastavit čítač podle velikosti 8bit =2, 16bit=5, 32bit=10 - asi registr BX pro použití při ukládání výsledku
1) - číslo do pracovního registru
- pracovní registr and 7
- výsledek ulož na adresa ukládání + BX (případně pro string přidat 30Hex pomocí OR vytvoří znak)
- registr s číslem 3x posun doprava (SHR
- BX-1 (čítač)
- pokud není příznak záporu opakuj od 1)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zoradenie cisel — založil Navi
Zoradenie hodnôt čísel — založil otazka
Zoradenie cisel od najvyssieho po najmensie — založil Onsi
Problem 2 vnorenych cyklov v i8086 — založil Payne
Zoradenie Nodes — založil Trebor