🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
6 messages
6 total messages Started by Remek Thu, 01 Nov 2007 23:31
Auxiliary Carry Flag
#1556
Author: Remek
Date: Thu, 01 Nov 2007 23:31
6 lines
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
#1557
Author: Wojciech Muła
Date: Fri, 02 Nov 2007 00:56
15 lines
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
#1558
Author: Remek
Date: Fri, 02 Nov 2007 07:46
22 lines
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
#1559
Author: Bernard
Date: Fri, 02 Nov 2007 09:05
32 lines
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
#1560
Author: Remek
Date: Fri, 02 Nov 2007 15:55
33 lines
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
#1561
Author: Bogdan (bogdro)
Date: Sun, 04 Nov 2007 16:13
16 lines
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