keil4在C51中嵌入汇编语言,KEIL C51程序中如何嵌入汇编

本文介绍了嵌入式系统中汇编语言的使用,包括如何调用外部子程序,以及在C语言中使用__asm进行汇编代码嵌入。示例展示了在程序中设置中断和任务切换的过程,涉及栈指针管理和任务状态保存。同时,讨论了程序编译时的配置选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1=0x00;

#pragma asm

MOV     R3,#08H

DJNZ    R3,$

#pragma endasm

P1=0xff;

}

void delay(void)

{

#pragma asm

MOV     R4,#08H

DJNZ    R4,$

#pragma endasm

}

(4)、汇编语言中外部子程序的调用

汇编语言中外部子程序的调用

在遍写程序的时候,可以在一个文件的汇编程序中调用另一个文件的子程序。具体的方法如下。

1:在主程序文件中要声明所调用的子程序在外部。比如在主程序中调用子程序名为DELAY的子程序,其格式为:EXTRN   CODE (DELAY)

2:在被调用的文件中要声明,被调用的子程序为公共类型的。比如DELAY要声明的格式为:PUBLIC  DELAY

3:在被调用的文件中还需要声明此文件是可从新定位的。

SS      SEGMENT CODE

RSEG SS

整个事例如下,文件A:

EXTRN   CODE (DELAY)

EXTRN   CODE (DEL)

ORG     0000H

AJMP    MAIN

ORG     0030H

MAIN:   NOP

TT:     MOV     P0,#00H

LCALL   DELAY

LCALL   DEL

MOV     P0,#0FFH

LJMP    TT

END

文件B:

PUBLIC  DELAY

PUBLIC  DEL

SS      SEGMENT CODE

RSEG SS

DELAY: MOV     R2,#3H

DJNZ    R2,$

RET

DEL:    MOV     R3,#03H

DJNZ   R3,$

RET

END

(5)采用__asm进行汇编的嵌入,例如:

if (sys_ctrl.t_run_num!=sys_ctrl.nt_run_num)

{

__asm PUSH ACC                  //断点数据保存

__asm PUSH B

__asm PUSH PSW

__asm PUSH AR0

__asm PUSH AR1

__asm PUSH AR2

__asm PUSH AR3

__asm PUSH AR4

__asm PUSH AR5

__asm PUSH AR6

__asm PUSH AR7

sys_task[sys_ctrl.t_run_num].task_sp = SP;  //保存栈顶地址

sys_ctrl.t_run_num = sys_ctrl.nt_run_num;   //任务号切换

sys_ctrl.nt_run_num = 0;                    //将新任务号清除便于后续操作

SP = sys_task[sys_ctrl.t_run_num].task_sp;  //获取新任务栈顶地址

__asm POP AR7                   //恢复断点数据

__asm POP AR6

__asm POP AR5

__asm POP AR4

__asm POP AR3

__asm POP AR2

__asm POP AR1

__asm POP AR0

__asm POP PSW

__asm POP B

__asm POP ACC

}

编译时,进入如下对话框,选中其中标出的两项:

d5445d791a91091b58d8ce35e1e7ddbe.png

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] 610626052e95c7fbe3d254abc769d9ad.gif

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值