?? 程序之間的調(diào)用.txt
字號:
* 下面所陳述的程序之間的調(diào)用是基于TigerSharc101處理器,在VisualDSP++3.0上調(diào)試通過驗證。
* VDSP上編程可以使用標準C語言,也可以使用匯編語言。所以,程序之間的調(diào)用共分為4種:
* C語言調(diào)用C語言子程序
* C語言調(diào)用匯編語言子程序
* 匯編語言調(diào)用匯編語言子程序
* 匯編語言調(diào)用C語言子程序
* 下面詳細說明4中調(diào)用方法
* 一:C語言調(diào)用C語言子程序
* 這種調(diào)用方法最簡單,和標準C語言調(diào)用一樣。聲明函數(shù)之后便可以調(diào)用
* 例程:Func調(diào)用SubCFunc
*
* void SubCFunc(int *BuffAddr, int N);
* void Func(void)
* {
* int *BuffAddr;
* int N;
* SunCFunc(BuffAddr, N);
* Return;
* }
*
* void SubCFunc(int *BuffAddr, int N)
* {
* return;
* }
*
*
* 二:C語言調(diào)用匯編語言子程序
* 這種調(diào)用方法最常用。首先要在C語言程序中用extern聲明匯編子函數(shù),在匯編子函數(shù)中要用
* .global _SunAsmFunc;,這樣便可以調(diào)用匯編子程序了
* 2.1 聲明:
* C語言中聲明用 extern void SubAsmFunc(int *BuffAddr, int N);
* 匯編語言中聲明 .global _SubAsmFunc;
* 2.2 參數(shù)傳遞
* C語言的參數(shù)傳遞到匯編語言中,
* 地址和整數(shù)依次分別用j4, j5, j6, j7傳遞
* 浮點數(shù)依次分別用xr4,xr5, xr6, xr7 傳遞
* 匯編函數(shù)的返回值:
* 浮點值放在xr8中
* 整型值放在j8中
* 多于4個參數(shù)的傳遞則要借助堆棧傳遞數(shù)據(jù)。
* 2.3 例程:
* C語言函數(shù):
* extern int SubAsmFunc(int *BuffAddr, float x, int N)
* void CFunc(void)
* {
* int *BuffAddr;
* float x;
* int N;
* SubAsmFunc(BuffAddr, x, N);
* return;
* }
*
* 匯編子程序
* .section program;
* .global _SubAsmFunc;
* _SubAsmFunc:
* //j4存放BufferAddr地址
* //xr5存放浮點數(shù)x
* //j6存放N
* //j8返回值存放地址,如果是浮點數(shù)則放在xr8中
* _SunAsmFunc.end
* .align_code 4;
* cjmp(np)(abs);nop;nop;nop;;
*
* 三: 匯編程序調(diào)用匯編子程序
* 匯編程序調(diào)用匯編子程序時,首先要進行堆棧保護,每進一層子函數(shù)都要進行堆棧保護
* 在實模式下,堆棧保護使用j26,j27, k26,k27寄存器,編程時不要使用j27:24, 和k27:24
* 寄存器,另外j31和k31寄存器也不可以使用,如果要使用必須把這些寄存器的值做保護。
* 3.1 函數(shù)調(diào)用聲明
* 匯編主程序中聲明: .extern _SubAsmFunc;
* 匯編子程序中聲明: .global _SubAsmFunc;
* 3.2 參數(shù)傳遞
* 參數(shù)傳遞遵循C語言調(diào)用匯編語言規(guī)則,但是要在匯編主程序中手動給寄存器賦值
* 3.3 堆棧保護
* 進入一個子程序就要進行堆棧保護,堆棧保護一般定義一個宏來實現(xiàn),在例程中會
* 詳細介紹如何進行堆棧保護。
* 3.4 例程
* 匯編語言調(diào)用匯編語言例程,此例程具有通用性,可多層調(diào)用,例如可以用C語言調(diào)用
* 匯編主程序,再用匯編主程序調(diào)用匯編子程序,然后再逐層返回。
* 匯編語言主程序
* #ifndef mENTER
* #define mENTER \
* j26 = j27 - 0x40; k26 = k27 - 0x40;; \
* [j27+=0xFFFFFFF4] = cjmp; k27 = k27 - 0x4;;
* #define mRETRUN \
* cjmp = [j26+0x40];; \
* cjmp(np)(abs); j27:24 = q[j26+0x44]; k27:26 = q[k26+0x44];;
* #endif
* .extern _SubAsmFunc;
* .section program;
* .global _AsmFunc;
* _AsmFunc:
* mENTER;;
* //匯編主程序接收參數(shù)傳遞
* ..........
* ..........
* //匯編主程序調(diào)用匯編子程序
* .align_code 4;
* if true, call _SubAsmFunc; q[j27+4] = j27:24; q[k27+4] = k27:24;;
* //接收返回值
* ..........
* mRETURN;;
* _AsmFunc.end:
*
* 匯編語言子程序
* .section program;
* .global _SubAsmFunc;
* _SubAsmFunc:
* mENTER;;
* //參數(shù)傳遞
* ..........
* mRETURN;;
* _SubAsmFunc.end:
*
* 四:匯編程序調(diào)用C語言子程序
* 匯編程序調(diào)用C語言子程序前要把必要的積存器進行保護,經(jīng)常保護的寄存器為
* j27:24, k27:24,
* j7:j4, xr7:xr4(如果在繼續(xù)運行的匯編語言程序中不再使用此寄存器則可以不理會它)
* 匯編語言調(diào)用C語言子程序有兩種形式
* 4.1 匯編語言調(diào)用自定義C語言子程序
* 4.1.1 聲明
* 匯編語言主程序聲明: .extern _SubCFunc;
* C語言子程序聲明: 可以聲明,也可以不聲明,如果有別的C程序調(diào)用此函數(shù)
* 則在別的函數(shù)中聲明即可
* 4.1.2 參數(shù)傳遞
* 參數(shù)傳遞規(guī)則同 C語言調(diào)用匯編子程序
* j4,j5,j6,j7傳遞整型參數(shù)
* xr4,xr5,xr6,xr7傳遞浮點參數(shù)
* j8返回整型值,
* xr8返回浮點值
* 4.1.3 堆棧保護
* 調(diào)用子程序前要先保護 j27:24和k27:24
* 4.2 匯編語言調(diào)用VDSP庫函數(shù)子程序
* 4.2.1 聲明
* 匯編語言主程序聲明: .extern __cosf; //庫函數(shù)一般用雙下劃線 C語言主控程序中要包含 math.h頭文件
* 4.2.2 參數(shù)傳遞
* 參數(shù)傳遞同上
* 4.3 例程
* 匯編語言調(diào)用自定義C語言子程序和庫函數(shù)例程
*
* 主控程序及C語言子程序
* #include <math.h>
* extern int AsmFunc(float a, float b, int N);
*
* void main(void)
* {
* int i;
* int value;
* float a,b;
* int N;
* N = 16;
* a = 10;
* b = 20.5;
* value = AsmFunc(a, b, N);
* while(1)
* {
* i++;
* }
* return;
* }
* //C語言子程序,實現(xiàn)加法
* int SubCFunc(float a, float b, int N)
* {
* int result;
* result = a + b;
* return result;
* }
*
* //匯編語言程序
* #ifndef mENTER
*
* #define mENTER \
* j26 = j27 - 0x40; k26 = k27 - 0x40;; \
* [j27 += 0xFFFFFFF4] = cJMP; k27 = k27 - 0x04;;
* #define mRETURN \
* cjmp = [j26 + 0x40];; \
* cjmp(ABS)(NP); j27:24 = Q[j26 + 0x44]; k27:24 = Q[k26 + 0x44];;
*
* #endif
*
* .extern _SubCFunc;
* .extern __cosf;
* .section program;
* .global _AsmFunc;
* _AsmFunc:
* mENTER;;
* //接收參數(shù)并處理
* ................
* //給調(diào)用SubCFunc準備參數(shù)
* //xr4 = a;;
* //xr5 = b;;
* //j6 = N;;
* .align_code 4;
* if true, call _SubCFunc; q[j27+4] = j27:24; q[k27+4] = k27:24;;
* //接收返回值 保存j8
*
* //給調(diào)用cosf準備參數(shù)
* //xr4 = 0.5;;
* .align_code 4;
* if true, call __cosf; q[j27+4] = j27:24; q[k27+4] = k27:24;;
* //接收返回值xr8
*
* //匯編程序返回值處理
* ..................
* mRETURN;;
* _AsmFunc.end:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -