Keil et asm instructions?

S

Sphinx

Guest
Salut,

Comment puis-je insérer des instructions à l'intérieur de l'asm Keil code?

par exemple
Je veux faire simple fonction STORE

void STORE (char);

cette fonction, faire le prochain
mov a, # b1
mov @ R0, un

i b1 qui passe la valeur à cette fonction

Merci

 
Vous pouvez utiliser le sous-assemblage.

1.Créer un ensemble de fichiers "ASM_FUNC.A51"
NOM ASM_FUNCTIONS
; Void stocker (char b1)
PUBLIC magasin
_ASMCOD SEGMENT CODE
RSEG _ASMCOD
;-----------------------------------------
;---- Variable 'b1' attribué à Register 'R7' ----
magasin: MOV A, R7
MOV @ R0, A
RET
;-----------------------------------------
FIN

2.en utilisant le fichier dans C

extern void magasin (char b1);

void main (void) (
...
magasin (0xAA);
...
)Le problème est, comment pouvez-vous contrôler la valeur de R0?

Hope this mai aide.

 
Salut,

Merci.
Mais comment le compilateur sait que R7 est l'affectation à b1 automatiquement?i mal.

Pharaon d'Egypte

 
C'est décrire est KE * IL Compiler manuel.

Essayez de compiler avec C, alors l'assemblage de sortie.

void TEST (char B)
(
B = 0;
)

void main (void)
(
TEST (0xAA);
)

Passage de paramètres dans les registres
Le compilateur permet Cx51
jusqu'à trois arguments de la fonction qui doit être passé dans le CPU
registres.Ce mécanisme améliore de façon significative les performances du système en tant que
arguments
n'ont pas besoin d'être écrit et lu de la mémoire.Argument ou
passage de paramètre peut être contrôlé par la REGPARMS et NOREGPARMS
contrôle des directives définies dans le chapitre précédent.
Le tableau suivant détaille les registres utilisés pour les différentes positions argument
et les types de données.
Argument numéro char, 1-byte ptr int, 2-byte ptr long, float générique ptr
1 .................................. .............. R7 .. R6
et R7 ...... R4 R7 ....... R1 R3
2 .............. .................................. R5 .. R4
et R5 ...... R4 R7 ....... R1 R3
3 .............. .................................. R3 .. R2
et R3 ....................... R1 R3
Si aucun des registres sont disponibles pour argument passant, fixe les emplacements mémoire sont
utilisé pour la fonction de paramètres.

 
Pharaon de l'Égypte a écrit:

Salut,Comment puis-je insérer des instructions assembleur à l'intérieur du code ke * il?par exemple

Je veux faire simple fonction STOREvoid STORE (char);cette fonction, faire le prochain

mov a, # b1

mov @ R0, uni b1 qui passe la valeur à cette fonction
 
Salut,

Merci Zeron & Yager
Je pense que l'utilisation de l'assembleur en ligne est facile.

S'il vous plaît écrire i Yager la prochaine source

#
include <REG51.h>
void store (char b1);
void main (void) (
magasin (0xAA);
)
void store (char b1)
(
# pragma ASM
MOV A, # b1
MOV @ R0, A
# pragma ENDASM
)

mais lorsque je compile, je vous la prochaine erreurs

Main.c (11): error C272: 'asm / endasm »exige-src pour être actif
Main.c (14): error C272: 'asm / endasm »exige-src pour être actif

Quel est le problème?

Thanx

 
Cliquez avec le bouton droit sur le nom du fichier dans le gestionnaire de fichiers,
ensuite des options pour ...
et cochez la case "Générer le fichier assembleur SRC".

L'erreur ne sera plus apear.
Mais je ne pense pas que cette méthode d'insertion
mnémoniques fonctionne.

 
Si vous avez besoin d'accès à une adresse mémoire à partir de l'utilisation des macros "absacc.h 'inclure dans le répertoire.

par exemple

#
include <absacc.h>

char ch = DBYTE [30];

va lire les données de mémoire au décalage 30.

Tom

 
Pharaon de l'Égypte a écrit:Main.c (11): error C272: 'asm / endasm »exige-src pour être actif

Main.c (14): error C272: 'asm / endasm »exige-src pour être actifQuel est le problème?

 
Merci

mais les deux codes (2 & 3) de générer

Build cible "Objectif 1"
main.c compilation ...
Public
n'a pas d'objet de modules
Public pas crééLe programme ne sont pas exécuter!

Qu'en est-il que,
s'il vous plaît?

Pharaon d'Egypte

 
Je vais essayer d'expliquer comment l'appel à C Asm principe:

C peut appeler des fonctions écrites en 8051-asm langue:

Les principes sont:C-langue:
Pour appeler le asm-nom de la fonction, doit être défini comme le module externe.
par exemple pour appeler read_ppi -> lire la ppi-données dans l'adresse
en langage C doit être de définir un prototype de l'extérieur, comme ceci:

extern char read_ppi (unsigned int a);

externe de cette fonction ont le passage d'un paramètre dans unsigned int pour attribuer une adresse de ppi qui seront lus.Et ont une valeur de retour en tant que char de données de ppi.

de l'appel principal int

extern char read_ppi (unsigned int addr);

principal ()
(/ / Ce
n'est que de données CHAR en idata

char idata ppi_data;
unsigned int ppi_address;

ppi_data = read_ppi (0x2000) / / cette adresse avec la méthode absolue

ppi_address = 0x4000;
ppi_data = read_ppi (ppi_address);

)en ASM

Doit être créé avec le nom de la fonction PUBLIC pseudo opcode, cette méthode de compilation pour dire que la fonction publiquePUBLIC _read_ppi

CODE_ASM SEGMENT CODE

RSEG CODE_SEG; code pour réinstaller

; Commencer fonction read_ppi
MOYEN 0; à dire utiliser le compilateur registre banque 0

_read_ppi:
/ / _ Précèdent doivent être ajoutés à dire compiler cette fonction ont valeur de retour
/ / Adresse haute en R6, adresse basse que dans R7 ppi adresse

MOV DPH, R6
MOV DPL, R7
MOVX A, @ DPTR

/ / Pour passer un char pour la valeur de retour doit être dans le registre R7, lire le manuel
MOV R7, A
RET

FINS'il vous plaît C-source et la source asm divisé en fichier séparé et compiler.

Merci "

 
Pharaon de l'Égypte a écrit:

mais les deux codes (2 & 3) de générerBuild cible "Objectif 1"

main.c compilation ...

Public n'a pas d'objet de modules

Public pas crééLe programme ne sont pas exécuter!Qu'en est-il que, s'il vous plaît?
 
Salut,

Si ur à l'aide du "petit" modèle de la mémoire, vous devez copier le fichier "c51s.lib»
dans le dossier Lib à votre dossier de projet, ou je pense que votre projet ne sera pas de compiler complètement.

Sincèrement,

 

Welcome to EDABoard.com

Sponsor

Back
Top