🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
11 messages
11 total messages Started by Johnny Wed, 14 Jun 2006 13:52
Wynik w konsoli
#335
Author: Johnny
Date: Wed, 14 Jun 2006 13:52
5 lines
870 bytes
W jaki sposób mogę wyświetlić w konsoli wynik operacji, który mieści się
np. w ax?

-- 
Johnny
Re: Wynik w konsoli
#336
Author: Stachu 'Dozzie' K.
Date: Wed, 14 Jun 2006 13:56
13 lines
1336 bytes
On 14.06.2006, Johnny <johnny_bez_spamu_@klub.chip.pl> wrote:
> W jaki sposób mogę wyświetlić w konsoli wynik operacji, który mieści się
> np. w ax?

Możesz użyć printf, tylko będziesz musiał zlinkować program z libc.
Możesz też użyć bezpośrednio syscalla 4 (int 0x80), ale wtedy będziesz
musiał w pętli po jednej cyfrze dziesiętnej zapisywać do bufora
(umieszczonego na przykład na stosie), a potem ten bufor wypisać
w odwrotnej kolejności.

-- 
Feel free to correct my English
Stanislaw Klekot
Re: Wynik w konsoli
#337
Author: Wiktor S.
Date: Wed, 14 Jun 2006 22:06
25 lines
1347 bytes
> W jaki sposób mogę wyświetlić w konsoli wynik
> operacji, który mieści się np. w ax?

Zamienić na ciąg znaków, w systemie dziesiętnym albo szesnastkowym.

Wyświetlanie liczby z al (czyli 8-bitowej) w postaci szesnastkowej:

; składnia NASM-a

 xor ebx,ebx
 mov bl,al
 and bl,11110000b
 shr bl,4
 mov ah,[.heksy+ebx]
 call writechar
 mov bl,al
 and bl,00001111b
 mov ah,[.heksy+ebx]
 call writechar

.heksy db '0123456789ABCDEF'


-- 
Azarien
Re: Wynik w konsoli
#338
Author: Bernard
Date: Wed, 14 Jun 2006 22:53
38 lines
1622 bytes
Wiktor S. wrote:
>> W jaki sposób mogę wyświetlić w konsoli wynik
>> operacji, który mieści się np. w ax?
> 
> Zamienić na ciąg znaków, w systemie dziesiętnym albo szesnastkowym.
> 
> Wyświetlanie liczby z al (czyli 8-bitowej) w postaci szesnastkowej:
> 
> ; składnia NASM-a
> 
> xor ebx,ebx
> mov bl,al
> and bl,11110000b
> shr bl,4
> mov ah,[.heksy+ebx]
> call writechar
> mov bl,al
> and bl,00001111b
> mov ah,[.heksy+ebx]
> call writechar
> 
> .heksy db '0123456789ABCDEF'

Eee, strasznie długie i skomplikowane...
Ja wolę:

     aam 16
     xchg al, ah
     call printhex
     mov al, ah
printhex:
     add	al, 90h
     daa
     adc	al, 40h
     daa
     jmp	putchar

; putchar jest procedurą, która wypisuje znak ASCII z al
Re: Wynik w konsoli
#339
Author: Wiktor S.
Date: Thu, 15 Jun 2006 11:38
36 lines
1620 bytes
>> xor ebx,ebx
>> mov bl,al
>> and bl,11110000b
>> shr bl,4
>> mov ah,[.heksy+ebx]
>> call writechar
>> mov bl,al
>> and bl,00001111b
>> mov ah,[.heksy+ebx]
>> call writechar
>>
>> .heksy db '0123456789ABCDEF'
>
> Eee, strasznie długie i skomplikowane...
> Ja wolę:
>
>     aam 16
>     xchg al, ah
>     call printhex
>     mov al, ah
> printhex:
>     add al, 90h
>     daa
>     adc al, 40h
>     daa
>     jmp putchar
>
> ; putchar jest procedurą, która wypisuje znak ASCII z al

ezoteryczne instrukcje, magiczne wartości i skoki, nad którymi trzeba się 
kilka minut zastanawiać - ktoś tu mówił o skomplikowaniu? :-)



-- 
Azarien
Re: Wynik w konsoli
#340
Author: Bernard
Date: Fri, 16 Jun 2006 23:28
39 lines
1934 bytes
Wiktor S. wrote:
>>> xor ebx,ebx
>>> mov bl,al
>>> and bl,11110000b
>>> shr bl,4
>>> mov ah,[.heksy+ebx]
>>> call writechar
>>> mov bl,al
>>> and bl,00001111b
>>> mov ah,[.heksy+ebx]
>>> call writechar
>>>
>>> .heksy db '0123456789ABCDEF'
>>
>> Eee, strasznie długie i skomplikowane...
>> Ja wolę:
>>
>>     aam 16
>>     xchg al, ah
>>     call printhex
>>     mov al, ah
>> printhex:
>>     add al, 90h
>>     daa
>>     adc al, 40h
>>     daa
>>     jmp putchar
>>
>> ; putchar jest procedurą, która wypisuje znak ASCII z al
> 
> ezoteryczne instrukcje, magiczne wartości i skoki, nad którymi trzeba 
> się kilka minut zastanawiać - ktoś tu mówił o skomplikowaniu? :-)

Policz instrukcje, zajętość rejestrów i pamięci oraz odwołania do 
pamięci (w tym operacje stosowe) w obu wariantach. Tak "na oko" niemal 
wszystko wychodzi ok. 2 razy lepiej w mojej wersji. Aha, zapomniałeś 
dopisać "ret" na końcu ;)

