Created
May 4, 2011 16:46
-
-
Save biern/955545 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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