Stránka 1 z 1

Assembler - pomoc s jednoduchým prográmkem  Vyřešeno

Napsal: 20 led 2013 23:09
od symetrala
Dobry den, dokazal by nekdo napsat v assembleru tento program? Kolik ulozenych cisel ve formatu word (2byte) v oblasti pameti AAAA-ACA9 je vetsi nez 32767? Dekuji

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 09:10
od Uziv00
Napsat nenapíšu, co jsem naposled psal v assembleru, hodně se změnilo (naposled na 8080A).
Ale snad tě navedu:
1. Inicializace
mov word ptr eax, ACA9
mov word ptr ebx, 7FFF
mov word ptr ecx, 0
mov word ptr edx, AAAA
2. rutina
cmp ebx, [edx]
test na carry příznak pokud ano, call
inc edx
inc edx
cmp ebx, edx
test na carry příznak, pokud ne, skok na rutina
konec
3. call
inc ecx
ret
V registru eax je konečná adresa, v reg. edx počáteční, v ebx porovnávaná hodnota, v ecx bude po skončení výsledek. Nejsem si úplně jist posunem adresy 2x (inc edx) a taky si budeš muset sám přijít na test carry přenosu při volání call (u skoku je to jc)

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 18:08
od symetrala
ptr a cmp dela co? jinak diky

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 18:22
od Uziv00
cmp = compare => porovnává. Když je operand2 větší než operand 1, nastaví carry na 1
mov word ptr říká, že jde o proměnnou word - tedy 16 bitů. kromě toho existuje byte to je jasné. Bez ptr jde o proměnnou v délce 32 bitů.

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 18:46
od faraon
ITCrowd: PMI-80? Já jsem se pokoušel o Z80 na Didaktiku, ale BASIC byl silnější :lol:

symetrala: Ještě nám prozraď pro jaký procesor to má být, protože tohle je u každého jiné. Navíc třeba Intel 8080 nebo 8086 je Little Endian, takže nižší byte bude v paměti pod vyšším, Motorola 6800 je Big Endian, tam nižší byte bude nad vyšším, zatímco u Intel 8051 je to celkem jedno, protože nedokáže načíst šestnáct bitů najednou (ale v programové paměti používá Big Endian). A jestli jde o dvaatřicetibitový ARM, tak ten je dokonce Middle Endian, protože to má pomíchané!

Pro informaci o celém instrukčním souboru 8080 se podívej sem: http://www.classiccmp.org/dunfield/r/8080.txt

P.S. aby bylo z čeho vybírat:
8051: http://www.win.tue.nl/~aeb/comp/8051/set8051.html
8086: http://www.electronics.dit.ie/staff/tsc ... n_set.html

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 18:48
od Uziv00
já to nepsal pro 8080! ten stejně uměl jen 8 bitů. Tohle by mělo být z intelovské instrukční sady pro normální procesory.

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 19:05
od faraon
Promiň, já přečetl jen ten text předtím a nekouknul jsem se do kódu, to by mi hned u toho EAX došlo :oops:

Ale 8080 také uměl pracovat s šestnáctibitovými čísly, používal přece dvojregistry...

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 21:14
od symetrala
zkousim to na jednom skolnim simulatoru, typ procesoru nevim...

Re: Assembler - pomoc s jednoduchým prográmkem

Napsal: 21 led 2013 21:53
od faraon
To je moc málo informací, potřeboval bych znát instrukční sadu toho procesoru, kolik registrů má a co se s nimi dá dělat, prostě jeho vlastnosti, a třeba také kolikabitový vůbec je... Máš k tomu nějakou dokumentaci?

Zatím jsem si trochu vypomohl pomocí Céčka a GCC, takže pro inspiraci:

Kód: Vybrat vše

   movl   $0, -24(%ebp)
   movl   $43690, -28(%ebp)
   jmp   .L5
.L6:
   movl   -28(%ebp), %eax
   addl   -8(%ebp), %eax
   movzbl   (%eax), %eax
   testb   %al, %al
   jns   .L7
   addl   $1, -24(%ebp)
.L7:
   addl   $2, -28(%ebp)
.L5:
   cmpl   $44200, -28(%ebp)
   jle   .L6

To mi ještě připomíná ten původní kód, když jsem zapnul mírnou optimalizaci, tak to vypadá o dost zajímavěji (netvrdím že chápu co to dělá):

Kód: Vybrat vše

   movl   $0, %edx
   movl   $0, %eax
.L4:
   cmpb   $-128, 43690(%esi,%eax,2)
   sbbl   $-1, %edx
   addl   $1, %eax
   cmpl   $256, %eax
   jne   .L4

A s maximální optimalizací to vyvádí ještě šílenější věci:

Kód: Vybrat vše

   xorl   %edx, %edx
   xorl   %eax, %eax
.L4:
   cmpb   $-128, 43690(%esi,%eax,2)
   sbbl   $-1, %edx
   addl   $1, %eax
   cmpl   $256, %eax
   jne   .L4

Je to tedy dvaatřicetibitový kód pro 386, neadresuji přímo paměť, ale pole, a pracovní hodnoty si to drží v proměnných na zásobníku místo v registrech, proto jsou tam ty hrůzy jako -28(%ebp).
Jestli to chceš luštit, tak čísla jsou desítková, uvozená $, registry %, labely pro skoky jsou .L, a pozor na to že instrukce mají obrácené pořadí operandů než intelovský assembler, takže movl odkud, kam!