Em geral, wordsize
é decidido na arquitetura de destino durante a compilação. Seu compilador normalmente compilará usando wordsize
para o sistema atual.
Usando gcc
(entre outros), você também pode ajustar isso usando vários sinalizadores. Por exemplo. em um host de 64 bits, você pode compilar para 32 bits máquina, ou força palavras de 32 bits.
-m32 # int, long and pointer to 32 bits, generates code for i386.
-m64 # int, long and pointer to 64 bits, generates code for x86-64.
-mx32 # int, long and pointer to 32 bits, generates code for x86-64.
Você também deve olhar para limits.h
e inttypes.h
para ver o uso desse
definição.
Para a compilação cruzada, consulte multilib ( link de 32 bits no SO ) e pesquisa na Web.
Verifique com que flags seu GCC foi criado:
gcc -v
Quanto aos tamanhos, eles geralmente estão intimamente relacionados à unidade central de processamento e relacionado - como tamanho máximo de um endereço de memória, tamanho dos registradores da CPU etc.
Para um rápido vislumbre, você não precisa entender muito disso, mas dependendo em onde você está , pode dar uma ideia:
Se você usar gcc
e compilar com o -S
flag, também poderá ver as instruções de montagem . Aqui, um pouco confuso, por ex. Máquina de 32 bits
palavra é de 16 bits e longa é de 32 bits. ( __WORDSIZE
)
Então, por exemplo movl $123, %eax
significa mover muito tempo (32 bits - __WORDSIZE
) 123
para eax
register e movw
significa mover palavra (16 bits).
Isto é convenções de nomenclatura - e apenas para dizer que WORDSIZE
pode significar mais
então uma coisa. Você também pode encontrar o código em que, por exemplo, definir algo
como
#define WORD_SIZE 16
como tudo depende do contexto. Se você ler dados de um arquivo ou fluxo onde
fonte tem tamanho de palavra de 16 bits, isso seria natural. Apenas para salientar que
nem sempre assume que tamanho de palavra significa __WORDSIZE
quando lido em código.
Exemplo com WORD_SIZE
definido pelo usuário não afetaria o conjunto de instruções no
código de máquina gerado. Para o GCC, em geral, recomendo este livro . (Infelizmente é um pouco antigo - mas ainda não encontrou um livro semelhante e fácil de ler mais. (Não que eu tenha parecido tão difícil.) É curto, conciso e doce. em
Lembre-se de que as coisas podem ter mudado, tais como características adicionais, etc., mas não é uma boa introdução.
Ele fornece uma introdução rápida e agradável dos vários aspectos ao compilar. Veja o capítulo 11 para uma boa explicação sobre a cadeia de compilação.
Eu não sei de nenhuma opção no GCC para compilar 16 bits. Uma maneira de fazer isso
ser para escrever em assembly usando .code16
para instruir o código deve ser de 16 bits.
Exemplo:
.file "hello.s"
.text
.code16 /* Tel GAS to use 16-bit instructions. */
.globl start, _start
start:
_start:
movb $0x48, %al
...
Isso é necessário, por exemplo, carregadores de inicialização, como GRUB e LILO, para o código
presente em MBR
no seu disco rígido.
A razão para isto é que quando o seu computador inicializa a CPU está em um especial modo onde não tem instruções de 32 bits, mas máximo de 16 bits AKA Modo Real .
Em suma, o que acontece é que o BIOS faz um teste de hardware, então
carrega os primeiros 512 bytes do seu disco de inicialização na memória e deixa o controle para
esse código começa no endereço 0
. Este código, por sua vez, localiza onde próxima etapa
de arquivos residem, carregue-os na memória e continue executando finalmente entrando
Modo Protegido onde você tem o modo normal de 32 bits.