Assembly x86/Registos: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição
Edudobay (discussão | contribs)
Sem resumo de edição
Linha 2:
{{Wikipedia|Registrador (informática)}}
 
== Registos de usoUso geralGeral ==
Os 8 GPRs, ou Registos de Uso Geral, são os seguintes (por ordem de introdução nona stackpilha ao executar a instrução PUSHAD): (
 
*'''EAX''' - Acumulador<u>A</u>cumulador. Usado em operações aritméticas.
*'''ECX''' - Contador<u>C</u>ontador. Usado em loops.
*'''EDX''' - Registo de dados<u>D</u>ados. Usado em operações de entrada/saidasaída e em multiplicações e divisões. É também uma extensão do Acumulador.
*'''EBX''' - Ponteiro-base<u>B</u>ase. Usado para apontar para dados no segmento DS.
*'''ESP''' - Apontador da Pilha (''Stack Pointer''). Aponta para o topo da pilha (endereço mais baixo dos elementos da pilha).
*'''EBP''' - Apontador do frame. Usado para aceder a argumentos de funções passados pela pilha às funções que são chamadas.
*'''ESI''' - Índice da fonte de dados a copiar (''Source Index''). Aponta para dados a copiar para DS:EDI.
*'''EDI''' - Índice do destino de dados a copiar (''Destination Index''). Aponta para o destino dos dados a copiar de DS:ESI.
 
Estes 8 registos têm 32 bits cada um e dizem-se ExtendidosEstendidos. Os 16 bits de ordem mais baixa de cada um dos registos podem ser acedidos atraves das versões não extendidasestendidas. As versões não extendidasestendidas têm nomes iguais às extendidasestendidas, com a excepção de que a letra '''E''' é retirada (ex: EAX ->&rarr; AX). As versões extendidasestendidas dos registos não existem em gerações anteriores à 80386 ― a primeira geração de processadores 32 bits da arquitectura x86.
 
As versões não extendidasestendidas dos quatro primeiros GPRs dividem-se ainda em dois grupos de 8 bits cada um. O octeto (byte) de ordem mais alta é acedido trocando o '''X''' por um '''H''' (ex: AX ->&rarr; AH), e o octeto de ordem mais baixa trocando o '''X''' por um '''L''' (ex: AX ->&rarr; AL).
 
<trdiv style="background-color: blue#eee; colorpadding: white10px;">
''NOTA'Nota:''' Nos processadores de arquitecturas que implementam o AMD64/EM64T, os GPRs têm 64 bits (masapenas só emno Modo Longo), e chamam-se RAX, RCX, RDX, ''et-cetera''etc.</div>
 
== Registos de segmento ==
Há 6 registos de segmento.
 
*'''CS''' - Segmento do Código.
*'''DS''' - Segmento de Dados.
*'''ES''' - Segmento com dados extra.extras
*'''FS''' - Segmento com mais dados.
*'''GS''' - Segmento com ainda mais dados.
*'''SS''' - Segmento da Pilha.
 
Os segmentos são uma idosincrasiaidiossincrasia da arquitectura x86, não existindo em praticamente mais nenhuma arquitectura. Sendo assim, os compiladores de linguagens de alto nivelnível geralmente caiem no mínimo denominador comum e optam por ignorar os segmentos. Por essa razão, os sistemas operativos modernos para x86 (incluindo o Windows e o Linux) tipicamente fazem todos os registos de segmento apontar para o mesmo segmento de 4GB. As excepções a essa regra são normalmente o FS e o GS, que são usados para isolar as secções de dados das diferentes threads de um mesmo processo. As outras arquitecturas utilizam registos especiais chamados '''registos de thread''' para fazer a mesma coisa, os quais não existem no x86.
 
== Registo das flags ==
O registo das flags é chamado '''EFLAGS''' (Extended flagsFlags) nas arquitecturas de 32 bits, sendo que a sua versão de 16 bits é chamada simplesmente FLAGS. Tal como com os GPRs, os processadores x86 anteriores ao i386 não pussuempossuem a versão de 32 bits. Nos processadores de 64 bits, este registo também tem 64 bits e chama-se RFLAGS.
 
No esquema em baixoabaixo, os 16 bits menos significativos aparecem a cinza, enquanto que os bits a azul apenas existem em processadores da geração do i386 ou posteriores.
 
<table width=100%{| style="text-align: center;"> width="100%"
|-
<tr>
<td>| 31</td> <td>|| 30</td> <td>|| 29</td> <td>|| 28</td> <td>|| 27</td> <td>|| 26</td> <td>|| 25</td> <td>|| 24</td>
<td>| 23</td> <td>|| 22</td> <td>|| 21</td> <td>|| 20</td> <td>|| 19</td> <td>|| 18</td> <td>|| 17</td> <td>|| 16</td>
<tr|- style="background-color: #77777733c; color: white;">
</tr>
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0
 
| 0 || 0 || ID || VIP || VIF || AC || VM || RF
<tr style="background-color: blue; color: white;">
|-
<td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td>
! colspan="16" | &nbsp;
<td>0</td> <td>0</td> <td>ID</td> <td>VIP</td> <td>VIF</td> <td>AC</td> <td>VM</td> <td>RF</td>
|-
</tr>
| 15 || 14 || 13 || 12 || 11 || 10 || 9 || 8
 
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0
<tr><th colspan=16 height=5></th></tr>
<tr><th colspan=16|- style="background-color: black#777777; color: white;"></th></tr>
| 0 || NT || colspan=2 | '''IOPL''' || OF || DF || IF || TF
 
| SF || ZF || 0 || AF || 0 || PF || 1 || CF
<tr>
|}
<td>15</td> <td>14</td> <td>13</td> <td>12</td> <td>11</td> <td>10</td> <td>9</td> <td>8</td>
<td>7</td> <td>6</td> <td>5</td> <td>4</td> <td>3</td> <td>2</td> <td>1</td> <td>0</td>
</tr>
 
<tr style="background-color: #777777; color: white;">
<td>0</td> <td>NT</td> <th colspan=2>IOPL</td> <td>OF</td> <td>DF</td> <td>IF</td> <td>TF</td>
<td>SF</td> <td>ZF</td> <td>0</td> <td>AF</td> <td>0</td> <td>PF</td> <td>1</td> <td>CF</td>
</tr>
</table>
 
Ao carregar um novo valor no EFLAGS, os bits que aparecem no esquema como 1 ou 0 devem ser carregados como tal, de modo a preservar a compatibilidade do software com gerações futuras da arquitectura.
Linha 67 ⟶ 60:
O Apontador de execução, ou Instruction Pointer (genericamente conhecido na ciência da computação por Program Counter), do x86 é um registo interno que aponta para a '''próxima''' instrução a ser executada.
 
Como sempre, o seu nome é EIP e a parte que contem os 16 bits menos significativos denomina-se IP. Note-se que utilizar um método convencional para aceder a este registo produz um erro do assembladormontador (''assembler''), uma vez que o x86 não fornece nenhuma forma de aceder directamente ao Apontador de Execução.
 
[[Categoria: Assembly de x86|Registos]]