⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abi

📁 linux下的gcc编译器
💻
字号:
-*- Text -*-This document describes the proposed ABI for the D30V processor.  This isrevision 2 of the document.Revision history:Revision 1:	Original revision of this document.Revision 2:	Done after consultation with Mitsubshi about the calling sequence.	This revision now reduces the number of registers the compiler will not	touch from 18 registers down to 8.	Register 1 is now a normal temporary register, since mvfacc rx,ay,32 is	legal.	Arguments greater than 4 bytes must be passed in an even register or at	a double word alignment.	The va_list type is a structure, not a char *.	The stack must be aligned to 8 byte boundary.  Doubles and long longs	must also be aligned to 8 byte boundaries.	System calls are specified via trap 31.Revision 3:	I added discussion about compiler switches.Register usage:===============	Registers	Call Status	Usage	---------	-----------	-----	R0		hardware	Hardwired to 0	R1		volatile	temp	R2		volatile	Arg 1 and main return value.	R3		volatile	Arg 2 and low bits of 64 bit returns	R4 - R17	volatile	Args 3-16	R18		volatile	Static chain if used	R19 - R25	volatile	temps	R26 - R33	saved		Reserved for user use	R34 - R60	saved		Registers preserved across calls	R61		saved		Frame pointer if needed.	R62		saved		Return address pointer (hardware)	R63		saved		Stack pointer	CR0 - CR3	hardware	{normal,backup} {psw,pc}	CR4 - CR6	hardware	Reserved for future use	CR7 - CR9	volatile	Repeat count, addresses	CR10 - CR11	saved		Modulo start/end	CR12 - CR14	hardware	Reserved for future use	CR15 - CR17	hardware	Interrupt support	F0 - F1		volatile	Execution flags	F2 - F3		volatile	General flags	F4 - F7		volatile	Special purpose flags	A0		volatile	Accumulator	A1		saved		AccumulatorNotes on the register usage:============================   1)	R61 will hold the frame pointer if it is needed.  Normally the frame	pointer will not be needed, in which case this will become another	saved register.   2)	Repeat instructions and delayed branches cannot cross call boundaries.	Similarly, all flags are assumed to not be preserved across calls.   3)	Since so many registers are available, I reserved 8 registers (r26-r33)	for the user to use for any purpose (global variables, interrupt	routines, thread pointer, etc.).  These registers will not be used by	the compiler for any purpose.   4)	One of the two accumulators is saved across calls.   5)	Doubles and long longs will only be allocated to even/odd register	pairs to allow use of the ld2w/st2w instructions.Miscellaneous call information:===============================   1)	Structures are passed in registers, rounding them up to word	boundaries.   2)	Any argument that is greater than word size (4 bytes) must be aligned	to a double word boundary and/or start in an even register.  The	intention here is to be able to use the ld2w/st2w instructions for	moving doubles and long longs.   3)	Variable argument functions are called with the same calling sequence	as non-variable argument functions.  When called, a variable argument	function first saves the 16 registers (R2 - R17) used for passing	arguments.  The va_list type is a structure.  The first element of the	structure is a pointer to the first word saved on the stack, and the	second element is a number that gives which argument number is being	processed.   4)	Word and double word sized structures/unions are returned in registers,	other functions returning structures expect a temporary area address to	be passed as the first argument.The stack frame when a function is called looks like:high		|  ....				|		+-------------------------------+		| Argument word #20		|		+-------------------------------+		| Argument word #19		|		+-------------------------------+		| Argument word #18		|		+-------------------------------+		| Argument word #17		|low	SP---->	+-------------------------------+After the prologue is executed, the stack frame will look like:high		|  ....				|		+-------------------------------+		| Argument word #20		|		+-------------------------------+		| Argument word #19		|		+-------------------------------+		| Argument word #18		|		+-------------------------------+		| Argument word #17		|	Prev sp	+-------------------------------+		|				|		| Save for arguments 1..16 if	|		| the func. uses stdarg/varargs	|		|				|		+-------------------------------+		|				|		| Save area for preserved regs	|		|				|		+-------------------------------+		|				|		| Local variables		|		|				|		+-------------------------------+		|				|		| alloca space if used		|		|				|		+-------------------------------+		|				|		| Space for outgoing arguments	|		|				|low	SP---->	+-------------------------------+System Calls============System calls will be done using "TRAP 31".  Input arguments will be in R2 - R5,and the system call number will be in R6.  Return values from the system callwill be in R2.  Negative values of the return indicate the system call failed,and the value is the negative of the error code.  Here are the assigned systemcall numbers (value in R6):	exit	1	open	2	close	3	read	4	write	5	lseek	6	unlink	7	getpid	8	kill	9	fstat   10			(11 is reserved for sbrk)	argvlen	12	argv	13	chdir	14	stat	15	chmod 	16	utime 	17	time 	18Compiler Switches=================The following d30v specific compiler switches are currently supported:    -mextmem		Link .text/.data/.bss/etc in external memory.    -mextmemory		Same as -mextmem.    -monchip		Link .text/.data/.bss/etc in the onchip data/text			memory.    -mno-asm-optimize	Do not pass -O to the assembler when optimizing (the -O			switch will mark two short instructions that don't			interfere with each other as being done parallel			instead of sequentially).    -masm-optimize	[default] If optimizing, pass -O to the assembler.    -mbranch-cost=n	Increase the internal costs of branches to n.  Higher			costs means that the compiler will issue more			instructions to avoid doing a branch. The default is			2.    -mcond-exec=n	Replace branches around n insns with conditional			execution if we can.  Default is 4.Sections========You can override the effect of the -mextmem/-monchip options by puttingfunctions into either the ".stext" or ".etext" sections.  If you put them intothe ".stext" section, the linker will always link the function into the onchipmemory area.  Similarly, if you put the function in the ".etext" section, thelinker will always link the function into the external memory area.Data can be controlled as well.  If you put the data in the ".sdata" section,the linker will put the data into the onchip data area.  Similarly, if you putthe data in the ".edata" section, the linker will put the data into theexternal memory.Stack pointer=============The crt0.o that we ship loads up the stack pointer with the value of the label__stack.  If you do not define a value for __stack, the linker will choose thetop of the onchip data area (0x20008000) for the stack pointer.  You can set anew value via the options:	-Wl,-defsym,__stack=0x20008000

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -