Mais um blog inútil.

Arvorezinha

Abril 17, 2009

arvorezinha em pdp-11 assembly

Arquivado em: arvorezinha — dcoder @ 00:13

Exactamente como o título indica.

.globl
.data
star:.byte 52,0
newline:.byte 12,0

.globl  _main
.text
_main:
mov r0, -(sp)
mov r1, -(sp)
mov r2, -(sp)
mov r5, -(sp)

mov $1,r4
_loop1:
mov r4,r3
_loop2:
mov $star, (sp)
jsr pc, *$_printf
dec r3
tst r3
jne _loop2
mov $newline, (sp)
jsr pc, *$_printf
inc r4
cmp $5,r4
jge _loop1

mov (sp)+, r5
mov (sp)+, r2
mov (sp)+, r1
mov (sp)+, r0
rts pc

Testei isto no SIMH, a correr o glorioso 2.11BSD:

# cc -o x x.s
# ./x
*
**
***
****
*****
# uname -a
2.11BSD 2bsd 2.11BSD 2.11 BSD UNIX #1: Fri Jun 9 08:42:54 PDT 1995     root@SSU-64EN137:/usr/src/sys/SYSTEM  pdp11

Abril 15, 2009

Arvorezinha - PowerPC Assembly

Arquivado em: arvorezinha — falso @ 23:58

Ora viva!

Aqui estou de novo, agora com a arvorezinha em assembly de powerpc em OpenBSD! Segue o código, é muito parecido com o de mips tirando as comparações e uns loads…

# this powerpc assembly can never fail
.data
estrela: .ascii "*"
newline: .byte 0xa

# REGISTOS
# 13 - counter1
# 14 - counter2


.text                       # section declaration - begin code
        .global main
main:
        li      13,0    # counter1 e o registo 13

_ciclo1:
        li      15,5
        cmpw    13,15
        beq     _fim
        li      14,0    # counter2 e o registo 14

_ciclo2:
        cmpw    14,13
        beq     _estrela
        blt     _estrela

        lis     4,newline@ha
        addi    4,4,newline@l
        bl      _print

        addi    13,13,1
        b       _ciclo1

_estrela:
        lis     4,estrela@ha
        addi    4,4,estrela@l
        bl      _print

        addi    14,14,1
        b       _ciclo2

_fim:
        li      0,1         # syscall number (sys_exit)
        li      3,1         # first argument: exit code
        sc                  # call kernel

_print:
        li      0,4     # syscall 4 (sys_write)
        li      3,1     # stdout
        li      5,1     # tamanho
        sc              # do it fag!
        blr             # retorna a onde foi chamado

Uma imagem não precisa de palavras!
arvorezinha_ppc

Arvorezinha em amd64

Arquivado em: arvorezinha, assembly — dcoder @ 23:33

Viva sirs. Aparentemente o pessoal esqueceu-se desta arch por ja haver uma em x86. Este código é essencialmente igual ao do falso, excepto que as chamadas ao kernel são feitas com a instrução syscall em vez de int 0x80. Eis o código:

SECTION .data
     star db '*'
     newline db 10
SECTION .text
     global _start
_start:
     mov r8,  5
     lea r9, [r8-4]
     mov rdx, r9
     mov rdi, r9
     mov rax, r9
_loop1:
     mov rbx, r9
_loop2:
     mov rsi, star
     syscall
     dec rbx
     jnz _loop2
     inc r9
     mov rsi, newline
     syscall
     cmp r9, r8
     jbe _loop1

     mov al, 60
     dec rdi
     syscall

Resultado:

[dcoder@localhost useless]$ make
yasm -f elf64 arvore_amd64.asm
ld arvore_amd64.o -o arvore_amd64
rm *.o
[dcoder@localhost useless]$ ./arvore_amd64
*
**
***
****
*****
[dcoder@localhost useless]$

Abril 14, 2009

Fórmula da arvorezinha

Arquivado em: arvorezinha — dcoder @ 20:26

Viva amigos,

Já que andam todos aí a exportar árvores feitos baratas tontas, vou aproveitar e fazer o mesmo.

Seja L(n) o número correspondente à linha n da arvorezinha. Seja c o caracter utilizado para representar a árvore e b a base numérica utilizada para representar L(n). Então,

$ L(n) = c\frac{b^n-1}{b-1} $

Vamos experimentar criar uma arvorezinha em base 36, com o caracter ‘X’ (33 em base 36).

>b := 36;
c := 33;
for i in [1..5] do
  IntegerToString(c*((b^i-1) div (b-1)), b);
end for;

Podem experimentar isto aqui.

Arvorezinha - Prolog

Arquivado em: arvorezinha — falso @ 10:10

Olá bom dia!

O meu colega enviou me por mail mais uma nova versão da arvorezinha, desta vez em prolog. Aqui vai o sores:

stars(0).
stars(N) :- write('*'), M is N-1, stars(M).

arvorezinha(5).
arvorezinha(N):- M is N+1, stars(M),write('\n'),X is N+1,arvorezinha(X).

display:-arvorezinha(0).

display.

Abril 13, 2009

A minha arvorezeca em tcl ;]

Arquivado em: arvorezinha, coding — madinfo @ 18:54

