日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swi 指令能用在C语言吗,内嵌汇编指令的应用举例

發布時間:2024/9/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swi 指令能用在C语言吗,内嵌汇编指令的应用举例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面是在C語言程序中嵌入式匯編程序的例子。通過這幾個例子,可幫助用戶更好地理解內嵌匯編的特點及用法。

(1)? 字符串復制

本例主要介紹如何使用指令BL調用子程序。

注意,在內嵌的SWI和BL指令中,除了正常的操作數域外,還必須增加3個可選的寄存器列表。在這個程序中就能體現這一點。

示例 使用指令BL調用子程序

#include

void my_strcpy(char *src,const char *dst)

{

int ch;

__asm

{

loop:

#ifndef _asm??????????? /*ARM版本*/

LDRR ch,[src],#1

STRB ch,[dst],#1

#else?????????????????? /*Thumb版本*/

LDRB ch,[src]

ADD dst,#1

#endif

CMP ch,#0

BNE loop

}

}

int main

{

const char *a="Hello world!";

char b[20];

__asm

{

MOV R0,a??????????????? /*設置入口設置*/

MOV R1,b

BL my_strcpy,{R0,R1}??? /*調用my_strcpy()函數*/

}

printf("Original string:%s\n",a);

printf("Copied string:%s\n",b);

return 0;

}

在這個例子中,主函數main()中的“BL_strcpy,{R0,R1}”指令的輸入寄存器列表為{R0,R1},沒有輸出寄存器列表。子程序使用的工作寄存器位ATPCS默認工作寄存器R0~R3、R12、LR以及PSR。

2)使能和禁止中斷

本例主要介紹如何利用內嵌匯編程序來使能和禁止中斷。

使能和禁止中斷是通過修改CPSR寄存器中的位7完成的。這些操作必須在特權模式下進行,因為在用戶模式下不能使用修改CPSR寄存器中的控制位。

示例 中斷的使能和禁止

__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();

}

凌陽教育,專注嵌入式人才培養多年,完善的培養方案,強大的師資,合理的課程安排,成功從小白蛻變為嵌入式工程師。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的swi 指令能用在C语言吗,内嵌汇编指令的应用举例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。