TalismanChet
@TalismanChet
Лицо зла

Почему не работает ввод?

Я пишу загрузчик под UEFI, который должен работать как POSIX-подобная оболочка, только код для обработки ввода - не работает

Note: я исправил обработку bs, теперь он печатается 1, а не 2 раза.

Код обработки ввода:

__scanln:
	; scan key
	mScankey __key_buf
	; print key
	mPrint __key_buf+2
	; load key
	mov si, word [__key_buf+2]
	; if button is [Backspace], print [Space] and [Backspace]
	cmp si, word 8
	je .backspace
	; if button is [Enter], end listening
	cmp si, word 13
	je .exit
	; otherwise, save character and repeat
	mov [rbx], word null
	; shift buffer pointer
	add rbx, 2
	jmp __scanln
.backspace:
	mov [__key_buf+2], word ' '
	mPrint __key_buf+2
	mPrint __bs_string;, __bs_string
	; repeat
	jmp __scanln
.exit:
	; end the buffer and exit
	mov [rbx], word null
	mReturn


макросы:
листинг побольше
macro mPrint [_str] {
    if ~_str eq 
    forward
	uefi_call_wrapper ConOut, OutputString, ConOut, _str
	end if
}

macro mClear {
	if ~ 0 eq 1
	mCall __clear_screen
	end if
}

macro mNewline [times_] {
	if times_ eq 
	mPrintln
	else
	repeat times_
		mPrintln
	end repeat
	end if
}

macro mPrintln [_str] {
	if ~ _str eq 
	forward
	mPrint _str
	mPrint __crlf
	else
	mPrint __crlf
	end if
}

macro mScankey _key {
	if ~ _key eq 
	mov [_key], dword 0
@@:
	uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, _key
	cmp dword [_key], 0
	jz @b
	end if
}

macro mScankeys _buffer, _times {
	if ~ _buffer eq 
	if ~ _times eq 
		mov rcx, _times
		mov rbx, _buffer
		call __scankeys
	end if
	end if
}

macro mScanln _buffer {
	if ~ buffer eq 
	mov rbx, _buffer
	call __scanln
	end if
}


после ввода 1 буквы код фризит, и я уже перебрал более чем по 15 возможных реализаций для обработкика для CR, LF и CRLF окончаний строки.

репозиторий: GitHub

Запускаю я код на реальном железе через rEFInd
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Иван Четчасов в твоих вопросах повторяется один и тот же паттерн: у тебя что-то не работает, ты приводишь обрывок кода (обычно не относящийся к проблеме) и ничего не говоришь о том, как ты пытался решить проблему.
Я предлагаю тебе сделать следующее с этим и всеми последующими вопросами:
- добавить в вопрос ссылку на репозиторий со всем кодом который можно было бы склонировать и собрать
- добавить в вопрос описание того, как ты запускаешь код, так, чтобы кто угодно мог воспроизвести твои результаты
- добавить в вопрос описание того, как ты пытался диагностировать и решить проблему

Без этого создаётся впечатление, что ты просто приходишь сюда покрасоваться.

В приведённом коде я не вижу никаких проблем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы