freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

指令系統(tǒng)與程序編制-資料下載頁(yè)

2025-05-09 00:51本頁(yè)面
  

【正文】 需要重新編寫。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 標(biāo)準(zhǔn) C庫(kù)的位置 標(biāo)準(zhǔn) C庫(kù)存放在軟件安裝路徑下的兩個(gè)子目錄下面: ? 系統(tǒng)頭文件路徑為: x:\ARM\ADSv1_2\Include ? 系統(tǒng)頭文件對(duì)應(yīng)的系統(tǒng)庫(kù)文件的路徑為: x:\ARM\ADSv1_2\Lib\armlib 在鏈接時(shí), armlink有一個(gè)參數(shù),即 libpath可以指定庫(kù)文件的路徑。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? __irq 定義中斷處理函數(shù) __irq void IRQHandler(void) { unsigned int * base=( unsigned int *) 0x80000000。 if(* base==1 ) { C_int_handler()。 } *( base+1)= 0。 } ? 當(dāng)中斷發(fā)生時(shí),所有需要被保護(hù)的寄存器, 編譯器都會(huì)自動(dòng)保存 。同時(shí),在中斷處理完后,會(huì)把 LR- 4的值裝入到 PC,把 SPSR的值復(fù)制到 CPSR來實(shí)現(xiàn)返回。 ? 用這個(gè)關(guān)鍵詞定義的中斷處理函數(shù), 不需要考慮現(xiàn)場(chǎng)的保護(hù) 。 ? 有兩個(gè)限制: ? 函數(shù)不能有參數(shù)和返回值 ; ? 不能用作可重入的中斷處理函數(shù)定義,因?yàn)樗槐4?SPSR的值。 ARM編譯器對(duì) C語(yǔ)言的擴(kuò)展 中斷函數(shù)返回類型必須為 void,且不能帶有參數(shù)。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? __swi 定義軟件中斷 __swi(0) int multiply_two(int , int)。 __ swi(1) int add_two(int , int)。 __ swi(2) int add_multiply_two(int , int, int, int)。 ? 軟件中斷處理函數(shù)為: void C_SWI_Handler(int swi_num, int *regs) { switch(swi_num) { case 0: regs[0]= regs[0]*regs[1]。 break。 case 1: regs[0]= regs[0]+regs[1]。 break。 } case 2: regs[0]=( regs[0]*regs[1])+(regs[2]*regs[3])。 break。 } } 軟件中斷函數(shù)允許帶有 參數(shù)和返回值。 返回 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? __inline 定義內(nèi)聯(lián)函數(shù) ? 把 __inline這個(gè)關(guān)鍵詞定義的函數(shù)在被調(diào)用的地方展開。 ? 可以消除函數(shù)調(diào)用的開銷。 __inline void enable_IRQ(void) { int tmp。 __asm { MRS tmp,CPSR BIC tmp,tmp,0x80 MSR CPSR_c,tmp } } __inline void disable_IRQ(void) { int tmp。 __asm { MRS tmp,CPSR ORR tmp,tmp,0x80 MSR CPSR_c,tmp } } int main(void) { disable_IRQ()。 enable_IRQ()。 } 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? __register 聲明一個(gè)變量,告訴編譯器盡量把該變量保存到寄存器里。 ? __value_in_regs 告訴編譯器即使函數(shù)的返回值多于四個(gè),也使用寄存器返回,而不用堆棧。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 該方法可以在 C程序中直接實(shí)現(xiàn)用 C語(yǔ)言無法實(shí)現(xiàn)的一些硬件控制功能,也可以用該方法在 C程序中的關(guān)鍵部分用匯編語(yǔ)句代替 C語(yǔ)句以優(yōu)化這個(gè)程序。 (1)在 C程序中直接嵌入?yún)R編語(yǔ)句 注意: __asm的 {}中,匯編語(yǔ)句前的位置至少應(yīng)空一格。 7 C與匯編的相互調(diào)用 (混合編程 ) ① 內(nèi)聯(lián)匯編 (inline assemble) int add(int i, int j) { int res。 __asm { ADD res, i, j //可以直接使用 C變量 i、 j與 res } 。 //ADS中支持 return res。 } void main() { printf(“additiion result is:’%d’\n”,add(1,2))。 } asm(“ instruction [。 instruction]”)。 //ARM C++中使用 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 C語(yǔ)言中內(nèi)嵌匯編示例 include void my_strcpy(char* src, const char* dst){ int ch。 __asm{ loop: LDRB ch, [src], 1 STRB ch, [dst], 1 CMP ch, 0 BNE loop }。 } int main(void){ const char* a = Hello World!。 char b[20]。 __asm{ MOV R0, a MOV R1, b BL my_strcpy, {R0, R1} }。 printf(Original String: %s\n,a)。 printf(“ Copied String: %s\n,b)。 return 0。 } 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ② 嵌入式匯編 (embedded assemble) __asm void my_strcpy(const char *src,const *dst) { LDRB r3,[r0],1 STRB r3,[r1],1 CMP r3,0 BNE loop MOV pc,lr } __asm int add(int i,int j) { ADD r0, r0,r1 //不能直接使用 C變量 i,j MOV pc,lr } void main() { const char *a=“hello world!”。 char b[20]。 my_strcpy(a,b)。 printf(“Original string:’%s’\n”,a)。 printf(“Copied string:’%s’\n”,b)。 } 應(yīng)滿足 ATPCS( The ARMTHUMB Procedure Call Standard)的調(diào)用規(guī)則。見 x:\ARM\ADSv1_2\PDF\specs\ loop 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ( 2) ATPCS規(guī)則 ? ATPCS( The ARMTHUMB Procedure Call Standard) ? APCS ( The ARM Procedure Call Standard) ? 規(guī)定 C與匯編之間的相互調(diào)用的規(guī)則,包括: ? 如何通過寄存器傳遞函數(shù)參數(shù)和函數(shù)返回值; ? 寄存器的使用規(guī)則 ? 堆棧的使用規(guī)則 ? 參數(shù)的傳遞規(guī)則 ? 函數(shù)返回值規(guī)則 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 寄存器的使用規(guī)則 ? R0~R3用來傳遞參數(shù) ; R4~R11用來保存局部變量; R12用作子程序內(nèi)部調(diào)用的 scratch寄存器;R13( sp)用作堆棧指針; R14( lr)用作鏈接寄存器,保存子程序的返回地址。 R15( pc)用作程序計(jì)數(shù)器,保存著下一條要取的指令的地址。 ? 由于 R4~R11用來保存局部變量,對(duì)于一個(gè)遵循ATPCS規(guī)則的函數(shù),在進(jìn)入該函數(shù)的時(shí)候, 必須保存 R4~R11中被函數(shù)破壞的寄存器 ,然后在函數(shù)返回時(shí),恢復(fù)它們的值。 STMFD sp!,{r4r11,lr} LDMFD sp!,{r4r11,pc} 如果有些寄存器在函數(shù)中沒有被用到,那么就沒有必 要保存這些寄存器。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 堆棧的使用規(guī)則 ? APCS規(guī)定的堆棧是 FD( Full Descending )類型。 STMFD sp!,{r4r11,lr} LDMFD sp!,{r4r11,pc} ? 對(duì)堆棧的操作是字節(jié)( 8bit)對(duì)齊的,在匯編程序中用 PRESERVE8來告訴鏈接器,本匯編程序的數(shù)據(jù)堆棧是字節(jié)( 8bit)對(duì)齊的。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 參數(shù)的傳遞規(guī)則 ? 當(dāng)子程序(被調(diào)函數(shù))的參數(shù)的個(gè)數(shù)小于或等于 4時(shí),用 R0~R3來傳遞參數(shù)。 匯編調(diào)用 C函數(shù): mov r3,100 mov r2,100 mov r1,100 mov r0,100 BL sum C函數(shù): int sum(int a, int b, int c, int d) {return a+b+c+d。} 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 匯編調(diào)用 C函數(shù): STMFD sp!,{r4} mov r4,100 STMIA sp,{r4} mov r3,100 mov r2,100 mov r1,100 mov r0,100 BL sum C函數(shù): int sum(int a, int b, int c, int d, int e) {return a+b+c+d+e。} ? 當(dāng)子程序(被調(diào)函數(shù))的參數(shù)的個(gè)數(shù)超過 4時(shí)就必須用堆棧來傳遞參數(shù)。 其中,將前 4個(gè)參數(shù)用 R0~R3來傳遞, 剩余的參數(shù)壓入堆棧中。入棧的順序和參數(shù)的順序剛好相反(最后一個(gè)參數(shù)先入棧)。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 參數(shù)傳遞總結(jié) 參數(shù)類型 參數(shù)數(shù)量 1 2 3 4 char R0 R1 R2 R3 short R0 R1 R2 R3 int/long R0 R1 R2 R3 float R0 R1 R2 R3 32位指針 R0 R1 R2 R3 32位結(jié)構(gòu) R0 R1 R2 R3 long long R0和 R1 R2和 R3 堆棧 堆棧 double R0和 R1 R2和 R3 堆棧 堆棧 64位結(jié)構(gòu) R0和 R1 R2和 R3 堆棧 堆棧 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 函數(shù)返回值規(guī)則 ? 如果結(jié)果為 32位的整數(shù),函數(shù)值可以通過 R0寄存器返回; ? 如果結(jié)果為 64位的整數(shù),函數(shù)值可以通過 R0和 R1這兩個(gè)寄存器返回。 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? 函數(shù)返回值總結(jié) 返回值類型 寄存器 char R0 short R0 int/long R0 float R0 32位指針 R0 32位結(jié)構(gòu) R0 long long R0和 R1 double R0和 R1 64位結(jié)構(gòu) R0和 R1 成都信息工程學(xué)院 3+1創(chuàng)新實(shí)驗(yàn)班 2021/6/14 ? C語(yǔ)言中調(diào)用匯編函數(shù) (3)C語(yǔ)言中調(diào)用匯編函數(shù) include extern void str
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1