c代码如下: extern int read_flash(int); /* declare external asm function */ main() { int i=0,temp=0;
temp=read_flash(0); /* call function normally */ temp=read_flash(1); temp=read_flash(2);
}
汇编代码如下: .global _read_flash Rg_CAL_TEMP: .bss CAL_TEMP,1 _read_flash: ;保护现场的语句 POPD *+ SAR AR0,*+ SAR AR1,* LAR AR0,#1 LAR AR0,*0+,AR2 ;读取一个字节 LDP #Rg_CAL_TEMP SACL CAL_TEMP ;LACL * AND #0FFFFh LDP #TABLE;取得刚写入的数表的首地址 ;LAR AR3,#TABLE ;MAR *,AR3 ;ADD *,AR3 LACC #TABLE;取得表中第一个数的地址放到ACC的低16位 ADD CAL_TEMP AND #0FFFFh LDP #Rg_CAL_TEMP TBLR CAL_TEMP ;CAL_TEMP取得表头第一个值80h LACL CAL_TEMP ;与C语言兼容的程序代码部分 MAR *,AR1 SBRK #2 LAR AR0,*- PSHD * RET TABLE: .word 128,131,138,145,152,159,167,176,185,194,204,214,224,236,247,260 我就是想做个由C传递给汇编要在数表TABLE中查询的数值的位置,再由汇编把这个数值反送回来,我知道是ACC中实现的参数传输,可是一执行到ADD CAL_TEMP这句,ACC中的数值就乱变,有时是AR0中的数值,有时是IMR中的数值,这是为什么啊?高手救我,我都搞了两天了,因为以前一直用C,现在发现C不能直接访问2407的FLASH单元才这么混合编程的,我汇编实在是菜鸟一个,请各位大侠帮忙。 |