Like, if the CS register is 346AH, the code segment in main memory will be 346A0H, which is 20 bits. why do we do that?
Aparentemente, você está se referindo a segmentação x86 , conforme usado originalmente nas CPUs Intel 8086/88. Esse tipo de "segmento" não é universal. Existem outras definições para a memória " segmentos ".
Em um contexto histórico, você precisa perceber que a memória de silício e (ferrita) costumava ser muito cara. Para combater os caros computadores mainframe, o minicomputador surgiu na década de 1970 para fornecer um computador de baixo custo. Esse foco no baixo custo normalmente significava um barramento de endereços de 16 bits (por exemplo, DEC PDP, Data General Nova, HP 21xx) e até 64 KB de memória. Mas à medida que os requisitos do sistema aumentavam, mais memória era necessária.
Foram criados esquemas de memória que ainda podem usar os endereços de 16 bits existentes, mas que podem acessar mais memória.
A técnica mais comum para expandir a capacidade de memória de 64 Kb com endereços de 16 bits era usar bancos de memória, isto é, os bits superiores reais do endereço de memória efetivo são especificados por um registro de banco. A principal vantagem de usar bancos de memória é que ele pode ser implementado no subsistema de memória (ou seja, externo à CPU) e, portanto, adaptado para qualquer CPU.
Com o advento dos microprocessadores, os sistemas que utilizam endereçamento de 16 bits (por exemplo, o Intel 8051, o Zilog Z80) tenderam a evoluir de uma maneira semelhante, isto é, incorporando memória armazenada em banco.
O endereçamento de segmento usado pelo Intel x86 (e pelo menos um outro sistema que conheço) é integrado ao processador e, portanto, mais versátil.
Enquanto um banco de memória pode ocupar apenas uma região fixa no espaço de memória original, os segmentos x86 fornecem acesso a um espaço de endereçamento expandido de 20 bits usando um deslocamento de 16 bits combinado com uma especificação de um registrador de segmento.
O endereço do segmento x86 é, na verdade, um endereço de 20 bits truncado para apenas 16 bits de endereço.
Esse segmento pode iniciar em qualquer parágrafo (o endereço módulo 16 é zero).
Daí a necessidade de acrescentar os quatro bits zero truncados para obter o início real do segmento x86 no espaço de memória de 20 bits.
Dependendo do modelo de memória x86 , o software x86 poderia usar principalmente "endereços" de 16 bits (assim como os softwares mais antigos ), mas poderia acessar uma memória mais efetiva do que o antigo software de endereço de 16 bits.
Os segmentos IOW x86 eram um método de expandir o hardware para um barramento de endereços de 20 bits, mas permitem que o software use principalmente "endereços" de 16 bits e não requer aritmética de 20 bits (ou seja, registradores e dados).