Menu English Ukrainian Russo Início

Biblioteca técnica gratuita para amadores e profissionais Biblioteca técnica gratuita


Информатика и информационные технологии. Структуры команд на Ассемблере (конспект лекций)

Notas de aula, folhas de dicas

Diretório / Notas de aula, folhas de dicas

Comentários do artigo Comentários do artigo

Índice (expandir)

PALESTRA Nº 16. Programas de Montagem

1. A estrutura do programa em assembler

Um programa em linguagem assembly é uma coleção de blocos de memória chamados segmentos de memória. Um programa pode consistir em um ou mais desses segmentos de blocos. Cada segmento contém uma coleção de sentenças de linguagem, cada uma das quais ocupa uma linha separada de código de programa.

As instruções de montagem são de quatro tipos:

1) comandos ou instruções, que são análogos simbólicos de comandos de máquina. Durante o processo de tradução, as instruções de montagem são convertidas nos comandos correspondentes do conjunto de instruções do microprocessador;

2) macros. São frases do texto do programa que são formalizadas de certa forma e são substituídas por outras frases durante a transmissão;

3) diretivas, que são uma indicação ao tradutor do montador para realizar determinadas ações. As diretivas não têm contrapartida na representação da máquina;

4) linhas de comentários contendo quaisquer caracteres, incluindo letras do alfabeto russo. Comentários são ignorados pelo tradutor.

2. Sintaxe de Montagem

As frases que compõem um programa podem ser uma construção sintática correspondente a um comando, macro, diretiva ou comentário. Para que o tradutor montador os reconheça, eles devem ser formados de acordo com certas regras sintáticas. Para fazer isso, é melhor usar uma descrição formal da sintaxe da linguagem, como as regras da gramática. As maneiras mais comuns de descrever uma linguagem de programação dessa maneira são diagramas de sintaxe e formulários Backus-Naur estendidos. Para uso prático, os diagramas de sintaxe são mais convenientes. Por exemplo, a sintaxe das instruções da linguagem assembly pode ser descrita usando os diagramas de sintaxe mostrados nas figuras a seguir.

Arroz. 4. Formato de frase de montagem

Arroz. 5. Formato da Diretiva

Arroz. 6. Formato de comandos e macros

Nesses desenhos:

1) nome do rótulo - um identificador, cujo valor é o endereço do primeiro byte da frase do código-fonte do programa que ele denota;

2) nome - um identificador que distingue esta diretiva de outras diretivas de mesmo nome. Como resultado do processamento pelo montador de uma determinada diretiva, certas características podem ser atribuídas a esse nome;

3) um código de operação (COP) e uma diretiva são designações mnemônicas da instrução de máquina, macroinstrução ou diretiva tradutora correspondente;

4) operandos - partes do comando, macro ou diretivas do montador, denotando objetos nos quais as operações são executadas. Os operandos Assembler são descritos por expressões com constantes numéricas e de texto, rótulos de variáveis ​​e identificadores usando sinais de operador e algumas palavras reservadas.

Como usar diagramas de sintaxe? É muito simples: tudo o que você precisa fazer é encontrar e seguir o caminho da entrada do diagrama (esquerda) até a saída (direita). Se tal caminho existir, então a sentença ou construção está sintaticamente correta. Se não houver esse caminho, o compilador não aceitará essa construção. Ao trabalhar com diagramas de sintaxe, preste atenção na direção da travessia indicada pelas setas, pois entre os caminhos pode haver aqueles que podem ser seguidos da direita para a esquerda. De fato, os diagramas sintáticos refletem a lógica do tradutor ao analisar as sentenças de entrada do programa.

Os caracteres permitidos ao escrever o texto dos programas são:

1) todas as letras latinas: A - Z, a - z. Nesse caso, letras maiúsculas e minúsculas são consideradas equivalentes;

2) números de 0 a 9;

3) sinais ?, @, S, _, &;

4) separadores.

As frases de montagem são formadas a partir de lexemas, que são sequências sintaticamente inseparáveis ​​de símbolos de linguagem válidos que fazem sentido para o tradutor.

Os tokens são os seguintes.

1. Identificadores são sequências de caracteres válidos usados ​​para designar objetos de programa, como códigos de operação, nomes de variáveis ​​e nomes de rótulos. A regra para escrever identificadores é a seguinte: um identificador pode consistir em um ou mais caracteres. Como caracteres, você pode usar letras do alfabeto latino, números e alguns caracteres especiais - _, ?, $, @. Um identificador não pode começar com um caractere de dígito. O comprimento do identificador pode ser de até 255 caracteres, embora o tradutor aceite apenas os primeiros 32 e ignore o restante. Você pode ajustar o comprimento dos identificadores possíveis usando a opção de linha de comando mv. Além disso, é possível dizer ao tradutor para distinguir entre letras maiúsculas e minúsculas ou ignorar sua diferença (o que é feito por padrão). As opções de linha de comando /mu, /ml, /mx são usadas para isso.

2. Cadeias de caracteres - sequências de caracteres entre aspas simples ou duplas.

3. Inteiros em um dos seguintes sistemas numéricos: binário, decimal, hexadecimal. A identificação de números ao escrevê-los em programas assembler é realizada de acordo com certas regras:

1) os números decimais não exigem a identificação de caracteres adicionais, por exemplo, 25 ou 139;

2) para identificar os números binários no texto fonte do programa, é necessário colocar o "b" latino depois de escrever os zeros e uns que os compõem, por exemplo, 10010101 b;

3) Os números hexadecimais têm mais convenções ao escrever:

a) em primeiro lugar, são constituídos por números 0...9, letras minúsculas e maiúsculas do alfabeto latino a, b, c, d, e, Gili D B, C, D, E, E

b) em segundo lugar, o tradutor pode ter dificuldade em reconhecer números hexadecimais devido ao facto de estes poderem consistir apenas em dígitos 0...9 (por exemplo, 190845) ou começar com uma letra do alfabeto latino (por exemplo, efl5). Para “explicar” ao tradutor que um determinado token não é um número decimal ou um identificador, o programador deve destacar o número hexadecimal de uma forma especial. Para fazer isso, escreva a letra latina “h” no final da sequência de dígitos hexadecimais que compõem um número hexadecimal. Isso é um dever. Se um número hexadecimal começar com uma letra, um zero à esquerda será escrito antes dele: 0 efl5 h.

Assim, descobrimos como as sentenças de um programa montador são construídas. Mas esta é apenas a visão mais superficial.

Quase todas as frases contêm uma descrição do objeto sobre o qual ou com a ajuda de alguma ação é realizada. Esses objetos são chamados de operandos. Eles podem ser definidos da seguinte forma: operandos são objetos (alguns valores, registradores ou posições de memória) que são afetados por instruções ou diretivas, ou são objetos que definem ou refinam a ação de instruções ou diretivas.

Operandos podem ser combinados com operadores aritméticos, lógicos, bit a bit e de atributo para calcular algum valor ou determinar um local de memória que será afetado por um determinado comando ou diretiva.

Vamos considerar com mais detalhes as características dos operandos na seguinte classificação:

1) operandos constantes ou imediatos - um número, string, nome ou expressão que possui algum valor fixo. O nome não deve ser relocável, ou seja, não deve depender do endereço do programa a ser carregado na memória. Por exemplo, pode ser definido com os operadores igual ou =;

2) operandos de endereço, defina a localização física do operando na memória especificando dois componentes do endereço: segmento e deslocamento (Fig. 7);

Arroz. 7. Sintaxe de descrição dos operandos de endereço

3) operandos relocáveis ​​- quaisquer nomes simbólicos representando alguns endereços de memória. Esses endereços podem indicar a localização de memória de algumas instruções (se o operando for um rótulo) ou dados (se o operando for o nome de uma localização de memória no segmento de dados).

Os operandos realocáveis ​​diferem dos operandos de endereço, pois não estão vinculados a um endereço de memória física específico. O componente de segmento do endereço do operando que está sendo movido é desconhecido e será determinado após o programa ser carregado na memória para execução.

O contador de endereços é um tipo específico de operando. Ele é denotado pelo sinal S. A especificidade deste operando é que quando o tradutor montador encontra este símbolo no programa fonte, ele substitui o valor atual do contador de endereços. O valor do contador de endereços, ou contador de posicionamento, como às vezes é chamado, é o deslocamento da instrução de máquina atual desde o início do segmento de código. No formato de listagem, a segunda ou terceira coluna corresponde ao contador de endereços (dependendo se a coluna com o nível de aninhamento está ou não presente na listagem). Se tomarmos qualquer listagem como exemplo, fica claro que quando o tradutor processa a próxima instrução do montador, o contador de endereços aumenta o comprimento da instrução de máquina gerada. É importante compreender este ponto corretamente. Por exemplo, o processamento de diretivas do assembler não altera o contador. As diretivas, ao contrário dos comandos do montador, são apenas instruções para o compilador executar determinadas ações para formar a representação da máquina do programa, e para elas o compilador não gera nenhuma construção na memória.

