Пока что я пишу реализацию односвязного списка.
Now I'm working on single linked list.
Этот участок кода добавляет экземпляр структуры в список, простой подменой адреса в head.
This code adds struct in list, by simple address change in head
Код:
movi eax, sizeof.ftdi_context
call Kmalloc
test eax, eax
jnz @f
mov esi, nomemory_msg
call SysMsgBoardStr
jmp .return0
@@:
mov ebx, [head] ;Сохраняем указатель на начало списка в ебх
mov [head], eax ;Делаем новую структура головой списка
mov [eax + ftdi_context.next_context], ebx ;Помещаем в голову указатель на следующую структура
Этот участок кода удаляет нужный экземпляр стуктуры из списка
This code deletes given struct from list
Код:
mov edi, ftdi_context
cmp edi, [head]
jz .unlink_head
mov eax, [head]
.getnext:
mov ebx, eax
mov eax, [eax+ftdi_context.next_context]
cmp eax, [edi]
jz .unlink
jmp .getnext
.unlink:
mov ebx+ftdi_context.next_context, [ftdi_context.next_context] ;!!!Возможно проблемы с []
jmp @f
.unlink_head:
mov head, [ftdi_context.next_context]
@@:
movi eax, ftdi_context
call Kfree
Пока что, ничего из этого не тестировалось, так что, если на лицо явные опечатки или ошибки, не подсказывайте)
Также у меня уже есть вопрос, как мне правильно пользоваться callback'ами в вызовах USB*TransferAsync? Дело в том, что я не могу понять зачем мне асинхронность, я был бы очень рад если бы функции были блокирующими. Ведь допустим прикладная программа запрашивает данные с устройства, получаются, что они нужны уже и сейчас. Как решается такая проблема? Мне пришло в голову только после вызова USB*TransferAsync впадать в цикл с выходом по флагу, который выставляется в callback'е.
Nothing of that tested so far, so if you find typos or mistakes, please don't suggest while) Also I have a question about how to use callback in USB*TransferAsync? The point is, I don't understand why I need async, I would be really happy if those functions are blocking. For example, application asks driver to obtain data from device, it turns out that data is needed right now. How to solve this problem? The only way I see now is to put a loop after each USB*TransferAsync, and wait for callback function to raise some flag.