Pergunta

Eu estou trabalhando em um simulador para o conjunto de instruções msp430. gnu montadora vai deixar você codificar instruções como estes:

fc0a: 12 10 00 02 rrc &0x0200       
fc0e: 22 11       rra #4        
fc10: 23 52       add #4,#2

Meu palpite é que rrc & 0x0200 vai buscar a partir do endereço 0x0200 realizar a rotação em seguida, escrever a resposta de volta para o endereço 0x0200, correto? Mas o que seria um rra # 4 fazer? A fonte seria uma imediata 4 Presumo mas existe um destino após a operação? O add # 4, # 2 montados em que seria de esperar (como 2b10, source = r2, ad = 1B0, dest = R3), as binutils desmontador embora não sabia o que fazer com que a instrução.

São estas instruções válidas?

Foi útil?

Solução

Embora lá não parece ser qualquer referência on-line definitivo para este efeito, eu tendo a concordar com o OP que as duas instruções mostrado (e vários outros) provavelmente não é válido , embora estejam em conformidade com o formato definido nas folhas de dados.

Em outras palavras, nem todas as combinações possíveis das várias partes que compõem uma palavra de instrução são válidos. Em particular, muitas instruções único operando que usam o modo de endereçamento imediato, e muitas instruções duplas operando que têm um modo de endereçamento imediato para o destino provavelmente não são semanticamente viável.

Existem apenas algumas dicas para o efeito na documentação, por exemplo, no Guia do Utilizador, secção 3.3.7 (no modo de endereçamento imediato), um comentário indica " Válido apenas para um operando fonte. "(E, BTW, isto é para todos os casos de modo de endereçamento imediato, não apenas os casos de curto mão permitidos pela truque geração constante R2 ou R3).

O fato de que o desmontador não sabe o que fazer com esses códigos também é outra dica (embora ... algumas disassemblers tropeçar facilmente ...).

Por causa de documentação, reuni abaixo algumas referências úteis para o MSP430:

Outras dicas

Na guia usuários atual, na seção 3.4.4.2, não recomenda o uso do modo imediato (#N) no campo de destino para a RRA de comando, uma vez que resulta em "operação do programa imprevisível."

É possível que eles são. Olhando para o conjunto de instruções na Wikipedia, os opcodes codificar o registo e várias opções. Portanto, não é um mapeamento simples. Parece que a saída que você tem é little-endian, então isso:

fc0a: 12 10 00 02 rrc &0x0200  

corresponde à instrução de 1012, que em binário é 0001 0000 0001 0010.

Isso quebra o seguinte:

6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0    - instruction (RRC)
1 bit : 0       - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01      - addressing mode (01 = indexed;)
4 bits: 0010    - register

Portanto, neste caso a rodar para a direita está ocorrendo no valor no deslocamento em registro 2 de endereço e 0200.

Você precisaria para quebrar as outras instruções para baixo de forma semelhante para entender completamente. Para a instrução ADD, ambos os registros de origem e destino / endereços são codificados no 5223 instrução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top