Ao usar tal expressão para saltar, fique atento ao comprimento da própria instrução na qual esta expressão é utilizada, pois o valor do contador de endereços corresponde ao deslocamento no segmento de instrução desta instrução, e não da instrução que a segue. . Em nosso exemplo, o comando jmp leva 2 bytes. Mas tenha cuidado, o comprimento de uma instrução depende de quais operandos ela usa. Uma instrução com operandos de registrador será menor que uma instrução com um de seus operandos localizado na memória. Na maioria dos casos, esta informação pode ser obtida conhecendo o formato da instrução de máquina e analisando a coluna de listagem com o código objeto da instrução;

4) operando de registro é apenas um nome de registro. Em um programa montador, você pode usar os nomes de todos os registradores de uso geral e da maioria dos registradores do sistema;

5) operandos base e índice. Este tipo de operando é usado para implementar a base indireta, endereçamento de índice indireto ou combinações e extensões dos mesmos;

6) Operandos estruturais são usados ​​para acessar um elemento específico de um tipo de dado complexo chamado estrutura.

Registros (semelhantes a um tipo struct) são usados ​​para acessar um campo de bits de algum registro.

Operandos são componentes elementares que fazem parte de uma instrução de máquina, denotando os objetos nos quais a operação é executada. Em um caso mais geral, os operandos podem ser incluídos como componentes em formações mais complexas chamadas expressões. Expressões são combinações de operandos e operadores considerados como um todo. O resultado da avaliação da expressão pode ser o endereço de alguma célula de memória ou algum valor constante (absoluto).

Já consideramos os tipos possíveis de operandos. Agora listamos os possíveis tipos de operadores de montador e as regras sintáticas para a formação de expressões de montador, e damos uma breve descrição dos operadores.

1. Operadores aritméticos. Esses incluem:

1) unário "+" e "-";

2) binário "+" e "-";

3) multiplicação "*";

4) divisão inteira "/";

5) obtendo o resto da divisão "mod".

Esses operadores estão localizados nos níveis de precedência 6,7,8 na Tabela 4.

Arroz. 8. Sintaxe das operações aritméticas

2. Os operadores de deslocamento deslocam a expressão pelo número especificado de bits (Fig. 9).

Arroz. 9. Sintaxe dos operadores de turno

3. Os operadores de comparação (retornam o valor "true" ou "false") destinam-se à formação de expressões lógicas (Fig. 10 e Tabela 3). O valor lógico "true" corresponde a uma unidade digital e "false" - a zero.

Arroz. 10. Sintaxe dos operadores de comparação

Tabela 3. Operadores de comparação

4. Os operadores lógicos realizam operações bit a bit em expressões (Fig. 11). As expressões devem ser absolutas, ou seja, tais, cujo valor numérico possa ser calculado pelo tradutor.

Arroz. 11. Sintaxe dos operadores lógicos

5. Operador de índice []. Os parênteses também são um operador, e o tradutor percebe sua presença como uma instrução para adicionar o valor de expression_1 atrás desses colchetes com expression_2 entre colchetes (Fig. 12).

Arroz. 12. Sintaxe do operador de índice

Observe que a seguinte designação é adotada na literatura sobre assembler: quando o texto se refere ao conteúdo de um registrador, seu nome é tomado entre parênteses. Também vamos aderir a esta notação.

6. O operador de redefinição de tipo ptr é usado para redefinir ou qualificar o tipo de um rótulo ou variável definida por uma expressão (Fig. 13).

O tipo pode ter um dos seguintes valores: byte, word, dword, qword, tbyte, near, far.

Arroz. 13. Sintaxe do operador de redefinição de tipo

7. O operador de redefinição de segmento ":" (dois pontos) força o cálculo de um endereço físico relativo a um componente de segmento especificamente especificado: "segment register name", "segment name" da diretiva SEGMENT correspondente ou "group name" (Fig. . 14). Ao discutir a segmentação, falamos sobre o fato de que o microprocessador no nível de hardware suporta três tipos de segmentos - código, pilha e dados. O que é esse suporte de hardware? Por exemplo, para selecionar a execução do próximo comando, o microprocessador deve necessariamente olhar o conteúdo do registrador de segmento cs e somente ele. E esse registrador, como sabemos, contém o endereço físico (ainda não deslocado) do início do segmento de instrução. Para obter o endereço de uma instrução específica, o microprocessador precisa multiplicar o conteúdo de cs por 16 (o que significa um deslocamento de quatro bits) e adicionar o valor de 20 bits resultante ao conteúdo de 16 bits do registrador ip. Aproximadamente a mesma coisa acontece quando o microprocessador processa os operandos na instrução de máquina. Se ele vê que o operando é um endereço (um endereço efetivo que é apenas parte do endereço físico), então ele sabe em qual segmento procurá-lo - por padrão, é o segmento cujo endereço inicial está armazenado no registrador de segmento ds.

Mas e o segmento de pilha? No contexto de nossa consideração, estamos interessados ​​nos registradores sp e bp. Se o microprocessador vê um desses registradores como um operando (ou parte dele, se o operando for uma expressão), então, por padrão, ele forma o endereço físico do operando usando o conteúdo do registrador ss como seu componente de segmento. Este é um conjunto de microprogramas na unidade de controle de microprogramas, cada um dos quais executa uma das instruções no sistema de instruções de máquina do microprocessador. Cada microprograma funciona de acordo com seu próprio algoritmo. Claro, você não pode alterá-lo, mas você pode corrigi-lo ligeiramente. Isso é feito usando o campo opcional de prefixo de comando de máquina. Se concordarmos em como o comando funciona, esse campo está ausente. Se quisermos fazer uma alteração (se, é claro, for permitido para um comando específico) no algoritmo do comando, é necessário formar um prefixo apropriado.

Um prefixo é um valor de um byte cujo valor numérico determina sua finalidade. O microprocessador reconhece pelo valor especificado que este byte é um prefixo e o trabalho adicional do microprograma é realizado levando em consideração a instrução recebida para corrigir seu trabalho. Agora estamos interessados ​​em um deles - o prefixo de substituição (redefinição) de segmento. Sua finalidade é indicar ao microprocessador (e, de fato, ao firmware) que não queremos usar o segmento padrão. As possibilidades para tal redefinição são, obviamente, limitadas. O segmento de comando não pode ser redefinido, o endereço do próximo comando executável é determinado exclusivamente pelo par cs:ip. E aqui segmentos de uma pilha e dados - é possível. É para isso que serve o operador ":". O tradutor montador, processando essa instrução, gera o prefixo de substituição de segmento de um byte correspondente.

Arroz. 14. Sintaxe do operador de redefinição de segmento

8. O operador de nomenclatura de tipo de estrutura "."(ponto) também força o compilador a realizar determinados cálculos se ocorrer em uma expressão.

9. O operador para obter o componente de segmento da expressão endereço seg retorna o endereço físico do segmento para a expressão (Fig. 15), que pode ser um rótulo, variável, nome de segmento, nome de grupo ou algum nome simbólico.

Arroz. 15. Sintaxe do operador de recebimento do componente de segmento

10. O operador para obter o deslocamento da expressão deslocamento permite obter o valor do deslocamento da expressão (Fig. 16) em bytes em relação ao início do segmento em que a expressão está definida.

Arroz. 16. Sintaxe do operador get de deslocamento

Assim como nas linguagens de alto nível, a execução de operadores assembler na avaliação de expressões é realizada de acordo com suas prioridades (Tabela 4). As operações com a mesma prioridade são executadas sequencialmente da esquerda para a direita. A alteração da ordem de execução é possível colocando parênteses com a precedência mais alta.

Tabela 4. Operadores e sua precedência

3. Diretrizes de segmentação

No decorrer da discussão anterior, descobrimos todas as regras básicas para escrever instruções e operandos em um programa em linguagem assembly. A questão de como formatar corretamente a sequência de comandos para que o tradutor possa processá-los e o microprocessador possa executá-los permanece em aberto.

Ao considerar a arquitetura do microprocessador, aprendemos que ele possui seis registradores de segmento, através dos quais pode trabalhar simultaneamente:

1) com um segmento de código;

2) com um segmento de pilha;

3) com um segmento de dados;

4) com três segmentos de dados adicionais.

Lembre-se mais uma vez que um segmento é fisicamente uma área de memória ocupada por comandos e (ou) dados cujos endereços são calculados em relação ao valor no registrador de segmento correspondente.

A descrição sintática de um segmento em assembler é a construção mostrada na Figura 17:

Arroz. 17. Sintaxe de descrição do segmento

