共2条
1/1 1 跳转至页

问
我用的是TKS-52S仿真器,用的是随机软件,但我想在C语言中嵌入汇编语句,参考Keil C书籍,用
#pragma asm
#pragma endasm
发现不行.
请教周先生,如何解决? 答 1: 这样!在C程序中
{
...
__asm {
NOP
...自己填代码
}
} 答 2: 试了,还是不行 答 3: 这样试试看!!1加库函数
{
...
__asm {
NOP("中间自己填,可参照资料")
......
}
答 4: 楼上的那个是ads中的用法,搂主换个编译器吧 答 5: 才注意到楼主用的是51仿真器,不好意思!好象Keil是不支持内联混合编程的! 答 6: 供参考!QUESTION
I have a problem with following in-line assembly code that I created from an old, existing assembly function:
unsigned char PutChar_I2C(unsigned char ch) {
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
#pragma endasm
}
This code generated these warnings:
warning C280: 'ch': unreferenced local variable
warning C173: missing return-expression
The compiler generates this warning despite the fact I used the variable 'ch' (passed in R7). Also, why is there a warning for a missing return-expression since I set the return value in R7?
ANSWER
There are two solutions to your problem. Since the complete function is just assembly, you should leave it in a separate assembler module and just add the proper segment naming conventions. Then you may call the function from C as shown below:
Assembler Module:
?PR?_PutChar_I2C?FILE SEGMENT CODE
RSEG ?PR?_PutChar_I2C?FILE
PUBLIC _PutChar_I2C
_PutChar_I2C:
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
RET
Function Call from C:
extern unsigned char PutChar_I2C(unsigned char ch);
void main (void) {
val = PutChar_I2C (1);
}
Another solution is to add dummy statements to the C source file as shown below:
unsigned char PutChar_I2C(unsigned char ch) {
// dummy assignment to avoid warning
// 'unreferenced local variable'
ch = ch;
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return 1
CLR MCO
#pragma endasm
// dummy return to avoid warning
// 'missing return-expression'
return (ch);
}
The C51 compiler does not generate warnings. However, carefully review the generated code for these statements, and confirm that the variable 'ch' is correctly assigned to the parameter passing register R7 for the return value.
答 7: 几个链接!http://www.keil.com/support/docs/2308.htm
http://www.keil.com/support/docs/2622.htm
http://www.keil.com/support/docs/1671.htm
#pragma asm
#pragma endasm
发现不行.
请教周先生,如何解决? 答 1: 这样!在C程序中
{
...
__asm {
NOP
...自己填代码
}
} 答 2: 试了,还是不行 答 3: 这样试试看!!1加库函数
{
...
__asm {
NOP("中间自己填,可参照资料")
......
}
答 4: 楼上的那个是ads中的用法,搂主换个编译器吧 答 5: 才注意到楼主用的是51仿真器,不好意思!好象Keil是不支持内联混合编程的! 答 6: 供参考!QUESTION
I have a problem with following in-line assembly code that I created from an old, existing assembly function:
unsigned char PutChar_I2C(unsigned char ch) {
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
#pragma endasm
}
This code generated these warnings:
warning C280: 'ch': unreferenced local variable
warning C173: missing return-expression
The compiler generates this warning despite the fact I used the variable 'ch' (passed in R7). Also, why is there a warning for a missing return-expression since I set the return value in R7?
ANSWER
There are two solutions to your problem. Since the complete function is just assembly, you should leave it in a separate assembler module and just add the proper segment naming conventions. Then you may call the function from C as shown below:
Assembler Module:
?PR?_PutChar_I2C?FILE SEGMENT CODE
RSEG ?PR?_PutChar_I2C?FILE
PUBLIC _PutChar_I2C
_PutChar_I2C:
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
RET
Function Call from C:
extern unsigned char PutChar_I2C(unsigned char ch);
void main (void) {
val = PutChar_I2C (1);
}
Another solution is to add dummy statements to the C source file as shown below:
unsigned char PutChar_I2C(unsigned char ch) {
// dummy assignment to avoid warning
// 'unreferenced local variable'
ch = ch;
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return 1
CLR MCO
#pragma endasm
// dummy return to avoid warning
// 'missing return-expression'
return (ch);
}
The C51 compiler does not generate warnings. However, carefully review the generated code for these statements, and confirm that the variable 'ch' is correctly assigned to the parameter passing register R7 for the return value.
答 7: 几个链接!http://www.keil.com/support/docs/2308.htm
http://www.keil.com/support/docs/2622.htm
http://www.keil.com/support/docs/1671.htm
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |