共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网站征稿正在进行时,欢迎踊跃投稿啦 |
打赏帖 | |
---|---|
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 |