In diesem Beispiel-Programm soll ein Buffer mit einer definierten Größe erstellt werden und komplett initialisiert werden (mit einem bestimmten Wert). Weiterhin wird das Initialisierungs-Unterprogramm in einer eigenen Datei ausgelagert.
ASM-Programm
FILE: main.asm
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: main.asm ; Author: declis (xdec.de) ;*********************************************** .cdecls "msp430g2231.h" .cdecls "lib_func_asm.h" .bss buffer,size ;allocate 16 bytes in RAM .ref buf_init .global main .text main: mov.w #0x280,SP ;initialize stack pointer mov.w #WDTPW+WDTHOLD,&WDTCTL ;stop watchdog timer mov.w #buffer,R4 ;startaddress of buffer in R4 call #buf_init jmp $ .end
FILE: lib_func.asm
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: lib_func.asm ; Author: declis (xdec.de) ;*********************************************** .cdecls "msp430g2231.h" .cdecls "lib_func_asm.h" .def buf_init ;global entry of function .text ;------------------------------------------ ; Name: buf_init ; Description: initialize memory/buffer ; Input: R4 - sourcepointer of buffer ; Returns: nothing ; Destroys: nothing ;------------------------------------------ buf_init: push.w SR ;save status register push.w R4 ;save other registers push.w R5 mov.w #size,R5 cmp.w #0,R5 ;index=0? loop: jz done ;index=0, return mov.b #value,0(R4) ;copy value into buffer -> buffer[index]=value; inc.w R4 ;sourcepointer+1 dec.w R5 ;index-1 jmp loop done: pop.w R5 pop.w R4 pop.w SR ret .end
FILE: lib_func_asm.h
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: lib_func_asm.h ; Author: declis (xdec.de) ;*********************************************** #ifndef LIB_FUNC_ASM_H_ #define LIB_FUNC_ASM_H_ #define size 16 /* define size=16 */ #define value 0 /* initialize buffer with "value" */ #endif /*LIB_FUNC_ASM_H_*/
Buffer vor der Initialisierung | Buffer nach der Initialisierung (mit Null) |
C-Programm
Und nochmal das gleiche Programm in C übersetzt:
FILE: main.c
/*************************************************
* ___ _ _
* | |_ _ _| |___ ___ _| |___
* | | |_'_| . | -_| _|_| . | -_|
* |___|_,_|___|___|___|_|___|___|
*
* FILE: main.c
* Author: declis (xdec.de)
************************************************/
#include <msp430g2231.h>
#include "lib_func.h"
void main(void)
{
char buffer[size];
WDTCTL=WDTPW+WDTHOLD; /* stop watchdog timer */
buf_init(buffer);
for(;;);
}
FILE: lib_func.c
/*************************************************
* ___ _ _
* | |_ _ _| |___ ___ _| |___
* | | |_'_| . | -_| _|_| . | -_|
* |___|_,_|___|___|___|_|___|___|
*
* FILE: lib_func.c
* Author: declis (xdec.de)
************************************************/
#include <msp430g2231.h>
#include "lib_func.h"
void buf_init(char *buffer)
{
char index=0;
while(index<size)
buffer[index++]=value;
}
FILE: lib_func.h
/*************************************************
* ___ _ _
* | |_ _ _| |___ ___ _| |___
* | | |_'_| . | -_| _|_| . | -_|
* |___|_,_|___|___|___|_|___|___|
*
* FILE: lib_func.h
* Author: declis (xdec.de)
************************************************/
#ifndef LIB_FUNC_H_
#define LIB_FUNC_H_
#define size_def 16
#define value_def 2
void buf_init(char*);
#endif /*LIB_FUNC_H_*/
Buffer mit “2” gefüllt, interessant zu sehen: Das C-Programm ist ein paar Bytes kleiner als das ASM-Programm. |