Logo Hardware.com.br
igones
igones Super Participante Registrado
490 Mensagens 32 Curtidas

Como funciona um processamento de instruções!?

#1 Por igones 07/10/2009 - 00:10
Bem, tenho um trabalho pra fazer e estou pesquisando a algum tempo sobre o Ciclo de processamento da CPU. Achei várias coisas mas naum consegui entender direito. Se alguem puder me tirar a duvida..

Explicar como funciona o ciclo de processamento da CPU
Busca -> Decod. -> Execução, falando dos registradores que são usados.

Descupe, naum sei se tô na área certa =X
Abraços!!
N-ton
N-ton Super Participante Registrado
550 Mensagens 6 Curtidas
#3 Por N-ton
08/10/2009 - 12:38
Basicamente o pc, program pointer, ou ip instruction pointer. não me lembro se é exatamente assim o seu nome em todo microprocessador/microcontrolador , é um contador que funciona como ponteiro, apontando para endereços seqüenciais da memória, geralmente ele começa a funcionar assim que o microprocessador/microcontrolador é ligado e procura pelas primeiras instruções. Eu não conheço todas as implantações em todos os microprocessadores/microcontroladores mas o principio é sempre semelhante. em todos você não pode modificar diretamente o valor do contador, tem que fazer isso através de uma instrução de salto ou salto condicional. do contrario o contador sempre procurará pelo próximo endereço na seqüência. não precisando o programador se preocupar com ele. geralmente uma instrução de salto faz com que o contador aponte para um endereço especifico na memoria, execute uma subrotina e volte para um endereço adiante ao do salto. No pic, algumas instruções de salto condicional levam o contador a ignorar o próximo endereço e continuar um endereço depois se um valor lido é zero (skip if clear), outras se o valor lido é um. (skip if set). Btfss e Btfsc respectivamente. tem também o famosa instrução goto (vá para) considerada perigosa em algumas linguagens, talvez pelo risco de causar laços infinitos. mas ainda usada em assembly. ela simplesmente manda o ponteiro de endereços apontar para um endereço especifico e continuar o processamento de lá.Basicamente a ideia é essa: um contador automático, que aponta para a próxima instrução a ser executada.bravissimo.gifwink.pngrolleyes.png
BionewBie
marco_piracicaba
marco_piraci... Super Participante Registrado
392 Mensagens 24 Curtidas
#4 Por marco_piraci...
09/10/2009 - 11:44
N-ton disse:

geralmente uma instrução de salto faz com que o contador aponte para um endereço especifico na memoria, execute uma subrotina e volte para um endereço adiante ao do salto.


Aqui você misturou as instruções de salto condicional ou nao (JUMP, BRANCH, GOTO, SKIP...) com instruções de chamada de sub-rotina (CALL). As primeiras (instruções de salto) fazem com que a sequência de instruções seja desviada para um determinado endereço (relativo ou absoluto) e a partir desse (endereço) continue seu processamento. Não existe retorno. Já nas chamadas das sub-rotinas o endereço seguinte à chamada é guardada em uma pilha (stack) e o contador de programa (PC) é imediatamente carregado com o endereço da rotina. Essa rotina deve conter uma instrução RET, a qual carregará o PC com o conteúdo do topo da pilha. Resumindo, retornará ao endereço seguinte à chamada da sub-rotina.

Existe também o desvio por interrupção de hardware ou software. Esse se assemelha à chamada de sub-rotinas. A diferença principal consiste no modo de chamada. A sub-rotina possui ponto (s) predeterminado (s) no programa (instrução CALL). Já as interrupções podem ser evocadas a qualquer tempo e em qualquer ponto do mesmo programa. Basta para isso estarm habilitadas. Pode até mesmo ser evocada durante a execução de uma outra rotina de interrupção (encavalamento de rotinas). Para isso deve ser respeitado o limite da pilha (stack), sob pena de provocar um estouro (overflow) e perder os endereçoes de retorno (RETI).

N-ton disse:

No pic, algumas instruções de salto condicional levam o contador a ignorar o próximo endereço e continuar um endereço depois se um valor lido é zero (skip if clear), outras se o valor lido é um. (skip if set). Btfss e Btfsc respectivamente.


Não somente no PIC mas em qualquer MPU/MCU, quando a condição for satisfeita o endereço subsequente é ignorado.

N-ton disse:

tem também o famosa instrução goto (vá para) considerada perigosa em algumas linguagens, talvez pelo risco de causar laços infinitos.


