🚀 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 identifikator: 20040501 Sun, 09 May 2010 16:36
moja zagadka
#2242
Author: identifikator: 20040501
Date: Sun, 09 May 2010 16:36
2 lines
1044 bytes
no to jak w szybki sposób zamienić cyfrę binarną 16 bitów na ciąg znaków 
ASCII? 
Re: moja zagadka
#2243
Author: Wojciech Muła
Date: Mon, 10 May 2010 14:31
8 lines
1072 bytes
"identifikator: 20040501" <NOSPAMtestowanije@go2.pl> wrote:

> no to jak w szybki sposób zamienić cyfrę binarną 16 bitów na ciąg znaków 
> ASCII? 

Te znaki co mają reprezentować? Zapis szesnastkowy, dwójkowy, dziesiętny liczby?

w.
Re: moja zagadka
#2244
Author: identifikator: 20040501
Date: Mon, 10 May 2010 18:08
7 lines
1485 bytes
Te znaki co mają reprezentować? Zapis szesnastkowy, dwójkowy, dziesiętny 
liczby?

cyferki dziesiętne, już w problem zamiany cyferek na znaki sobie darujmy...
oczywiście można pomyśleć o algorytmie uniwersalnym, coby na przykład 
wyliczał cyferki w kodzie piątkowym...
albo na cyfrach rzymskich...
Re: moja zagadka
#2245
Author: Wojciech Muła
Date: Mon, 10 May 2010 21:06
44 lines
2196 bytes
"identifikator: 20040501" <NOSPAMtestowanije@go2.pl> wrote:

> > Te znaki co mają reprezentować? Zapis szesnastkowy, dwójkowy, dziesiętny 
> > liczby?
> 
> cyferki dziesiętne, już w problem zamiany cyferek na znaki sobie darujmy...
> oczywiście można pomyśleć o algorytmie uniwersalnym, coby na przykład 
> wyliczał cyferki w kodzie piątkowym...
> albo na cyfrach rzymskich...

Problem konwersji sprowadza się w zasadzie do obliczenia:

	do {
		cyfra := x mod podstawa
		zapis cyfry
		x := x div podstawa
	} while (x > 0)

Dzielenie jest ogólnie wolne, ale skoro podstawa jest stała, można użyć mnożenia
przez specjalnie dobrane liczby, a resztę liczyć w standardowy sposób, tj.
x - ((x div podstawa) * podstawa). Jeśli podstawa jest równa 10, wówczas:

	mov ebx, 0xcccccccd	; magiczna liczba
	mov eax, [x]
loop:
	xor edx, edx
	mov eax, ecx	; zapisanie x
	mul eax
	shr edx, 3	; edx = eax div 10

	mov eax, edx	; zapis nowej wart. x' do następnej iteracji
	
	add edx, edx
	lea edx, [edx + edx*4]	; edx = edx * 10
	sub ecx, edx		; ecx = x mod 10
	; zapis cl
	
	test eax, eax
	jnz loop

To tak pi*drzwi, nie testowane. Warto poszukać w sieci informacji
o współczesnych optymalizacjach kompilatorów.

w.
Re: moja zagadka
#2247
Author: Wojciech Muła
Date: Tue, 11 May 2010 19:44
9 lines
1340 bytes
"identifikator: 20040501" <NOSPAMtestowanije@go2.pl> wrote:

> mnożenie zamiast dzielenia? ale numer, tego nie znałem, a jakiś przykład 
> jakiegoś obliczenia mógłbyś przedstawić? 

Przeczytaj np. to "Division by Invariant Integers using Multiplication",
metody tam opisane są stosowane w gcc.

w.
Re: moja zagadka
#2258
Author: Wojciech Muła
Date: Wed, 12 May 2010 09:00
10 lines
1230 bytes
"Wiktor S." <wswiktor&poczta,fm@no.spam> wrote:

> > mov ebx, 0xcccccccd ; magiczna liczba
> 
> której nigdzie nie używasz.

Faktycznie, wysłało się mul eax, a powinno być
oczywiście mul ebx.

w.
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