A soluçao é bem simples.
Só não é mais simples porque TH0 e TL0 não são "vizinhos", então não dá pra jogar direto pra uma int.
Se é HEX ou Bin ou Dec não importa, isso é só a forma como é mostrado, o conteudo (valor) é o mesmo.
para ler TH0 e TL0:
unsigned int VALOR;
...
VALOR = (TH0 >>

+ TL0;
A sua pergunta não esta bem clara, mas para fazer um timer de 1 ms precisamos saber qual o valor do cristal usado.
você pode conseguir estes calculos nos livros
para escreve o valor em TH0 e TL0 é bem fácil usar algo como
TH0 = HIGH VALOR;
TL0 = LOW VALOR;
Não tenho certeza se funciona em todos os compiladores, pode fazer assim também:
TH0 = VALOR <<8;
TL0 = VALOR;
Observe que quando copia um inteiro de 16 bits para 8 bits ele copia a parte baixa, por isso não precisa colocar nenhum mascaramento.
Alguns compiladores como o KEIL interpreta o <<8 para pegar a parte alta do valor, o código fica bem otimizado, ele não vai realmente fazer os 8 deslocamentos.
Para medir a largura do pulso você tem de saber quantos pulsos corresponde a 1ms em um determinado tempo, o resto é só regrinha de três.