É importante observar que a funcionalidade de um segmento é um pouco mais ampla do que simplesmente dividir o programa em blocos de código, dados e pilha. A segmentação faz parte de um mecanismo mais geral relacionado ao conceito de programação modular. Envolve a unificação do design dos módulos de objetos criados pelo compilador, incluindo aqueles de diferentes linguagens de programação. Isso permite combinar programas escritos em diferentes idiomas. É para a implementação de várias opções para tal união que se destinam os operandos da diretiva SEGMENT.

Vamos considerá-los em mais detalhes.

1. O atributo de alinhamento de segmento (tipo de alinhamento) informa ao compositor para garantir que o início do segmento seja colocado no limite especificado. Isso é importante porque o alinhamento adequado torna o acesso aos dados mais rápido em processadores i80x86. Os valores válidos para este atributo são os seguintes:

1) BYTE - o alinhamento não é realizado. Um segmento pode iniciar em qualquer endereço de memória;

2) WORD - o segmento inicia em um endereço que é múltiplo de dois, ou seja, o último (menos significativo) bit do endereço físico é 0 (alinhado ao limite da palavra);

3) DWORD - o segmento inicia em um endereço múltiplo de quatro, ou seja, os dois últimos bits (menos significativos) são 0 (alinhados a um limite de palavra dupla);

4) PARA - o segmento inicia em um endereço múltiplo de 16, ou seja, o último dígito hexadecimal do endereço deve ser Oh (alinhamento ao limite do parágrafo);

5) PAGE - o segmento inicia em um endereço múltiplo de 256, ou seja, os dois últimos dígitos hexadecimais devem ser 00h (alinhados ao limite de uma página de 256 bytes);

6) MEMPAGE - o segmento inicia em um endereço múltiplo de 4 KB, ou seja, os três últimos dígitos hexadecimais devem ser OOOh (o endereço da próxima página de memória de 4 KB). O tipo de alinhamento padrão é PARA.

2. O atributo combine segment (tipo combinatório) informa ao vinculador como combinar segmentos de módulos diferentes que têm o mesmo nome. Os valores de atributo de combinação de segmento podem ser:

1) PRIVADO - o segmento não será combinado com outros segmentos de mesmo nome fora deste módulo;

2) PÚBLICO - faz com que o vinculador conecte todos os segmentos com o mesmo nome. O novo segmento mesclado será completo e contínuo. Todos os endereços (offsets) dos objetos, e isso pode depender do tipo de comando e segmento de dados, serão calculados em relação ao início deste novo segmento;

3) COMUM - coloca todos os segmentos com o mesmo nome no mesmo endereço. Todos os segmentos com o nome dado irão se sobrepor e compartilhar memória. O tamanho do segmento resultante será igual ao tamanho do maior segmento;

4) AT xxxx - localiza o segmento no endereço absoluto do parágrafo (parágrafo é a quantidade de memória, um múltiplo de 16; portanto, o último dígito hexadecimal do endereço do parágrafo é 0). O endereço absoluto de um parágrafo é dado por xxx. O linker coloca o segmento em um determinado endereço de memória (isso pode ser usado, por exemplo, para acessar a memória de vídeo ou uma área ROM>), dado o atributo combine. Fisicamente, isso significa que o segmento, quando carregado na memória, estará localizado a partir desse endereço absoluto do parágrafo, mas para acessá-lo, o valor especificado no atributo deve ser carregado no registrador de segmento correspondente. Todos os rótulos e endereços em um segmento assim definido são relativos ao endereço absoluto dado;

5) PILHA - definição de um segmento de pilha. Faz com que o vinculador conecte todos os segmentos com o mesmo nome e calcule os endereços nesses segmentos em relação ao registrador ss. O tipo combinado STACK (pilha) é semelhante ao tipo combinado PUBLIC, exceto que o registrador ss é o registrador de segmento padrão para segmentos de pilha. O registrador sp é definido para o final do segmento de pilha concatenado. Se nenhum segmento de pilha for especificado, o vinculador emitirá um aviso de que nenhum segmento de pilha foi encontrado. Se um segmento de pilha foi criado e o tipo STACK combinado não é usado, o programador deve carregar explicitamente o endereço do segmento no registrador ss (semelhante ao registrador ds).

O atributo de combinação é padronizado como PRIVATE.

3. Um atributo de classe de segmento (tipo de classe) é uma string entre aspas que ajuda o vinculador a determinar a ordem de segmento apropriada ao montar um programa a partir de vários segmentos de módulo. O vinculador mescla na memória todos os segmentos com o mesmo nome de classe (o nome da classe geralmente pode ser qualquer coisa, mas é melhor se refletir a funcionalidade do segmento). Um uso típico de um nome de classe é agrupar todos os segmentos de código de um programa (geralmente a classe "código" é usada para isso). Usando o mecanismo de tipagem de classe, você também pode agrupar segmentos de dados inicializados e não inicializados.

4. Atributo de tamanho do segmento. Para processadores i80386 e superiores, os segmentos podem ser de 16 bits ou 32 bits. Isso afeta principalmente o tamanho do segmento e a ordem em que o endereço físico é formado dentro dele. O atributo pode ter os seguintes valores:

1) USE16 - significa que o segmento permite endereçamento de 16 bits. Ao formar um endereço físico, apenas um deslocamento de 16 bits pode ser usado. Assim, tal segmento pode conter até 64 KB de código ou dados;

2)USE32 - o segmento será de 32 bits. Ao formar um endereço físico, um deslocamento de 32 bits pode ser usado. Portanto, esse segmento pode conter até 4 GB de código ou dados.

Todos os segmentos são iguais em si, pois as diretivas SEGMENT e ENDS não contêm informações sobre a finalidade funcional dos segmentos. Para usá-los como segmentos de código, dados ou pilha, você deve primeiro informar o tradutor sobre isso, para o qual é usada uma diretiva especial ASSUME, que tem o formato mostrado na Fig. 18. Esta diretiva informa ao tradutor qual segmento está vinculado a qual registro de segmento. Por sua vez, isso permitirá que o tradutor vincule corretamente os nomes simbólicos definidos nos segmentos. A vinculação de segmentos a registradores de segmento é realizada utilizando os operandos desta diretiva, em que o nome_do_segmento deve ser o nome do segmento, definido no texto fonte do programa pela diretiva SEGMENT ou pela palavra-chave nothing. Se apenas a palavra-chave nothing for usada como operando, as atribuições de registradores de segmento anteriores serão canceladas e para todos os seis registradores de segmento de uma só vez. Mas a palavra-chave nada pode ser usada em vez do argumento do nome do segmento; neste caso, a conexão entre o segmento com o nome do segmento nome e o registrador de segmento correspondente será quebrada seletivamente (veja a Fig. 18).

Arroz. 18. ASSUMIR Diretiva

Para programas simples contendo um segmento para código, dados e pilha, gostaríamos de simplificar sua descrição. Para fazer isso, os tradutores MASM e TASM introduziram a capacidade de usar diretivas de segmentação simplificadas. Mas aqui surgiu um problema relacionado ao fato de que era necessário compensar de alguma forma a incapacidade de controlar diretamente a colocação e a combinação de segmentos. Para isso, juntamente com as diretivas simplificadas de segmentação, passaram a utilizar a diretiva para especificação do modelo de memória MODEL, que passou a controlar parcialmente o posicionamento dos segmentos e executar as funções da diretiva ASSUME (portanto, ao utilizar diretivas simplificadas de segmentação, o A diretiva ASSUME pode ser omitida). Esta diretiva vincula segmentos, que no caso de usar diretivas de segmentação simplificadas, têm nomes predefinidos, com registradores de segmento (embora você ainda precise inicializar ds explicitamente).

A sintaxe da diretiva MODEL é mostrada na Figura 19.

Arroz. 19. Sintaxe da diretiva MODEL

O parâmetro obrigatório da diretiva MODEL é o modelo de memória. Este parâmetro define o modelo de segmentação de memória para a POU. Supõe-se que um módulo de programa pode ter apenas certos tipos de segmentos, que são definidos pelas diretivas simplificadas de descrição de segmento que mencionamos anteriormente. Essas diretivas são mostradas na Tabela 5.

Tabela 5. Diretivas de definição de segmento simplificadas

A presença do parâmetro [nome] em algumas diretivas indica que é possível definir vários segmentos desse tipo. Por outro lado, a existência de vários tipos de segmentos de dados deve-se à necessidade de garantir a compatibilidade com alguns compiladores de linguagens de alto nível, que criam diferentes segmentos de dados para dados inicializados e não inicializados, bem como constantes.

Ao utilizar a diretiva MODEL, o tradutor disponibiliza diversos identificadores que podem ser acessados ​​durante a operação do programa para obter informações sobre determinadas características de um determinado modelo de memória (Tabela 7). Vamos listar esses identificadores e seus valores (Tabela 6).

Tabela 6. Identificadores criados pela diretiva MODEL

Agora podemos terminar de discutir a diretiva MODEL. Os operandos da diretiva MODEL são usados ​​para especificar um modelo de memória que define o conjunto de segmentos de programa, os tamanhos dos segmentos de dados e de código e o método de vinculação de segmentos e registradores de segmento. A Tabela 7 mostra alguns valores do parâmetro "memory model" da diretiva MODEL.

Tabela 7. Modelos de Memória

O parâmetro "modifier" da diretiva MODEL permite esclarecer algumas características do uso do modelo de memória selecionado (Tabela 8).

Tabela 8. Modificadores de modelo de memória

Os parâmetros opcionais "language" e "language modifier" definem alguns recursos das chamadas de procedimento. A necessidade de usar esses parâmetros surge ao escrever e vincular programas em várias linguagens de programação.

As diretivas de segmentação padrão e simplificada que descrevemos não são mutuamente exclusivas. As diretivas padrão são usadas quando o programador deseja ter controle total sobre a colocação de segmentos na memória e sua combinação com segmentos de outros módulos.

As diretivas simplificadas são úteis para programas simples e programas destinados a serem vinculados a módulos de programa escritos em linguagens de alto nível. Isso permite que o vinculador vincule módulos de diferentes idiomas de maneira eficiente, padronizando a vinculação e o gerenciamento.

Autor: Tsvetkova A.V.

<< Voltar: Programas de montagem (Estrutura do programa Assembler. Sintaxe Assembler. Operadores de comparação. Operadores e sua precedência. Diretivas simplificadas de definição de segmento. Identificadores criados pela diretiva MODEL. Modelos de memória. Modificadores de modelo de memória)

>> Encaminhar: Equipes (Comandos de transferência de dados. Comandos aritméticos)

Recomendamos artigos interessantes seção Notas de aula, folhas de dicas:

Microbiologia. Notas de aula

Cirurgia operatória. Notas de aula

História da psicologia. Berço

Veja outros artigos seção Notas de aula, folhas de dicas.

Leia e escreva útil comentários sobre este artigo.

<< Voltar

Últimas notícias de ciência e tecnologia, nova eletrônica:

A existência de uma regra de entropia para o emaranhamento quântico foi comprovada 09.05.2024

A mecânica quântica continua a nos surpreender com seus fenômenos misteriosos e descobertas inesperadas. Recentemente, Bartosz Regula do Centro RIKEN de Computação Quântica e Ludovico Lamy da Universidade de Amsterdã apresentaram uma nova descoberta que diz respeito ao emaranhamento quântico e sua relação com a entropia. O emaranhamento quântico desempenha um papel importante na moderna ciência e tecnologia da informação quântica. No entanto, a complexidade da sua estrutura torna a sua compreensão e gestão um desafio. A descoberta de Regulus e Lamy mostra que o emaranhamento quântico segue uma regra de entropia semelhante à dos sistemas clássicos. Esta descoberta abre novas perspectivas na ciência e tecnologia da informação quântica, aprofundando a nossa compreensão do emaranhamento quântico e a sua ligação à termodinâmica. Os resultados do estudo indicam a possibilidade de reversibilidade das transformações de emaranhamento, o que poderia simplificar muito seu uso em diversas tecnologias quânticas. Abrindo uma nova regra ... >>

Mini ar condicionado Sony Reon Pocket 5 09.05.2024

O verão é uma época de relaxamento e viagens, mas muitas vezes o calor pode transformar essa época em um tormento insuportável. Conheça um novo produto da Sony – o minicondicionador Reon Pocket 5, que promete deixar o verão mais confortável para seus usuários. A Sony lançou um dispositivo exclusivo - o minicondicionador Reon Pocket 5, que fornece resfriamento corporal em dias quentes. Com ele, os usuários podem desfrutar do frescor a qualquer hora e em qualquer lugar, simplesmente usando-o no pescoço. Este miniar condicionado está equipado com ajuste automático dos modos de operação, além de sensores de temperatura e umidade. Graças a tecnologias inovadoras, o Reon Pocket 5 ajusta o seu funcionamento em função da atividade do utilizador e das condições ambientais. Os usuários podem ajustar facilmente a temperatura usando um aplicativo móvel dedicado conectado via Bluetooth. Além disso, camisetas e shorts especialmente desenhados estão disponíveis para maior comodidade, aos quais um mini ar condicionado pode ser acoplado. O dispositivo pode, oh ... >>

Energia do espaço para Starship 08.05.2024

A produção de energia solar no espaço está se tornando mais viável com o advento de novas tecnologias e o desenvolvimento de programas espaciais. O chefe da startup Virtus Solis compartilhou sua visão de usar a Starship da SpaceX para criar usinas orbitais capazes de abastecer a Terra. A startup Virtus Solis revelou um ambicioso projeto para criar usinas de energia orbitais usando a Starship da SpaceX. Esta ideia poderia mudar significativamente o campo da produção de energia solar, tornando-a mais acessível e barata. O cerne do plano da startup é reduzir o custo de lançamento de satélites ao espaço usando a Starship. Espera-se que este avanço tecnológico torne a produção de energia solar no espaço mais competitiva com as fontes de energia tradicionais. A Virtual Solis planeja construir grandes painéis fotovoltaicos em órbita, usando a Starship para entregar os equipamentos necessários. Contudo, um dos principais desafios ... >>

Notícias aleatórias do Arquivo

Cidade do futuro da Toyota 12.01.2020

O presidente da Toyota Motor Corporation anunciou os planos da empresa de construir uma cidade protótipo futurista. Esta cidade, já chamada Woven City, será construída perto do Monte Fuji no território do antigo complexo fabril da Toyota em Higashi-Fuji, numa área de cerca de 70 hectares, e esta área será preenchida com edifícios e infraestruturas futuristas projetado para explorar a questão de como humanos e robôs podem coexistir em harmonia.

Nesta fase, o projeto Woven City encontra-se ainda numa fase inicial, estando previsto o início das primeiras obras de construção para 2021. Uma vez concluído, este lugar se tornará uma cidade totalmente controlada, onde as pessoas vivem, trabalham e se divertem em um "grande laboratório", enquanto engenheiros e cientistas são livres para desenvolver e testar no mundo real as mais recentes tecnologias relacionadas à inteligência artificial, movimento autônomo, serviço, robótica e tecnologias de casa inteligente.

A infraestrutura interconectada da Woven City está pronta para se tornar a infraestrutura urbana mais ecológica e sustentável até hoje. Utilizará amplamente a tecnologia de células de combustível de hidrogênio da Toyota, que convidará todos os cientistas interessados ​​de todo o mundo a cooperar nessa área. A população de Woven City será composta por residentes permanentes, que serão técnicos e pessoal de manutenção, e visitantes, cientistas e engenheiros, que residirão na cidade temporariamente para testar suas próprias tecnologias.

O projeto Woven City está sendo desenvolvido pelo arquiteto dinamarquês Bjarke Ingels, que tenta reproduzir nesta cidade as ruas típicas de qualquer cidade moderna. Cada rua em Woven City será dividida em três seções, uma para veículos automáticos, outra para sistemas de mobilidade pessoal (bicicletas, scooters elétricas, etc.) e outra para pedestres. Essas ruas formarão uma grade, dividindo a cidade em quarteirões, cada um dos quais será um parque ou um quarteirão com seu próprio pátio.

Todos os edifícios em Woven City serão construídos em madeira e contarão com carpintaria tradicional japonesa combinada com "novas técnicas de fabricação automatizadas" em sua arquitetura. Cada edifício da cidade desempenhará o papel de local de residência das pessoas e de local de trabalho. Quase toda a "infraestrutura industrial", incluindo linhas automatizadas para entrega de mercadorias, ficará escondida no subsolo, e a inteligência artificial e os robôs assumirão absolutamente todo o trabalho rotineiro diário, liberando as pessoas mais tempo para atividades criativas ou recreativas.

Outras notícias interessantes:

▪ Sensor de câmera de telefone mícron

▪ Computador com GTX Titan e refrigeração líquida

▪ Novos modelos de Sony Reader

▪ De tremer nas mãos

▪ Sensor de imagem Samsung ISOCELL GN2

Feed de notícias de ciência e tecnologia, nova eletrônica

 

Materiais interessantes da Biblioteca Técnica Gratuita:

▪ seção do site Limitadores de sinal, compressores. Seleção de artigos

▪ artigo Poços de concreto. Dicas para o dono da casa

▪ artigo Quanto sangue há em nosso corpo? Resposta detalhada

▪ artigo Irmã-amante. Descrição do trabalho

▪ artigo Instrumentos para determinação dos parâmetros do vento. Enciclopédia de rádio eletrônica e engenharia elétrica

▪ Artigo Torradeira. Enciclopédia de rádio eletrônica e engenharia elétrica

Deixe seu comentário neste artigo:

Имя:


E-mail opcional):


Comentário:





Todos os idiomas desta página

Página principal | Biblioteca | Artigos | Mapa do Site | Revisões do site

www.diagrama.com.ua

www.diagrama.com.ua
2000-2024