Thread View: pl.comp.lang.asm
6 messages
6 total messages
Started by Remek
Thu, 01 Nov 2007 23:31
Auxiliary Carry Flag
Author: Remek
Date: Thu, 01 Nov 2007 23:31
Date: Thu, 01 Nov 2007 23:31
6 lines
925 bytes
925 bytes
Witam Przy pomocy jakiej instrukcji da się wykorzystać stan Auxiliary Carry Flag? Nie mogę się jakoś tej wiedzy "dokopać". Remek
Re: Auxiliary Carry Flag
Author: Wojciech Muła
Date: Fri, 02 Nov 2007 00:56
Date: Fri, 02 Nov 2007 00:56
15 lines
1272 bytes
1272 bytes
Remek wrote: > Przy pomocy jakiej instrukcji da się wykorzystać stan Auxiliary Carry > Flag? Nie mogę się jakoś tej wiedzy "dokopać". Co to znaczy "wykorzystać"? Zerknij na specyfikację AAA[1], jej działaniem steruje m.in. AF i możesz przepisać jej wartość do CF: ; coś co ustawia AF mov eax, 0 aaa ; CF = AF, eax jest zmieniany w. [1] inne dziwolągi do BCD też uwzględniają flagę AF.
Re: Auxiliary Carry Flag
Author: Remek
Date: Fri, 02 Nov 2007 07:46
Date: Fri, 02 Nov 2007 07:46
22 lines
1256 bytes
1256 bytes
Użytkownik "Wojciech Muła" napisał: > coś co ustawia AF > mov eax, 0 > aaa ; CF = AF, eax jest zmieniany Działa! Dzięki za podpowiedź. Przykład: mov BCD1, 0Ah inc BCD1 inc BCD1 inc BCD1 inc BCD1 inc BCD1 aaa jc koniec_liczenia inc BCD1 aaa ; tu jest ustawiana CF jc koniec_liczenia ; tu następuje skok Pozdrawiam Remek
Re: Auxiliary Carry Flag
Author: Bernard
Date: Fri, 02 Nov 2007 09:05
Date: Fri, 02 Nov 2007 09:05
32 lines
1713 bytes
1713 bytes
Remek wrote: > Użytkownik "Wojciech Muła" napisał: > >> coś co ustawia AF >> mov eax, 0 >> aaa ; CF = AF, eax jest zmieniany > > Działa! Dzięki za podpowiedź. Przykład: > > mov BCD1, 0Ah > > inc BCD1 > inc BCD1 > inc BCD1 > inc BCD1 > inc BCD1 > aaa > jc koniec_liczenia > inc BCD1 > aaa ; tu jest ustawiana CF > jc koniec_liczenia ; tu następuje skok > > Pozdrawiam Remek Jej, ale przykład. Może by tak ADD zamiast INC? Cała zabawa polega na uzyskaniu wyniku BCD, a nie tylko sprawdzeniu, czy przelecieliśmy poza zakres. Bit AF jest używany przez instrukcje DAA, AAA, DAS i AAS. Korzystając z tego da się sprytnie napisać konwersję 4 bitów na cyfrę szesnastkową w ASCII przy użyciu czterech instrukcji (nawet trzech, jeżeli użyjemy nieudokumentowanych cech procesora).
Re: Auxiliary Carry Flag
Author: Remek
Date: Fri, 02 Nov 2007 15:55
Date: Fri, 02 Nov 2007 15:55
33 lines
2724 bytes
2724 bytes
Użytkownik "Bernard" napisał: > Jej, ale przykład. Może by tak ADD zamiast INC? Cała zabawa polega na > uzyskaniu wyniku BCD, a nie tylko sprawdzeniu, czy przelecieliśmy poza > zakres. O jej. Wiem, wiem. To tylko na szybko zrobiony przykład ilustrujący sposób wykrywania ustawienia AF. Użycie instrukcji zmieniających CR, OF, czy ZF to żadna sztuka, ponieważ istnieją związane z nimi instrukcje skoków warunkowych, natomiast nie ma takiego skoku wykrywającego stan AF (chyba, że nie znalazłem) i podana metoda w ciekawy sposób rozwiązuje ten problem. > Bit AF jest używany przez instrukcje DAA, AAA, DAS i AAS. Korzystając z > tego da się sprytnie napisać konwersję 4 bitów na cyfrę szesnastkową w > ASCII przy użyciu czterech instrukcji (nawet trzech, jeżeli użyjemy > nieudokumentowanych cech procesora). Nie sztuka przekonwertować 4 bity. Sztuką jest natomiast konwersja liczby dziesiętnej np. 64 cyfrowej na hex, wykonanie dzielenia z użyciem dzielnika większego niż dword i ponowna konwersja na dec. "Bawię" się właśnie takimi procedurami konwersji dużych liczb, w których użyte są instrukcje zmieniające AF, a nie wpływające na CR, ZF, czy OF. Zamiast INC można oczywiście użyć ADD. Zrobiłem procedurę dzielenia przy pomocy wielokrotnego odejmowania. Jeśli różnica między dzielną, a dzielnikiem wynosi 0xFFFFFFF, procedura z użyciem INC wykonuje się kilkanaście sekund i z ADD podobnie. Procesor 1,1 MHz. Chyba więc nie ma o co się "bić", ale dobrze wiedzieć, że można tak i tak. Jeśli przy większych różnicach iloraz wyjdzie poza dword, wtedy muszę stosować ADD i ADC. Może wtedy INC z przeniesieniem będzie szybsze. Będę to sprawdzał. Pozdrawiam Remek
Re: Auxiliary Carry Flag
Author: Bogdan (bogdro)
Date: Sun, 04 Nov 2007 16:13
Date: Sun, 04 Nov 2007 16:13
16 lines
1461 bytes
1461 bytes
Remek pisze: > Witam > > Przy pomocy jakiej instrukcji da się wykorzystać stan Auxiliary Carry > Flag? Nie mogę się jakoś tej wiedzy "dokopać". Bo nie ma takiej instrukcji. Podane tu rozwiązanie z AAA jest ciekawe i pewnie wystarczające. Ja dodam "tradycyjny" sposób: PUSHF/PUSHFD + POP + AND/TEST/BT*. POPa można pominąć, ale trzeba potem wyrównać stos. -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads