Instruções Assembly x Código de máquina Microprocessador Didático Professor Afonso Ferreira Miguel ([email protected]) Disciplina de Projetos Lógicos e Microprocessadores Curitiba, 1 de junho de 2002. Mnemônico: MOV <DESTINO>,<ORIGEM> OPCODE: 0 (000002) Exemplos: MOV R3,AC NB= 0 (não tem nenhum parâmetro constante) OPCODE= 00000 DESTINO= 0011 (R3) ORIGEM= 0100 (AC) Código de Máquina = 0 00000 0011 0100 00 = 00D0h MOV R0,R3 NB= OPCODE= DESTINO= ORIGEM= 0 (não tem nenhum parâmetro constante) 00000 0000 (R0) 0011 (R3) Código de Máquina = 0 00000 0000 0011 00 = 000Ch MOV AC,30h NB= 1 (tem o parâmetro constante 30h) OPCODE= 00000 DESTINO= 0100 (AC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (30h) é carregado para ele no FETCH. Código de Máquina = 1 00000 0100 1000 00 = 8120h Assim, o programa: MOV R3,AC MOV R0,R3 MOV AC,30h Fica codificado na memória como: 2 Mnemônico: JMP <ENDERECO_DESTINO> Esta instrução na verdade é um comando MOV PC, <ENDERECO_DESTINO> Exemplo: JMP 1F04 NB= 1 (tem o parâmetro constante 1F04h) OPCODE= 00000 ß é o OPCODE do MOV DESTINO= 0111 (PC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 00000 0111 1000 00 = 81E0h Assim, o programa: MOV R3,AC MOV R0,R3 MOV AC,30h JMP 1F04 Fica codificado na memória como: 3 Mnemônico: LOAD <DESTINO>,<ENDERECO_ORIGEM> OPCODE: 1 (000012) Exemplos: LOAD AC,100h NB= 1 (tem um parâmetro constante – o endereço) OPCODE= 00001 DESTINO= 0100 (AC) ORIGEM= XXXX Obs.: apesar da origem não ser TEMP, o microcódigo deste opcode já sabe que o dado virá da posição de memória apontada por TEMP (com NB=1) Código de Máquina = 1 00001 0100 1000 00 = 8520h LOAD R3,1A0h NB= 1 (tem um parâmetro constante – o endereço) OPCODE= 00001 DESTINO= 0011 (R3) ORIGEM= XXXX Obs.: apesar da origem não ser TEMP, o microcódigo deste opcode já sabe que o dado virá da posição de memória apontada por TEMP (com NB=1) Código de Máquina = 1 00001 0011 1000 00 = 84E0h 4 Mnemônico: STORE <ENDERECO_DESTINO>,<ORIGEM> OPCODE: 2 (000102) Exemplos: STORE 100h,AC NB= 1 (tem um parâmetro constante – o endereço) OPCODE= 00010 DESTINO= XXXX ORIGEM= 0100 (AC) Obs.: o destino não importa, pois o microcódigo deste opcode já sabe que o dado deverá ser armazenado na posição de memória apontada por TEMP. Código de Máquina = 1 00010 0000 0100 00 = 8810h STORE FFE2h,R2 NB= 1 (tem um parâmetro constante – o endereço) OPCODE= 00010 DESTINO= XXXX ORIGEM= 0010 (R2) Obs.: o destino não importa, pois o microcódigo deste opcode já sabe que o dado deverá ser armazenado na posição de memória apontada por TEMP. Código de Máquina = 1 00010 0000 0010 00 = 8808h Mnemônico: ADD <DESTINO>,AC,<ORIGEM> OPCODE: 16 (100002) Exemplos: ADD R3,AC,R2 R3 ßAC+R2 NB= 0 OPCODE= 10000 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10000 0011 0010 00 = 40C8h ADD R3,AC,128h R3 ßAC+128h NB= 1 (tem um parâmetro constante – o valor 128) OPCODE= 10000 DESTINO= 0011 (R3) ORIGEM= 1000 (TEMP) Código de Máquina = 0 10000 0011 1000 00 = 40E0h 5 Mnemônico: ADC <DESTINO>,AC,<ORIGEM> OPCODE: 17 (100012) Exemplo: ADC R3,AC,R2 R3 ßAC+R2+carry NB= 0 OPCODE= 10001 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10001 0011 0010 00 = 44C8h Mnemônico: SUB <DESTINO>,AC,<ORIGEM> OPCODE: 18 (100102) Exemplo: SUB R3,AC,R2 R3 ßAC-R2 NB= 0 OPCODE= 10010 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10010 0011 0010 00 = 48C8h Mnemônico: SBC <DESTINO>,AC,<ORIGEM> OPCODE: 19 (100112) Exemplo: SBC R3,AC,R2 R3 ßAC-R2-carry NB= 0 OPCODE= 10011 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10011 0011 0010 00 = 4CC8h Mnemônico: INC <DESTINO>,<ORIGEM> OPCODE: 20 (101002) Exemplo: INC R3,R2 R3 ß R2+1 NB= 0 OPCODE= 10100 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10100 0011 0010 00 = 50C8h 6 Mnemônico: DEC <DESTINO>,<ORIGEM> OPCODE: 21 (101012) Exemplo: DEC R3,R2 R3 ß R2-1 NB= 0 OPCODE= 10101 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10101 0011 0010 00 = 54C8h Mnemônico: CPL <DESTINO>,<ORIGEM> OPCODE: 22 (101102) Exemplo: CPL R3,R2 R3 ß NOT(R2) NB= 0 OPCODE= 10110 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10110 0011 0010 00 = 58C8h Mnemônico: AND <DESTINO>,AC,<ORIGEM> OPCODE: 23 (101112) Exemplo: AND R3,AC,R2 R3 ß AC AND R2 NB= 0 OPCODE= 10111 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 10111 0011 0010 00 = 5CC8h Mnemônico: OR <DESTINO>,AC,<ORIGEM> OPCODE: 24 (110002) Exemplo: OR R3,AC,R2 R3 ß AC OR R2 NB= 0 OPCODE= 11000 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 11000 0011 0010 00 = 60C8h 7 Mnemônico: XOR <DESTINO>,AC,<ORIGEM> OPCODE: 25 (110012) Exemplo: XOR R3,AC,R2 R3 ß AC XOR R2 NB= 0 OPCODE= 11001 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 11001 0011 0010 00 = 64C8h Mnemônico: RR <DESTINO>,<ORIGEM> OPCODE: 26 (110102) Exemplo: RR R3,R2 R3 ß (carry,R2[15..1]) NB= 0 OPCODE= 11010 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 11010 0011 0010 00 = 68C8h Mnemônico: RL <DESTINO>,<ORIGEM> OPCODE: 27 (110112) Exemplo: RL R3,R2 R3 ß (carry,R2[15..1]) NB= 0 OPCODE= 11011 DESTINO= 0011 (R3) ORIGEM= 0010 (R2) Código de Máquina = 0 11011 0011 0010 00 = 6CC8h Mnemônico: JNZ <ENDERECO_DESTINO> OPCODE: 12 (011002) Exemplo: JNZ 1F04 NB= 1 (tem o parâmetro – endereço 1F04) OPCODE= 01100 DESTINO= 0111 (PC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 01100 0111 1000 00 = B1E0h 8 Mnemônico: JZ <ENDERECO_DESTINO> OPCODE: 13 (011012) Exemplo: JZ 1F04 NB= 1 (tem o parâmetro – endereço 1F04) OPCODE= 01101 DESTINO= 0111 (PC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 01101 0111 1000 00 = B5E0h Mnemônico: JNC <ENDERECO_DESTINO> OPCODE: 14 (011102) Exemplo: JNC 1F04 NB= 1 (tem o parâmetro – endereço 1F04) OPCODE= 01110 DESTINO= 0111 (PC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 01110 0111 1000 00 = B9E0h Mnemônico: JC <ENDERECO_DESTINO> OPCODE: 15 (011112) Exemplo: JC 1F04 NB= 1 (tem o parâmetro – endereço 1F04) OPCODE= 01111 DESTINO= 0111 (PC) ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 01111 0111 1000 00 = BDE0h 9 Mnemônico: PUSH <ORIGEM> OPCODE: 3 (000112) Exemplos: PUSH R2 NB= 0 (não tem um parâmetro constante) OPCODE= 00011 DESTINO= XXXX ß o destino é ignorado ORIGEM= 0010 (R2) Código de Máquina = 0 00011 0000 0010 00 = 0C08h PUSH 317h NB= 1 (tem um parâmetro constante – o valor 317h) OPCODE= 00011 DESTINO= XXXX ORIGEM= 1000 (TEMP) Código de Máquina = 1 00011 0000 1000 00 = 8C20h Mnemônico: POP <DESTINO> OPCODE: 4 (001002) Exemplos: POP R2 NB= 0 (não tem um parâmetro constante) OPCODE= 00100 DESTINO= 0010 (R2) ORIGEM= XXXX Código de Máquina = 0 00100 0010 0000 00 = 1080h Mnemônico: CALL <ENDERECO_DESTINO> OPCODE: 5 (001012) Exemplo: CALL 1F04 NB= 1 (tem o parâmetro constante 1F04h) OPCODE= 00101 DESTINO= XXXX ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1, o valor do parâmetro (1F04h) é carregado para ele no FETCH. Código de Máquina = 1 00101 0000 1000 00 = 9420h 10 Mnemônico: RET Esta instrução na verdade é um comando POP PC Exemplo: RET NB= 0 (não tem o parâmetro) OPCODE= 00100 ß é o OPCODE do POP DESTINO= 0111 (PC) ORIGEM= XXXX Código de Máquina = 0 00100 0111 0000 00 = 11C0h Mnemônico: CMP AC,<ORIGEM> Esta instrução na verdade é um comando SUB ?,AC,<ORIGEM> onde o destino não existe. O objetivo deste comando é comparar AC com outro registrador ou constante, afetando os flags. Exemplo: CMP AC,R2 ? ß AC - R2 NB= 0 OPCODE= 10010 ß é o OPCODE do SUB DESTINO= 1111 (?) ß é um registrador que não existe ORIGEM= 0010 (R2) Código de Máquina = 0 10010 1111 0010 00 = 4BC8h