É uma intrução de salto incondicional como outra qualquer (JUMP, BRANCH, SKIP...). O perigo consiste apenas em não saber para onde desviar o programa. Se o programador considerá-la perigosa é melhor mudar de profissão.

N-ton disse:

mas ainda usada em assembly.


- jump, skip, branch... => assembly
- goto => basic...
.


N-ton
N-ton Super Participante Registrado
550 Mensagens 6 Curtidas
#5 Por N-ton
14/10/2009 - 13:47
Talvez eu tenha sido impreciso demais, tentarei concertar depois. mas dizer que goto é perigoso não é minha opinião, simplesmente vi isso em alguns trabalhos. o assembly do pic tem goto, não conheço o basic profudamente. as instruções de salto da assembly 80386 saltam para um label, diferente da mencionada instrução do pic que saltam para a instrução seguinte.bravissimo.gif genericamente, uma chamada de subrotina também é um salto. Claro que tem os saltos que não retornam, mas continuam do ponto onde estão.
BionewBie
marco_piracicaba
marco_piraci... Super Participante Registrado
392 Mensagens 24 Curtidas
#7 Por marco_piraci...
15/10/2009 - 12:53
N-ton disse:

mas dizer que goto é perigoso não é minha opinião, simplesmente vi isso em alguns trabalhos.


Me acostumei a ler tais depoimentos desde a década de 70 e nunca concordei, pois, toda e qualquer instrução (exceção feita ao NOP) se utilizada sem o devido conhecimento do programa ou da própria instrução é perigosa. Até mesmo uma simples transferencia (MOV/LD). Se existir a necessidade do desvio e o programador souber fazê-la, qual será o problema?

N-ton disse:

as instruções de salto da assembly 80386 saltam para um label, diferente da mencionada instrução do pic que saltam para a instrução seguinte.


Não. Tanto a instrução JMP do 80386 quanto a GOTO do pic saltam para um endereço absoluto. O label representa esse endereço absoluto. Portanto as duas instruções executam desvio incondicional da mesma maneira.

Salto para a instrução seguinte é automático e é atribuição do PC (program counter).

N-ton disse:

genericamente, uma chamada de subrotina também é um salto. Claro que tem os saltos que não retornam, mas continuam do ponto onde estão.


Embora ela (CALL) esteja alocada no grupo de "direcionamento de programa" em função da sequência na execução, não é comum chama-la ou usá-la como instrução de salto. Observe que a mesma interfere no conteudo da pilha (stack), a qual pode causar transtornos ao programador.

Não confunda instruções puramente de saltos/desvios (JMP, BRANCH, GOTO...) com instruções que executam saltos/desvios (CALL, RET, INT...) em função da necessidade (operação).
.


jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#8 Por jqueiroz
15/10/2009 - 13:49
N-ton disse:
Talvez eu tenha sido impreciso demais, tentarei concertar depois. mas dizer que goto é perigoso não é minha opinião, simplesmente vi isso em alguns trabalhos. o assembly do pic tem goto, não conheço o basic profudamente. as instruções de salto da assembly 80386 saltam para um label, diferente da mencionada instrução do pic que saltam para a instrução seguinte.bravissimo.gif genericamente, uma chamada de subrotina também é um salto. Claro que tem os saltos que não retornam, mas continuam do ponto onde estão.


O "goto" não é perigoso, é uma gambiarra. wink.png

Deve ser evitado a todo custo em linguagens de alto nivel, pois elas implementam construções que o substituem com vantagens esmagadoras.

No Assembly, o "goto" (ou Jump) é necessário, podendo (e devendo) ser usado para implementar as estruturas de alto nível. Não é pq você está trabalhando em assembly que não pode programar de forma estruturada, ou melhor, de forma organizada.

Voltando ao assunto do tópico...

Uma coisa a levar em conta é se a arquitetura do processador usa instruções de tamanho fixo ou variável.

Na arquitetura x86, as instruções são de tamanho variável. Isso significa que o processador, no ciclo de "instruction fetch", deve ler um byte, e interpretá-lo rapidamente (antes de executá-lo), para saber se é preciso ler mais alguns bytes. Instruções simples como o "nop" (no-operation, uma instrução que não faz nada) ocupam apenas um byte. Uma instrução complexa como um [possível] "move [registrador],valor" pode ter 5 bytes (um pra instrução, mais quatro pro valor de 32 bits). Assim, o PC/IP vai sendo incrementado, de forma a apontar sempre para o primeiro byte da próxima instrução (ou para o último da instrução atual, em alguns processadores).

Numa arquitetura de tamanho de instrução fixo (exemplo: processador intel i860 --- antiiiiiiigo...), quase todas as instruções têm o tamanho de uma palavra de dados (no caso, eram 64 bits). Isso agiliza o processo de "fetch", mas torna os programas maiores.

Não vou entrar em detalhes aqui sobre como cada um desses enfoques age sobre o cache de instruções (até pq não os tenho), mas seria bom incluir isso no estudo. wink.png
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
N-ton
N-ton Super Participante Registrado
550 Mensagens 6 Curtidas
#9 Por N-ton
15/10/2009 - 15:37
Não. Tanto a instrução JMP do 80386 quanto a GOTO do pic saltam para um endereço absoluto. O label representa esse endereço absoluto. Portanto as duas instruções executam desvio incondicional da mesma maneira.

Vou tentar me explicar mais uma vez, ta ficando meio confuso, heim. não falei de goto. falei das instruções Btfss e Btfsc, embora toda instrução de salto ignore a posição seguinte na memoria, senão não fariam sentido, mas essas duas instruções fazem isso e mais; vão para a instrução seguinte a instrução saltada e somente para esta incondicionalmente, neste sentido, pelo menos para mim ela é uma inovação. é interessante que esses bits testados podem realmente representar um terminal fisico do encapsulamento do microcontrolador. e diferencia das instruções dos microprocessadores para pc pelo seguinte fato: no pc, a menor variavel é o byte e não o bit, se você quiser controlar um bit individualmente, tem que usar alguns truques, como antecipar que certa operação lógicas só irão afetar os bits que você tem em mente escolhendo um dos operandos adequadamente. por exemplo temos o valor 11001011 e queremos alterar somente o bit menos significativo, podemos realizar um xor com 00000001, neste caso o segundo operando funciona como uma máscara. o conceito de máscara também acompanha a instrução test, que verifica se determinados bits em um operando estão setados, a máscara, que pode ser um registrador, valor em posição da mémoria ou valor imediato, determina quais bits serão checados. os valores dos bits não são alterados. mas os flags são afetados, ademais, não importa quais sejam as instruções no computador comum, elas não podem ser menor do que um byte, por exemplo, um bit seria representado por 00000001 em registrador ou local da memoria. não poderiamos representar um outro bit individual juntando com esse: "00000011" pois não poderiamos realizar nenhuma operação lógica do primeiro com o segundo. precisariamos de outro bit em outro registrador ou posição da mémoria, claro que todos os bits do byte serão afetados, mas só levaremos em consideração aqueles que escolhemos. uma explicação sobre o ciclos de busca e execução do pic podem ser encontradas no tutorial The_PIC_Microcontroller_Book.pdf
Creio que há uma versão em português, por enquanto só li a em inglés. lá tem esquemas dos barramentos de dados, controle e endereços. além das formas de ondas que descrevem os ciclos do funcionamento do pic. Gostaria de conversar mais, mas tenho alguns tutoriais para estudar. Então eu vejo todos mais tarde. té mais.big_green.pngbig_green.pngmad.png
BionewBie
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#10 Por jqueiroz
15/10/2009 - 16:44
embora toda instrução de salto ignore a posição seguinte na memoria, senão não fariam sentido...


Sabe que isso não é necessariamente verdade??? Esse processador que eu citei, o intel i860, tinha uma peculiaridade: ele executava uma instrução a mais, logo depois dos "jumps". Tipo assim:


mov r1,r2
mov r2,r3
cmp r1,r3
jnz funcionou
mov r3,r4

jmp nao_funcionou
mov r4,r5

funcionou:
mov r3,r1
(...)
nao_funcionou:
(mais instruções)


Isso acontecia pq o processador tinha um "pipeline de instruções" [outra coisa pra vc pesquisar, igones]. Pra manter o pipeline cheio (e assim obter a máxima eficiência), o processador executava uma instrução após os jumps.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
marco_piracicaba
marco_piraci... Super Participante Registrado
392 Mensagens 24 Curtidas
#11 Por marco_piraci...
17/10/2009 - 10:11
N-ton disse:

é interessante que esses bits testados podem realmente representar um terminal fisico do encapsulamento do microcontrolador. e diferencia das instruções dos microprocessadores para pc pelo seguinte fato: no pc, a menor variavel é o byte e não o bit, se você quiser controlar um bit individualmente, tem que usar alguns truques, como antecipar que certa operação lógicas só irão afetar os bits que você tem em mente escolhendo um dos operandos adequadamente.


Outra não conformidade. As instruções para manipulação sobre bits existem desde a década de 70 e uma MPU que fez uso delas foi o Z80:

BIT b,(HL) Test bit b of location (HL).
BIT b,(IX+d) Test bit b of location (IX+d).
BIT b,(IY+d) Test bit b of location (IY+d).
BIT b,r
Test bit b of register r.

RES b,m Reset bit b of operand m.

SET b,(HL) Set bit b of location (HL).
SET b,(IX+d) Set bit b of location (IX+d).
SET b,(IY+d) Set bit b of location (IY+d).
SET b,R Set bit b of register r.

Da mesma forma a Intel inseriu na MPU 80386 as seguintes instruções:

BSF Bit Scan Forward
BSR Bit Scan Reverse
BT Bit Test
BTC Bit Test and Complement
BTR Bit Test and Reset
BTS Bit Test and Set
.


N-ton
N-ton Super Participante Registrado
550 Mensagens 6 Curtidas
#12 Por N-ton
22/10/2009 - 12:39
marco_piracicaba disse:
Outra não conformidade. As instruções para manipulação sobre bits existem desde a década de 70 e uma MPU que fez uso delas foi o Z80:.

Bom, o z80 é um microcontrolador, As vezes é usado em pcs e videogames, mas, ao mencionar os processadores que não tratam bit a bit eu me refiro aos que usam o assembly para o 80x86, pelo menos os tutoriais de assembly dizem que não se pode tratar os bits individualmente. o que me leva a crer que isso se deva a arquitetura do microprocessador ou a uma simples convenção técnica entre os fabricantes.

Eu não vi ainda essas instruções da intel, no meu tutorial não tem (ou eu não imprimi todo para economizar tinta, veja assembler para ibm-pc, Scandelari, apostila das instruções assembler 8088, Leão, Rocha e Campos), Mas os operandos dessas instruções são bits? ou são bytes, words ou double words?
BionewBie
marco_piracicaba
marco_piraci... Super Participante Registrado
392 Mensagens 24 Curtidas
#13 Por marco_piraci...
22/10/2009 - 13:17
N-ton disse:

Bom, o z80 é um microcontrolador,


Depende de qual Z80 está se referindo. Estou me referindo a primeira CPU (década de 70). É sim um microprocessador.

N-ton disse:

ao mencionar os processadores que não tratam bit a bit eu me refiro aos que usam o assembly para o 80x86, pelo menos os tutoriais de assembly dizem que não se pode tratar os bits individualmente.


Deve ser algum tutorial que antecede o 80386, pois, como disse acima as instruções para manipulação sobre bits existem. Veja esse documento da Sun Microsystems:


.


jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#14 Por jqueiroz
22/10/2009 - 13:44
Bom, o z80 é um microcontrolador,

Não, o Z80 era um microprocessador sim. Vários computadores mezozóicos foram construídos com ele, inclusive os dinossauros CP-300 e CP-500 da Prológica (depois Microperiféricos).

Esse processador, fabricado pela Zilog, era uma extensão do também clássico Intel 8080, precursor do 8086 e do 8088 (que foi usado nos primeiros IBM PC-XT).

Existia também um outro processador da Intel, contemporâneo, chamado 8085, que era basicamente um 8080 com alguns periféricos integrados --- esse sim, um micro-controlador. O primeiro uso que vi dele foi em algumas impressoras.

ao mencionar os processadores que não tratam bit a bit eu me refiro aos que usam o assembly para o 80x86, pelo menos os tutoriais de assembly dizem que não se pode tratar os bits individualmente. o que me leva a crer que isso se deva a arquitetura do microprocessador ou a uma simples convenção técnica entre os fabricantes.

Olha, eu tenho a impressão de que você entendeu errado o que leu. Qualquer processador, mesmo os arcaicos, pode lidar com bits individualmente. O que eles não podem fazer, nenhum deles, é acessar bits da memória isoladamente. Inclusive há algumas operações matemáticas que podem ser usadas para lidar com os bits isoladamente. Como exemplo, as operações "OR" e "AND", que podem ser usadas para acender ou apagar bits arbitrários de um valor.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal