Assembler - pomoc s jednoduchým prográmkem Vyřešeno
Assembler - pomoc s jednoduchým prográmkem Vyřešeno
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
Naposledy upravil(a) Ltb dne 21 led 2013 00:01, celkem upraveno 1 x.
Důvod: Úprava nadpisu
Důvod: Úprava nadpisu
-
- Pohlaví:
Re: Assembler - pomoc s jednoduchým prográmkem
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)
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
ptr a cmp dela co? jinak diky
-
- Pohlaví:
Re: Assembler - pomoc s jednoduchým prográmkem
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ů.
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
ITCrowd: PMI-80? Já jsem se pokoušel o Z80 na Didaktiku, ale BASIC byl silnější
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

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
Naposledy upravil(a) faraon dne 21 led 2013 21:17, celkem upraveno 1 x.
"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
-
- Pohlaví:
Re: Assembler - pomoc s jednoduchým prográmkem
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
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
Ale 8080 také uměl pracovat s šestnáctibitovými čísly, používal přece dvojregistry...

Ale 8080 také uměl pracovat s šestnáctibitovými čísly, používal přece dvojregistry...
"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
Re: Assembler - pomoc s jednoduchým prográmkem
zkousim to na jednom skolnim simulatoru, typ procesoru nevim...
Re: Assembler - pomoc s jednoduchým prográmkem
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:
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á):
A s maximální optimalizací to vyvádí ještě šílenější věci:
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!
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!
"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
-
- Mohlo by vás zajímat
- Odpovědi
- Zobrazení
- Poslední příspěvek
-
- 5
- 19860
-
od Tay
Zobrazit poslední příspěvek
10 úno 2025 12:09
-
- 2
- 6814
-
od Dyonysos
Zobrazit poslední příspěvek
14 led 2025 16:19
-
-
Pomoc s výběrem notebooku na hry
od Ghoust23 » 23 zář 2024 08:25 » v Rady s výběrem hw a sestavením PC - 4
- 2858
-
od petr22
Zobrazit poslední příspěvek
24 zář 2024 07:32
-
-
-
PC do 20k (pomoc s dovýběrem komponent)
od insider » 27 zář 2024 16:46 » v Rady s výběrem hw a sestavením PC - 11
- 4069
-
od insider
Zobrazit poslední příspěvek
03 říj 2024 09:03
-
-
- 8
- 2820
-
od atari
Zobrazit poslední příspěvek
30 zář 2024 10:04
Zpět na “Programování a tvorba webu”
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů