Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .text
- .global tree_find
- tree_find:
- //стандартный пролог
- pushl %ebp
- movl %esp, %ebp
- // присваиваем xmm1 правиьное значение
- pushl $0x7fffffff
- pushl $0xffffffff
- movsd (%esp), %xmm1
- addl $8, %esp
- // %xmm0 - ключ
- // проверка на head == NULL
- movl 8(%ebp), %eax
- test %eax, %eax
- jz exit
- movsd 12(%ebp), %xmm0
- // search
- loop:
- // кладем E в xmm4
- pushl $0x3e45798e
- pushl $0xe2308c3a
- movsd (%esp), %xmm4
- addl $8, %esp
- movsd (%eax), %xmm1
- movsd %xmm1, %xmm3
- subsd %xmm0, %xmm1
- pand %xmm1, %xmm1
- // сравниваем E и xmm1
- comisd %xmm4, %xmm1
- // если совпали
- jbe result
- comisd %xmm0, %xmm3
- ja right
- // если меньше
- left: movl 8(%eax), %eax
- test %eax, %eax
- jz exit
- jmp loop
- // если больше
- right: movl 12(%eax), %eax
- test %eax, %eax
- jz exit
- jmp loop
- // нормальный эпилог
- result:
- movl 20(%ebp), %ecx
- test %ecx, %ecx
- jz no_str
- pushl %esi
- movl 16(%eax), %esi
- movl %esi, (%edx)
- popl %esi
- movl %eax, (%ecx)
- movl $1, %eax
- movl %ebp, %esp
- popl %ebp
- ret
- // эпилог если нет ссылки на строку
- no_str:
- movl $1, %eax
- movl %ebp, %esp
- popl %ebp
- ret
- // эпилог если head == NULL_ptr
- exit: movl $0, %eax
- movl %ebp, %esp
- popl %ebp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement