这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» iccavr 怎样c语言中调用汇编程序,我用的iccavr

共3条 1/1 1 跳转至

iccavr 怎样c语言中调用汇编程序,我用的iccavr

院士
2006-09-17 18:14:16 打赏
iccavr 怎样c语言中调用汇编程序,我用的iccavr



关键词: iccavr 怎样 言中 调用 汇编程序 用的

院士
2006-12-22 22:43:00 打赏
2楼
问 最好能举个例子,或提供个例子资料什么的 1: 谁有这方面的例子 2: like this onevoid AssemProgram()
{
asm("string of assemble \n"
"another string of assemble \n"
...
);
}
ok you CANuse this function now. 3: 我需要调用整个程序的,因为汇编程序很长 4: 你在汇编之前用asm,然后把汇编程序用括号括起来! 5: 汇编代码很长我不会要一句一句括吧 6: 看过来将你的汇编文件改名字为*.S,然后和C的主程序一起加入工程,在C中要调用的汇编函数在C中声明成外部函数,在汇编文件函数名前面加上下划线,后面是两个冒号,其他的不用改,编译就好了 7: 可是在汇编中不能写portd等的寄存器,只能用单片地址来表示吗也不能用equ等伪指令
有没有办法,能使这个汇编能像纯汇编那样运用自如 8: 可以的我的做法是将汇编文件包含的头文件中的.equ去掉,只留下UDR1 = $9C,这样的语句,就可以编译通过了,这样c调用的汇编文件就和纯汇编一模一样了(指的是语法,格式当然稍有不同) 9: iccAVR库中有aiom128.s这是汇编头文件 iccAVR库中有aiom128.s等等。这是汇编头文件 10: 这样的话就会出现新的问题:因为必须去掉相应的.def指令,那么
XL =r26
XH =r27
YL =r28
YH =r29
ZL =r30
ZH =r31
就会出现r26..r31等等出错,因此在汇编中无法使用x、y、z
这该怎么办 11: .def指令不要去掉下面是我改的128的头文件,你要是用128的话,可以直接考过去用,不是的话就仿照改吧
m128def.inc
/**********************************************/
;***************************************************************************
;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y
;*
;* Number : AVR000
;* File Name : "m128def.inc"
;* Title : Register/Bit Definitions for the ATmega128
;* Date : 07.09.2001
;* Version : 1.0
;* Support telephone : +47 72 88 43 88 (ATMEL Norway)
;* Support fax : +47 72 88 43 99 (ATMEL Norway)
;* Support E-mail : AVR@atmel.no
;* Target MCU : ATmega128
;*
;* DESCRIPTION
;* When including this file in the assembly program file, all I/O register
;* names and I/O register bit names appearing in the data book CANbe used.
;* In addition, the six registers forming the three data pointers X, Y and
;* Z have been assigned names XL - ZH. Highest RAM address for Internal
;* SRAM is also defined
;*
;* The Register names are represented by their hexadecimal address.
;*
;* The Register Bit names are represented by their bit number (0-7).
;*
;* Please observe the difference in using the bit names with instructions
;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc"
;* (skip if bit in register set/cleared). The following example illustrates
;* this:
;*
;* in r16,PORTB ;read PORTB latch
;* sbr r16,(1<;* out PORTB,r16 ;output to PORTB
;*
;* in r16,TIFR ;read the Timer Interrupt Flag Register
;* sbrc r16,TOV0 ;test the overflow flag (use bit#)
;* rjmp TOV0_is_set ;jump if set
;* ... ;otherwise do something else
;***************************************************************************

;**** Specify Device ****
;.device ATmega128

;*****************************************************************************
; I/O Register Definitions
;*****************************************************************************

;**** Memory Mapped I/O Register Definitions ($FF-$60) ****
UCSR1C = $9D
UDR1 = $9C
UCSR1A = $9B
UCSR1B = $9A
UBRR1L = $99
UBRR1H = $98
UCSR0C = $95
UBRR0H = $90
TCCR3C = $8C
TCCR3A = $8B
TCCR3B = $8A
TCNT3H = $89
TCNT3L = $88
OCR3AH = $87
OCR3AL = $86
OCR3BH = $85
OCR3BL = $84
OCR3CH = $83
OCR3CL = $82
ICR3H = $81
ICR3L = $80
ETIMSK = $7D
ETIFR = $7C
TCCR1C = $7A
OCR1CH = $79
OCR1CL = $78
TWCR = $74
TWDR = $73
TWAR = $72
TWSR = $71
TWBR = $70
OSCCAL = $6F
XMCRA = $6D
XMCRB = $6C
EICRA = $6A
SPMCSR = $68
SPMCR = $68 ; old name for SPMCSR
PORTG = $65
DDRG = $64
PING = $63
PORTF = $62
DDRF = $61

;**** I/O Register Definitions ($3F-$00) ****
SREG = $3F
SPH = $3E
SPL = $3D
XDIV = $3C
RAMPZ = $3B
EICRB = $3A
EIMSK = $39
GIMSK = $39 ; old name for EIMSK
GICR = $39 ; old name for EIMSK
EIFR = $38
GIFR = $38 ; old name for EIFR
TIMSK = $37
TIFR = $36
MCUCR = $35
MCUCSR = $34
TCCR0 = $33
TCNT0 = $32
OCR0 = $31
ASSR = $30
TCCR1A = $2F
TCCR1B = $2E
TCNT1H = $2D
TCNT1L = $2C
OCR1AH = $2B
OCR1AL = $2A
OCR1BH = $29
OCR1BL = $28
ICR1H = $27
ICR1L = $26
TCCR2 = $25
TCNT2 = $24
OCR2 = $23
OCDR = $22 ; New
WDTCR = $21
SFIOR = $20 ; New
EEARH = $1F
EEARL = $1E
EEDR = $1D
EECR = $1C
PORTA = $1B
DDRA = $1A
PINA = $19
PORTB = $18
DDRB = $17
PINB = $16
PORTC = $15
DDRC = $14 ; New
PINC = $13 ; New
PORTD = $12
DDRD = $11
PIND = $10
SPDR = $0F
SPSR = $0E
SPCR = $0D
UDR0 = $0C
UCSR0A = $0B
UCSR0B = $0A
UBRR0L = $09
ACSR = $08
ADMUX = $07
ADCSR = $06
ADCH = $05
ADCL = $04
PORTE = $03
DDRE = $02
PINE = $01
PINF = $00


;*****************************************************************************
; Bit Definitions
;*****************************************************************************

;**** MCU Control ****
SRE = 7 ; MCUCR
SRW10 = 6
SE = 5
SM1 = 4
SM0 = 3
SM2 = 2
IVSEL = 1
IVCE = 0

JTD = 7 ; MCUCSR
JTRF = 4
WDRF = 3
BORF = 2
EXTRF = 1
PORF = 0

SRL2 =6 ; XMCRA
SRL1 =5
SRL0 =4
SRW01 =3
SRW00 =2
SRW11 =1

XMBK = 7 ; XMCRB
XMM2 = 2
XMM1 = 1
XMM0 = 0

SPMIE =7 ; SPMCSR
ASB =6 ; backwards compatiblity
ASRE =4 ; backwards compatiblity
RWWSB =6
RWWSRE =4
BLBSET =3
PGWRT =2
PGERS =1
SPMEN =0

IDRD = 7 ; OCDR
OCDR6 = 6
OCDR5 = 5
OCDR4 = 4
OCDR3 = 3
OCDR2 = 2
OCDR1 = 1
OCDR0 = 0

XDIVEN = 7 ; XDIV
XDIV6 = 6
XDIV5 = 5
XDIV4 = 4
XDIV3 = 3
XDIV2 = 2
XDIV1 = 1
XDIV0 = 0

TSM = 7 ; SFIOR
ADHSM = 4
ACME = 3
PUD = 2
PSR0 = 1
PSR1 = 0
PSR2 = 0
PSR3 = 0
PSR321 = 0

;**** Analog to Digital Converter ****
ADEN = 7 ; ADCSR
ADSC = 6
ADFR = 5
ADIF = 4
ADIE = 3
ADPS2 = 2
ADPS1 = 1
ADPS0 = 0

REFS1 =7 ; ADMUX
REFS0 =6
ADLAR =5
MUX4 =4
MUX3 =3
MUX2 =2
MUX1 =1
MUX0 =0

;**** Analog Comparator ****
ACD = 7 ; ACSR
ACBG = 6
ACO = 5
ACI = 4
ACIE = 3
ACIC = 2
ACIS1 = 1
ACIS0 = 0


;**** External Interrupts ****
INT7 = 7 ; EIMSK
INT6 = 6
INT5 = 5
INT4 = 4
INT3 = 3
INT2 = 2
INT1 = 1
INT0 = 0

INTF7 = 7 ; EIFR
INTF6 = 6
INTF5 = 5
INTF4 = 4
INTF3 = 3
INTF2 = 2
INTF1 = 1
INTF0 = 0

ISC71 = 7 ; EICRB
ISC70 = 6
ISC61 = 5
ISC60 = 4
ISC51 = 3
ISC50 = 2
ISC41 = 1
ISC40 = 0

ISC31 = 7 ; EICRA
ISC30 = 6
ISC21 = 5
ISC20 = 4
ISC11 = 3
ISC10 = 2
ISC01 = 1
ISC00 = 0

;**** Timer Interrupts ****
OCIE2 = 7 ; TIMSK
TOIE2 = 6
TICIE1 = 5
OCIE1A = 4
OCIE1B = 3
TOIE1 = 2
OCIE0 = 1
TOIE0 = 0

TICIE3 = 5 ; ETIMSK
OCIE3A = 4
OCIE3B = 3
TOIE3 = 2
OCIE3C = 1
OCIE1C = 0

OCF2 = 7 ; TIFR
TOV2 = 6
ICF1 = 5
OCF1A = 4
OCF1B = 3
TOV1 = 2
OCF0 = 1
TOV0 = 0

ICF3 = 5 ; ETIFR
OCF3A = 4
OCF3B = 3
TOV3 = 2
OCF3C = 1
OCF1C = 0

;**** Asynchronous Timer ****
AS0 = 3 ; ASSR
TCN0UB = 2
OCR0UB = 1
TCR0UB = 0

;**** Timer 0 ****
FOC0 = 7 ; TCCR0
WGM00 = 6
COM01 = 5
COM00 = 4
WGM01 = 3
CS02 = 2
CS01 = 1
CS00 = 0

;**** Timer 1 ****
COM1A1 = 7 ; TCCR1A
COM1A0 = 6
COM1B1 = 5
COM1B0 = 4
COM1C1 = 3
COM1C0 = 2
PWM11 = 1 ; OBSOLETE! Use WGM11
PWM10 = 0 ; OBSOLETE! Use WGM10
WGM11 = 1
WGM10 = 0

ICNC1 = 7 ; TCCR1B
ICES1 = 6
CTC11 = 4 ; OBSOLETE! Use WGM13
CTC10 = 3 ; OBSOLETE! Use WGM12
WGM13 = 4
WGM12 = 3
CS12 = 2
CS11 = 1
CS10 = 0

FOC1A = 7 ; TCCR1C
FOC1B = 6
FOC1C = 5

;**** Timer 2 ****
FOC2 = 7 ; TCCR2
WGM20 = 6
COM21 = 5
COM20 = 4
WGM21 = 3
CS22 = 2
CS21 = 1
CS20 = 0

;**** Timer 3 ****
COM3A1 = 7 ; TCCR3A
COM3A0 = 6
COM3B1 = 5
COM3B0 = 4
COM3C1 = 3
COM3C0 = 2
PWM31 = 1 ; OBSOLETE! Use WGM31
PWM30 = 0 ; OBSOLETE! Use WGM30
WGM31 = 1
WGM30 = 0

ICNC3 = 7 ; TCCR3B
ICES3 = 6
CTC31 = 4 ; OBSOLETE! Use WGM33
CTC30 = 3 ; OBSOLETE! Use WGM32
WGM33 = 4
WGM32 = 3
CS32 = 2
CS31 = 1
CS30 = 0

FOC3A = 7 ; TCCR3C
FOC3B = 6
FOC3C = 5

;**** Watchdog Timer ****
WDCE = 4 ; WDTCR
WDTOE = 4 ; For Mega103 compability
WDE = 3
WDP2 = 2
WDP1 = 1
WDP0 = 0

;**** EEPROM Control Register ****
EERIE = 3 ; EECR
EEMWE = 2
EEWE = 1
EERE = 0

;**** USART 0 and USART 1 ****
RXC = 7 ; (UCSRA0/1)
TXC = 6
UDRE = 5
FE = 4
DOR = 3
PE = 2 ; OBSOLETED!
U2X = 1
MPCM = 0

RXC0 = 7 ; (UCSR0A)
TXC0 = 6
UDRE0 = 5
FE0 = 4
DOR0 = 3
UPE0 = 2
U2X0 = 1
MPCM0 = 0

RXC1 = 7 ; (UCSR1A)
TXC1 = 6
UDRE1 = 5
FE1 = 4
DOR1 = 3
UPE1 = 2
U2X1 = 1
MPCM1 = 0

RXCIE = 7 ; (UCSRB0/1)
TXCIE = 6
UDRIE = 5
RXEN = 4
TXEN = 3
UCSZ2 = 2
RXB8 = 1
TXB8 = 0

RXCIE0 = 7 ; (UCSR0B)
TXCIE0 = 6
UDRIE0 = 5
RXEN0 = 4
TXEN0 = 3
UCSZ02 = 2
RXB80 = 1
TXB80 = 0

RXCIE1 = 7 ; (UCSR1B)
TXCIE1 = 6
UDRIE1 = 5
RXEN1 = 4
TXEN1 = 3
UCSZ12 = 2
RXB81 = 1
TXB81 = 0

UMSEL = 6 ; (UCSRC0/1)
UPM1 = 5
UPM0 = 4
USBS = 3
UCSZ1 = 2
UCSZ0 = 1
UCPOL = 0

UMSEL0 = 6 ; (UCSR0C)
UPM01 = 5
UPM00 = 4
USBS0 = 3
UCSZ01 = 2
UCSZ00 = 1
UCPOL0 = 0

UMSEL1 = 6 ; (UCSR1C)
UPM11 = 5
UPM10 = 4
USBS1 = 3
UCSZ11 = 2
UCSZ10 = 1
UCPOL1 = 0


;**** SPI ****
SPIE = 7 ; SPCR
SPE = 6
DORD = 5
MSTR = 4
CPOL = 3
CPHA = 2
SPR1 = 1
SPR0 = 0

SPIF = 7 ; SPSR
WCOL = 6
SPI2X = 0

;**** TWI ****
TWINT = 7 ;TWCR
TWEA = 6
TWSTA = 5
TWSTO = 4
TWWC = 3
TWEN = 2
TWIE = 0

TWS7 = 7 ; TWSR
TWS6 = 6
TWS5 = 5
TWS4 = 4
TWS3 = 3
TWPS1 = 1
TWPS0 = 0

TWA6 = 7
TWA5 = 6
TWA4 = 5
TWA3 = 4
TWA2 = 3
TWA1 = 2
TWA0 = 1
TWGCE = 0 ; TWAR


;**** PORT A ****
PA7 = 7 ; PORTA
PA6 = 6
PA5 = 5
PA4 = 4
PA3 = 3
PA2 = 2
PA1 = 1
PA0 = 0
PORTA7 = 7
PORTA6 = 6
PORTA5 = 5
PORTA4 = 4
PORTA3 = 3
PORTA2 = 2
PORTA1 = 1
PORTA0 = 0

DDA7 = 7 ; DDRA
DDA6 = 6
DDA5 = 5
DDA4 = 4
DDA3 = 3
DDA2 = 2
DDA1 = 1
DDA0 = 0

PINA7 = 7 ; PINA
PINA6 = 6
PINA5 = 5
PINA4 = 4
PINA3 = 3
PINA2 = 2
PINA1 = 1
PINA0 = 0

;**** PORT B ****
PB7 = 7 ; PORTB
PB6 = 6
PB5 = 5
PB4 = 4
PB3 = 3
PB2 = 2
PB1 = 1
PB0 = 0
PORTB7 = 7
PORTB6 = 6
PORTB5 = 5
PORTB4 = 4
PORTB3 = 3
PORTB2 = 2
PORTB1 = 1
PORTB0 = 0

DDB7 = 7 ; DDRB
DDB6 = 6
DDB5 = 5
DDB4 = 4
DDB3 = 3
DDB2 = 2
DDB1 = 1
DDB0 = 0

PINB7 = 7 ; PINB
PINB6 = 6
PINB5 = 5
PINB4 = 4
PINB3 = 3
PINB2 = 2
PINB1 = 1
PINB0 = 0

;**** PORT C ****
PC7 = 7 ; PORTC
PC6 = 6
PC5 = 5
PC4 = 4
PC3 = 3
PC2 = 2
PC1 = 1
PC0 = 0
PORTC7 = 7
PORTC6 = 6
PORTC5 = 5
PORTC4 = 4
PORTC3 = 3
PORTC2 = 2
PORTC1 = 1
PORTC0 = 0

DDC7 = 7 ; DDRC
DDC6 = 6
DDC5 = 5
DDC4 = 4
DDC3 = 3
DDC2 = 2
DDC1 = 1
DDC0 = 0

PINC7 = 7 ; PINC
PINC6 = 6
PINC5 = 5
PINC4 = 4
PINC3 = 3
PINC2 = 2
PINC1 = 1
PINC0 = 0

;**** PORT D ****
PD7 = 7 ; PORTD
PD6 = 6
PD5 = 5
PD4 = 4
PD3 = 3
PD2 = 2
PD1 = 1
PD0 = 0
PORTD7 = 7
PORTD6 = 6
PORTD5 = 5
PORTD4 = 4
PORTD3 = 3
PORTD2 = 2
PORTD1 = 1
PORTD0 = 0

DDD7 = 7 ; DDRD
DDD6 = 6
DDD5 = 5
DDD4 = 4
DDD3 = 3
DDD2 = 2
DDD1 = 1
DDD0 = 0

PIND7 = 7 ; PIND
PIND6 = 6
PIND5 = 5
PIND4 = 4
PIND3 = 3
PIND2 = 2
PIND1 = 1
PIND0 = 0

;**** PORT E ****
PE7 = 7 ; PORTE
PE6 = 6
PE5 = 5
PE4 = 4
PE3 = 3
PE2 = 2
PE1 = 1
PE0 = 0
PORTE7 = 7 ; PORTE
PORTE6 = 6
PORTE5 = 5
PORTE4 = 4
PORTE3 = 3
PORTE2 = 2
PORTE1 = 1
PORTE0 = 0

DDE7 = 7 ; DDRE
DDE6 = 6
DDE5 = 5
DDE4 = 4
DDE3 = 3
DDE2 = 2
DDE1 = 1
DDE0 = 0

PINE7 = 7 ; PINE
PINE6 = 6
PINE5 = 5
PINE4 = 4
PINE3 = 3
PINE2 = 2
PINE1 = 1
PINE0 = 0

;**** PORT F ****
PF7 = 7 ; PORTF
PF6 = 6
PF5 = 5
PF4 = 4
PF3 = 3
PF2 = 2
PF1 = 1
PF0 = 0
PORTF7 = 7
PORTF6 = 6
PORTF5 = 5
PORTF4 = 4
PORTF3 = 3
PORTF2 = 2
PORTF1 = 1
PORTF0 = 0

DDF7 = 7 ; DDRF
DDF6 = 6
DDF5 = 5
DDF4 = 4
DDF3 = 3
DDF2 = 2
DDF1 = 1
DDF0 = 0

PINF7 = 7 ; PINF
PINF6 = 6
PINF5 = 5
PINF4 = 4
PINF3 = 3
PINF2 = 2
PINF1 = 1
PINF0 = 0

;**** PORT G ****
PG4 = 4 ; PORTG
PG3 = 3
PG2 = 2
PG1 = 1
PG0 = 0

DDG4 = 4 ; DDRG
DDG3 = 3
DDG2 = 2
DDG1 = 1
DDG0 = 0

PING4 = 4 ; PING
PING3 = 3
PING2 = 2
PING1 = 1
PING0 = 0


;*****************************************************************************
; CPU Register Declarations
;*****************************************************************************

.define XL r26 ; X pointer low
.define XH r27 ; X pointer high
.define YL r28 ; Y pointer low
.define YH r29 ; Y pointer high
.define ZL r30 ; Z pointer low
.define ZH r31 ; Z pointer high


;*****************************************************************************
; Data Memory Declarations
;*****************************************************************************

RAMEND = $10ff ; Highest internal data memory (SRAM) address.
EEPROMEND = $0fff ; Highest EEPROM address.

;*****************************************************************************
; Program Memory Declarations
;*****************************************************************************

FLASHEND = $FFFF ; Highest program memory (flash) address
; (When addressed as 16 bit words)

;**** Boot Vectors ****
; byte groups
; /--\/--\/--\/--\
SMALLBOOTSTART = 0b1111111000000000 ; ($FE00) Smallest boot block is 512W
SECONDBOOTSTART = 0b1111110000000000 ; ($FC00) 2'nd boot block size is 1KW
THIRDBOOTSTART = 0b1111100000000000 ; ($F800) Third boot block size is 2KW
LARGEBOOTSTART = 0b1111000000000000 ; ($F000) Largest boot block is 4KW


;**** Page Size ****
PAGESIZE = 128 ; Number of WORDS in a page


;**** Interrupt Vectors ****
INT0addr = $002 ; External Interrupt0 Vector Address
INT1addr = $004 ; External Interrupt1 Vector Address
INT2addr = $006 ; External Interrupt2 Vector Address
INT3addr = $008 ; External Interrupt3 Vector Address
INT4addr = $00a ; External Interrupt4 Vector Address
INT5addr = $00c ; External Interrupt5 Vector Address
INT6addr = $00e ; External Interrupt6 Vector Address
INT7addr = $010 ; External Interrupt7 Vector Address
OC2addr = $012 ; Output Compare2 Interrupt Vector Address
OVF2addr = $014 ; Overflow2 Interrupt Vector Address
ICP1addr = $016 ; Input Capture1 Interrupt Vector Address
OC1Aaddr = $018 ; Output Compare1A Interrupt Vector Address
OC1Baddr = $01a ; Output Compare1B Interrupt Vector Address
OVF1addr = $01c ; Overflow1 Interrupt Vector Address
OC0addr = $01e ; Output Compare0 Interrupt Vector Address
OVF0addr = $020 ; Overflow0 Interrupt Vector Address
SPIaddr = $022 ; SPI Interrupt Vector Address
URXC0addr = $024 ; USART0 Receive Complete Interrupt Vector Address
UDRE0addr = $026 ; USART0 Data Register Empty Interrupt Vector Address
UTXC0addr = $028 ; USART0 Transmit Complete Interrupt Vector Address
ADCCaddr = $02a ; ADC Conversion Complete Handle
ERDYaddr = $02c ; EEPROM Write Complete Handle
ACIaddr = $02e ; Analog Comparator Interrupt Vector Address

OC1Caddr = $030 ; Output Compare1C Interrupt Vector Address
ICP3addr = $032 ; Input Capture3 Interrupt Vector Address
OC3Aaddr = $034 ; Output Compare3A Interrupt Vector Address
OC3Baddr = $036 ; Output Compare3B Interrupt Vector Address
OC3Caddr = $038 ; Output Compare3C Interrupt Vector Address
OVF3addr = $03A ; Overflow3 Interrupt Vector Address
URXC1addr = $03C ; USART1 Receive Complete Interrupt Vector Address
UDRE1addr = $03E ; USART1 Data Register Empty Interrupt Vector Address
UTXC1addr = $040 ; USART1 Transmit Complete Interrupt Vector Address
TWIaddr = $042 ; TWI Interrupt Vector Address
SPMRaddr = $044 ; Store Program Memory Ready Interrupt Vector Address


;**** End of File ****
12: 是在 iccAVR中编吗?aiom128.s不是汇编的头文件吗?
怎么不用这个呢?
问一下
是不是这样调用
;;;void testasm(void);
_testasm::
.....///
这是(*.s)
void main(viod)
{
;;;;
testasm();
;;;;;;;
}
两个文件在一个工程里。。
这样调用可以吗?
我模拟一下,怎么没有反应呢??? 13: 这样:extern void testasm(void);//in C

void main(void)
{
testasm();
}

//以下在in testasm.s

_testasm::
....
ret

专家
2022-08-21 21:01:42 打赏
3楼

了解一下


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]