Skip to content

Instantly share code, notes, and snippets.

@biern
Created May 4, 2011 16:46
Show Gist options
  • Save biern/955545 to your computer and use it in GitHub Desktop.
Save biern/955545 to your computer and use it in GitHub Desktop.
## Przykładowo:
## N=5, A B C
## A A B C C
## A B B B C
## B B B B B
## A B B B C
## A A B C C
## - stałe systemowe -
.equ kernel, 0x80
.equ stdout, 1
.equ exit, 0x01
.equ write, 0x04
.equ create, 0x08 #create file function
.equ close, 0x06 #close file function
.data
N:
.long 11
A:
.long '-'
B:
.long 'o'
C:
.long '|'
change_point:
.long 0
char:
.ascii "X"
.text
.global _start
_start:
CALL write_tree
JMP quit
.type write_tree, @function
write_tree:
MOVL N, %ecx
write_tree_loop:
PUSH %ecx
MOVL %ecx, %edx
DEC %edx
CALL write_tree_row
POP %ecx
LOOP write_tree_loop
RET
.type write_tree_row, @function
## wejście
## edx - index rzędu
## zmienne:
## change_point - pierwszy próg zmiany znaku
## char - znak który aktualnie wypisujemy
write_tree_row:
## Znajdujemy środek (wynik -> eax, reszta: %edx)
PUSH %edx
MOVL N, %eax
XOR %edx, %edx
MOVL $2, %ebx # dzielimy przez 2
DIV %ebx
POP %edx
## Zmiana indeksu rzędu (0, 1, 2, 3, 4) -> (0, 1, 2, 1, 0)
## Jeśli indeks jest większy od połowy, znajdujemy różnicę między
## połową a indeksem, i odejmujemy ją od połowy :-)
CMPL %eax, %edx
JBE _tree_row_noswap
## operacja zamiany
MOVL %eax, %ebx
SUB %ebx, %edx
SUB %edx, %ebx
MOVL %ebx, %edx
_tree_row_noswap:
## próg zmiany (change_point)
## odejmujemy index rzędu
SUB %edx, %eax
MOVL %eax, change_point
## Wypisywanie
MOVL A, %eax
MOVL %eax, char
## %eci - Licznik pętli indeksujący od 0
XOR %esi, %esi
MOVL N, %ecx
_tree_row_write:
PUSH %ecx
## pisanie
CMPL %esi, change_point
JBE _tree_row_change_char
JMP _tree_row_write_char
_tree_row_change_char:
## zmiana na B lub C
CMPL %ecx, change_point
JAE _tree_row_change_char_C
## zmiana na B
MOVL B, %eax
MOVL %eax, char
JMP _tree_row_write_char
_tree_row_change_char_C:
MOVL C, %eax
MOVL %eax, char
_tree_row_write_char:
MOVL $write, %eax
MOVL $stdout, %ebx
MOVL $char, %ecx
MOVL $1, %edx
INT $kernel
POP %ecx
INC %esi
LOOP _tree_row_write
## Nowa linia
MOVL $'\n', char
MOVL $write, %eax
MOVL $stdout, %ebx
MOVL $char, %ecx
MOVL $1, %edx
INT $kernel
RET
quit:
MOV $exit, %eax
INT $kernel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment