Re: 請問macro如何被C 呼叫?
※ 引述《swwu83.bbs@bbs.wretch.cc ()》之銘言:
: ※ 引述《ast9869.bbs@ptt.cc (甘願為妳~)》之銘言:
: > 作者: 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)
推
05/04 22:09, , 1F
05/04 22:09, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 5 篇):