W końcu na tym właśnie polega programowanie w asemblerze, nie?
Re: Wynik w konsoli
#341
Author: Wiktor S.
Date: Sat, 17 Jun 2006 11:51
16 lines
1664 bytes
>> ezoteryczne instrukcje, magiczne wartości i skoki, nad którymi trzeba
>> się kilka minut zastanawiać - ktoś tu mówił o skomplikowaniu? :-)

> Policz instrukcje, zajętość rejestrów i pamięci oraz odwołania do
> pamięci (w tym operacje stosowe) w obu wariantach.

Uhum. Niestety, jak czytam dokumentację wychodzi, że aam i daa nie są 
dozwolone w trybie 64-bitowym. Dziwne, po co miano by usuwać instrukcje?

> Tak "na oko" niemal wszystko wychodzi ok. 2 razy lepiej w mojej
> wersji. Aha, zapomniałeś dopisać "ret" na końcu ;)

Ach, przepraszam najmocniej, był to wycięty fragment większej procedury.

-- 
Azarien
Re: Wynik w konsoli
#343
Author: Bernard
Date: Sat, 17 Jun 2006 14:25
22 lines
2184 bytes
Wiktor S. wrote:
>>> ezoteryczne instrukcje, magiczne wartości i skoki, nad którymi trzeba
>>> się kilka minut zastanawiać - ktoś tu mówił o skomplikowaniu? :-)
> 
>> Policz instrukcje, zajętość rejestrów i pamięci oraz odwołania do
>> pamięci (w tym operacje stosowe) w obu wariantach.
> 
> Uhum. Niestety, jak czytam dokumentację wychodzi, że aam i daa nie są 
> dozwolone w trybie 64-bitowym. Dziwne, po co miano by usuwać instrukcje?

Nie "nie są dozwolone" a "zostały usunięte" (więc ich po prostu nie ma). 
żaden kompilator nie użyje takich instrukcji - były one przeznaczone do 
ręcznego pisania kodu w asemblerze, a ponieważ obecnie prawie się tego 
nie robi - nie ma realnej potrzeby ich zachowywania w nowych 
procesorach. Pozy tym AAM jako instrukcja dzielenia jest paskudnie wolna 
(ale i tak zwykle szybsza niż dostęp do tablicy w pamięci, zresztą nie 
do tego służy). AAM da się zastąpić przez SHR tak, że przybędzie tylko 
jedna instrukcja albo i żadna. Gorzej z DAA, które akurat w tym zadaniu 
spisuje się bardzo wdzięcznie.

Właściwie to już mam pomysł na nową asemblerową łamigłówkę - to samo, 
tylko bez DAA i bez skoków. Powinno dać się zrobić.
Re: Wynik w konsoli
#342
Author: Wiktor S.
Date: Sun, 18 Jun 2006 23:17
17 lines
1742 bytes
>> Uhum. Niestety, jak czytam dokumentację wychodzi, że aam i daa nie są
>> dozwolone w trybie 64-bitowym. Dziwne, po co miano by usuwać
>> instrukcje?
>
> Nie "nie są dozwolone" a "zostały usunięte"

Na jedno wychodzi: nie działają.

> (więc ich po prostu nie ma). żaden kompilator nie użyje
> takich instrukcji - były one przeznaczone do ręcznego pisania
> kodu w asemblerze, a ponieważ obecnie prawie się tego nie robi
> - nie ma realnej potrzeby ich zachowywania w nowych procesorach.

W procesorze i tak muszą być, gdyż w trybie rzeczywistym i chronionym są.

-- 
Azarien
Re: Wynik w konsoli
#344
Author: Bernard
Date: Mon, 19 Jun 2006 18:08
22 lines
1971 bytes
Wiktor S. wrote:
>>> Uhum. Niestety, jak czytam dokumentację wychodzi, że aam i daa nie są
>>> dozwolone w trybie 64-bitowym. Dziwne, po co miano by usuwać
>>> instrukcje?
>>
>> Nie "nie są dozwolone" a "zostały usunięte"
> 
> Na jedno wychodzi: nie działają.
> 
>> (więc ich po prostu nie ma). żaden kompilator nie użyje
>> takich instrukcji - były one przeznaczone do ręcznego pisania
>> kodu w asemblerze, a ponieważ obecnie prawie się tego nie robi
>> - nie ma realnej potrzeby ich zachowywania w nowych procesorach.
> 
> W procesorze i tak muszą być, gdyż w trybie rzeczywistym i chronionym są.

Chodziło o zwolnienie kodów operacyjnych na przyszłość. Narazie kody 
zostały zwolnione i leżą odłogiem.

Mam już wersję 32-/64-bitową bez instrukcji DAA - zamiana tetrady na 
ASCII bez użycia skoków zajmuje nadal 4 instrukcje, ale wymaga użycia 
drugiego rejestru (np. edx), no i te instrukcje mają o parę bajtów więcej.
Re: Wynik w konsoli
#345
Author: Radoslaw Korzeniewski
Date: Thu, 22 Jun 2006 09:45
8 lines
1211 bytes
Wiktor S. napisał(a):
> ezoteryczne instrukcje, magiczne wartości i skoki, nad którymi trzeba 
> się kilka minut zastanawiać - ktoś tu mówił o skomplikowaniu? :-)
Przecież to klasyka gatunku, to się czyta jak poezję :)

pozdr

Radek
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