作者sunneo (艾斯寇德)
站内Programming
标题Re: 请问macro如何被C 呼叫?
时间Sun May 4 19:38:33 2008
※ 引述《[email protected] ()》之铭言:
: ※ 引述《[email protected] (甘愿为你~)》之铭言:
: > 作者: ast9869 (甘愿为你~) 看板: ASM
: > 标题: 请问macro如何被C 呼叫?
: > 时间: Sat May 3 17:35:14 2008
: > ===================================================================
: > //C51 的 code
: > //ice_func.c
: > #pragma asm
: > getXRAM MACRO _Address, _Shift, _Data
: > mov DPTR, #_Address
: > movx _Data ,@DPTR+_Shift
: > ENDM
: > #pragma endasm
: > ===================================================================
: > //ice_func.h
: > BYTE d1, d2;
: > extern getXRAM(_Address, _Shift, _Data);
: 小弟虽没写过asm 不过在这里的extern 必须是要一个function
: 而不能是个macro
: 如果你想要用的话 我想你应该可以在ice_func.c中
: 把那个macro 包成function 才能用
: > #define Download64(pBuf) \
: > { \
: > getXRAM(pBuf, 0, d1);\
: > getXRAM(pBuf, 1, d2);\
: > DownTwoByte(0x02, d1, d2); \
: > }
: > ===================================================================
: > 小弟不才…
: > 这样好像不能用耶?请问各位先进要如何设定才能调用getXRAM呢?
那麽你把整个asm用巨集包装吧
但不要用pragma asm
看有没有 __asm
或者 asm{ } 之类的
像是WinNT.h里面就可以看到
#define YieldProcessor() __asm { rep nop }
所以你的可能就会长这样
#define getXRAM( _Address, _Shift, _Data) \
asm \
{ \
mov DPTR,
#_Address \
movx _Data ,@DPTR+_Shift \
}
如果是gas的话,位址跟暂存器应该要以参数来传入
不过gas我不熟@@..而且也不晓得#的意思..
只知道#在巨集是 tostring的意思.
所以这边将参数转换成字串塞入asm之间
#defin getXRAM (_Address, _Shift, _Data) \
__asm__ volatile \
( \
"mov "
#_Address "," #DPTR \
"movx" "@DPTR+" #_Shift "," #_Data" \
: \
: \
: \
)
下面展示巨集跟asm的组合
#define asm3(ins,left,right) __asm__ (#ins " " #right "," #left)
int a()
{
asm3(mov,%eax,$1);
}
这代表a会回传1
所以你的程式如果出现在上面定义的asm3且是DevC (gas)
就会是
#define getXRAM (_Address, _Shift, _Data)\
asm3(mov,%DPTR,$_Address); \
asm3(movx,_Data,_Shift(DPTR));
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.142.229.107
※ 编辑: sunneo 来自: 220.142.229.107 (05/04 19:55)
1F:推 ast9869:谢谢这位大大的帮忙~在C51中不能这样搞- -123.110.225.167 05/04 22:09