As tabelas de pesquisa foram mencionadas nos comentários. Existem duas abordagens.
Rápido
Crie uma tabela com 256 bytes de comprimento, com cada próximo valor a raiz quadrada do índice correspondente. Isso é rápido, pois você usa o argumento como índice para acessar diretamente o valor correto. A desvantagem é que ele precisa de uma tabela longa, com muitos valores duplicados.
Compacto
Como dito, um número inteiro de 8 bits pode ter apenas valores de 0 a 255 e as raízes quadradas correspondentes são de 0 a 16 (arredondadas). Construa uma tabela de 16 entradas (com base em zero) com a n-ésima entrada o valor máximo para o argumento para o qual a raiz quadrada é n. A tabela ficaria assim:
0
2
6
12
20
etc.
Você percorre a tabela e para quando encontra um valor maior ou igual ao seu argumento. Exemplo: raiz quadrada de 18
set index to 0
value[0] = 0, is less than 18, go to the next entry
value[1] = 2, is less than 18, go to the next entry
value[2] = 6, is less than 18, go to the next entry
value[3] = 12, is less than 18, go to the next entry
value[4] = 20, is greater than or equal to 18, so sqrt(18) = 4
Embora a tabela de pesquisa rápida tenha um tempo de execução fixo (apenas uma pesquisa), aqui o tempo de execução é mais longo para argumentos de valor mais alto.
Para os dois métodos, ao escolher valores diferentes para a tabela, você pode selecionar entre um valor arredondado ou um truncado para a raiz quadrada.