by Juvenal

 #!/usr/bin/env tclsh
 set chars 40
 set bottom 4
 set bott 4
 set s " "
 set f *
 proc repeat {a b} {return [string repeat $a $b]}
 for {set a 1;set b [expr ($chars / 2)*2];set x $bott;set y [expr ($chars - $bottom)+1]} {$a < = $chars||$x>1} {incr a 1;incr b -1} {
  if {$a< =$chars} {set z [repeat $f $a];puts [repeat $s $b]$z$z} {
   set z [repeat $f $bottom];puts [repeat $s $y]$z$z;incr x -1
  }
 }

Arvorezinha em Ook!

Arquivado em: arvorezinha, coding, fail — madinfo @ 18:28

Aqui fica:

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook?
Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook?
Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook! Ook! Ook? Ook!
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook.
Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook? Ook! Ook.

Compilador disponivel aqui: http://search.cpan.org/~jhi/Acme-Ook-0.11/lib/Acme/Ook.pm

Já de si é fail pq é perl…

Chama-se a isto a linguagem dos orangotangos…

orangotango

Olá FALSO

Abril 10, 2009

Arvorezinha - Java Bytecode [e optimizado]

Arquivado em: arvorezinha — falso @ 14:58

Ora viva amigos.
Tive alta submissão por amigo meu e colega de trabalho de uma arvorezinha numa coisa mesmo verdadeiramente inutil. Tive mesmo de blogar sobre isso!
Esta arvorezinha é em java bytecode, só mesmo para quem ama!

.class public Avorezinha
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
	; set limits used by this method
	.limit locals 4
	.limit stack 3

	; setup local variables:
	;    1 - the PrintStream object held in java.lang.System.out
	getstatic java/lang/System/out Ljava/io/PrintStream;
	astore_1

	;    2 - the integer 10 - the counter used in the loop
	bipush 1
	istore_2

	; now loop 10 times printing out a number

Loop1:
	goto InitLoop2
endLoop1:
	aload_1    ; push the PrintStream object
	ldc ""
	invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

	; decrement the counter and loop
	iinc 2 1
	iload_2
	bipush 6
	isub
	ifne Loop1
	goto exit

InitLoop2:
	iload_2
	istore_3
Loop2:
	aload_1    ; push the PrintStream object
	ldc "*"
	invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
	iinc 3 -1
	iload_3
	ifne Loop2

	goto endLoop1

exit:
	; done
	return
.end method

Ele disse me que se tem de usar o assemblador Jasmin. Espero que amem porque esta eu amei mesmo bues!

EDIT: Estive a ver os comentarios, ele submeteu uma versao mais optizada aqui vai o código completo, copiado dos comentarios.

Aqui fica uma versão melhorada:
.class public Arvorezinha
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
.limit locals 4
.limit stack 3

bipush 1
istore 1 ; int i=1

InicioFor1:
iload 1
bipush 5
if_icmpgt SairFor1 ; i
bipush 0
istore 2 ; int j=0

InicioFor2:
iload 2
iload 1
if_icmpge SairFor2 ; j

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "*"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V ; System.out.print("*")

iinc 2 1 ; j++
goto InicioFor2
SairFor2:
getstatic java/lang/System/out Ljava/io/PrintStream;
invokevirtual java/io/PrintStream/println()V ; System.out.println()

iinc 1 1 ; i++
goto InicioFor1

SairFor1:
return
.end method

Abril 9, 2009

Arvorezinha - MS SQL Server

Arquivado em: arvorezinha — falso @ 10:37

No âmbito do projecto ARVOREZINHA, eis que o meu amiguinho spico, torna-se parte colaboradora do mesmo, com o seguinte código:

DECLARE @ASCIZZ NVARCHAR(5)
DECLARE @CONTADOR INT
SET @ASCIZZ = '*'
SET @CONTADOR = 0
WHILE @CONTADOR < = 5 
BEGIN
        PRINT REPLICATE(@ASCIZZ,@CONTADOR)
        SET @CONTADOR = @CONTADOR + 1
END

Abril 8, 2009

Arvorezinha - Z80 Assembly (TI86)

Arquivado em: arvorezinha — falso @ 23:48

Ora viva amigalhaços!

O mirage há dias já me tinha dito que a calculadora TI86 dele tinha um processador z80, e que eu devia fazer o port da arvorezinha do spectrum para ela. Então fui à descoberta de como fazer estas coisinhinhas lindas. Usei o programinha Assembly Studio 86 para assemblar e editar o codigo. E fui testando com o emulador VTI com a rom da TI86 obtida legalmente, claro.

O unico problema que me tenho a queixar é que na ti86, antes de se printar um caracter, tem que se definir a posição dele em x e y, o que é meio manhoso. Mas la consegui dar a volta!

#include "ti86asm.inc"

.org _asm_exec_ram

counter1: .db 0x0
counter2: .db 0x0

_start:
	call _clrLCD

_ciclo1:
	ld bc,(counter1)
	ld a,5
	cp c
	jr z,_fim
	ld a,0
	ld (counter2),a
_ciclo2:
	ld bc,(counter2)
	ld a,(counter1)
	cp c
	jr nc,_estrela

	add a,1
	ld (counter1),a
	jr	_ciclo1

_estrela:
	ld a,(counter1)
	ld (_curRow),a
	ld a,(counter2)
	ld (_curCol),a
	ld a,42
	call _putc

	ld a,(counter2)
	add a,1
	ld (counter2),a;
	jr _ciclo2;

_fim:
	ret

.end
END

E desta vez há provas em como funciona no hardware de verdade, o mirage experimentou o
programa compilado (.86p) na calculadora dele, e funcionou mesmo!

arvorezinha a correr nativamente numa ti86
arvorezinha a correr nativamente numa ti86