发信人: akii (akii), 信区: Embedded
标 题: [合集] 转贴:求教 汇编代码的运行问题
发信站: BBS 水木清华站 (Thu Dec 2 17:28:08 2004), 站内
☆─────────────────────────────────────☆
Annie0716 (shagua) 于 (Tue Aug 10 12:09:01 2004) 提到:
注明:我的MCU是MCF5249(MOTOROLA的m68k系列),用gcc编译,在uCLinux环境下运行
发信人: Annie0716 (shagua), 信区: Assembler
标 题: 求教:汇编代码的运行问题
发信站: BBS 水木清华站 (Tue Aug 10 11:39:11 2004), 站内
请教各位高人:
我现在在写一段内联汇编的代码,因为是在编译、运行环境不具备单步跟踪和随时查看
寄存器的能力,所以只能逐段添加,使用屏幕打印观察运行结果的方式调试。
现在有段程序,完成乘、累加功能。当我做两次操作(从两个内存地址处取数,并乘加
),可以运行,但是继续添加相同的指令,就会死机或者系统进程异常退出,
请问:这种现象通常会是什么原因呢?可能会是因为溢出导致吗?因为我没有做溢出判
断、处理。
麻烦大侠帮我看看,我弄了好久,都解决不了。谢谢了!
/*可运行的代码*/
__asm__("
move.l #0x00000080, %%MACSR;
move.w #0x00, %%CCR;
move.l %1, %%a0; /*wi
n_co
s_l*/
move.l %2, %%a1; /*ou
t*/
/*add.l #2448, %%a0;
add.l #68, %%a1;*/
move.l #18, %%d0; /*co
unte
r*/
LOOP_ONE:
move.l #0,%%acc;
move.l %3,%%a2; /*in*/
move.l (%%a0)+,%%a3; /*1st cycle*
/
move.l (%%a2)+,%%d3;
mac.l %%d3, %%a3;
move.l (%%a0)+,%%a4;
move.l (%%a2)+,%%d4;
mac.l %%d4, %%a4;
/*move.l (%%a0)+,%%a5;
move.l (%%a2)+,%%d5;
mac.l %%d5, %%a5;
move.l (%%a0)+,%%a6;
move.l (%%a2)+,%%d6;
mac.l %%d6, %%a6;*/
move.l %%acc, %%d1;
move.l %%d1, (%%a1);
subi.l #1, %%d0;
bne LOOP_ONE;
"
:"=m" ((out))
:"r" (win_cos_l),"r"(out),"r"(in));
/*系统异常退出的代码*/
__asm__("
move.l #0x00000080, %%MACSR;
move.w #0x00, %%CCR;
move.l %1, %%a0; /*wi
n_co
s_l*/
move.l %2, %%a1; /*ou
t*/
/*add.l #2448, %%a0;
add.l #68, %%a1;*/
move.l #18, %%d0; /*co
unte
r*/
LOOP_ONE:
move.l #0,%%acc;
move.l %3,%%a2; /*in*/
move.l (%%a0)+,%%a3; /*1st cycle*
/
move.l (%%a2)+,%%d3;
mac.l %%d3, %%a3;
move.l (%%a0)+,%%a4;
move.l (%%a2)+,%%d4;
mac.l %%d4, %%a4;
move.l (%%a0)+,%%a5;
move.l (%%a2)+,%%d5;
mac.l %%d5, %%a5;
move.l (%%a0)+,%%a6;
move.l (%%a2)+,%%d6;
mac.l %%d6, %%a6;
move.l %%acc, %%d1;
move.l %%d1, (%%a1);
subi.l #1, %%d0;
bne LOOP_ONE;
"
:"=m" ((out))
:"r" (win_cos_l),"r"(out),"r"(in));
☆─────────────────────────────────────☆
chaoslawful (wave~~|Wish u happy!) 于 (Tue Aug 10 13:46:16 2004) 提到:
我觉得你的代码有以下几个问题:
1、代码中并没有用到asm语句output部分,输出是由move.l %%d1,(%%a1)这一指令复制到
out指向的存储区的,所以asm语句的output部分可以去掉,相应地win_cos_l对应%0、out对应%1、in对应%2。
2、程序段中标号直接使用LOOP_ONE这样的显式标号,当复制粘贴多次代码段时就会产生标号冲突,改为1、2这种局部标号更为妥当。
3、代码段中用到了output和input部分声明以外的寄存器,而asm语句又没有clobbered list,可能会因寄存器随意分配产生问题。
mac肯定不会因为溢出产生异常,可能是给出的win_cos_l、out、in这类指针的值有问题导致访问违例,也可能是没有clobbered list引起的问题。在M5249+uCLinux上可以用gdb远程调试程序,跟踪一下就很容易找到问题了。
修改后的代码段:
__asm__("
move.l #0x00000080,%%MACSR;
move.w #0x00,%%CCR;
move.l %0,%%a0; /* win_cos_l */
move.l %1,%%a1; /* out */
move.l #18,%%d0; /* loop counter */
1:
move.l #0,%%acc;
move.l %2,%%a2; /* in */
move.l (%%a0)+,%%a3;/* win_cos_l[i] */
move.l (%%a2)+,%%d3;/* in[i] */
mac.l %%d3,%%a3; /* acc+=win_cos_l[i]*in[i] */
move.l (%%a0)+,%%a4;/* win_cos_l[i+1] */
move.l (%%a2)+,%%d4;/* in[i+1] */
mac.l %%d4,%%a4; /* acc+=win_cos_l[i+1]*in[i+1] */
move.l %%acc,%%d1;
move.l %%d1,(%%a1);
subi.l #1,%%d0;
bne 1b;
"
:
:"r"(win_cos_l),"r"(out),"r"(in)
:"%a0","%a1","%a2","%a3","%a4","%d0","%d1","%d3","%d4");
【 在 Annie0716 (shagua) 的大作中提到: 】
: 注明:我的MCU是MCF5249(MOTOROLA的m68k系列),用gcc编译,在uCLinux环境下运行
: 发信人: Annie0716 (shagua), 信区: Assembler
: 标 题: 求教:汇编代码的运行问题
: ...................
☆─────────────────────────────────────☆
Annie0716 (shagua) 于 (Tue Aug 10 13:58:59 2004) 提到:
谢谢!
我再试试。
【 在 chaoslawful (wave~~|Wish u happy!) 的大作中提到: 】
: 我觉得你的代码有以下几个问题:
: 1、代码中并没有用到asm语句output部分,输出是由move.l %%d1,(%%a1)这一指令复制到
: out指向的存储区的,所以asm语句的output部分可以去掉,相应地win_cos_l对应%0、out对应%1、in对应%2。
: ...................
☆─────────────────────────────────────☆
Annie0716 (shagua) 于 (Tue Aug 10 17:21:00 2004) 提到:
不好意思,我还想请教两个问题:
我按照你提示的方式改了原来的程序,还是在多次运算是出现问题,是死机现象。
我想使用gdb远程调试,但是我根据在网上搜到的方法,用COM1链接出现了问题(我没有
接网线),问题如下:
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Couldn't establish connection to remote target
Malformed response to offset query, qOffsets
请问,这是什么原因呢?还是我用的不对?
另外,您上次提到的可能是传入指针有问题,您能具体说说比如可能是什么问题吗?
我的这段程序本来是用C模拟过的,使用的是同样的指针,运行正确,现在因为速度考虑
想改写为汇编。
谢谢了!
【 在 chaoslawful (wave~~|Wish u happy!) 的大作中提到: 】
: 我觉得你的代码有以下几个问题:
: 1、代码中并没有用到asm语句output部分,输出是由move.l %%d1,(%%a1)这一指令复制到
: out指向的存储区的,所以asm语句的output部分可以去掉,相应地win_cos_l对应%0、out对应%1、in对应%2。
: ...................
☆─────────────────────────────────────☆
chaoslawful (wave~~|Wish u happy!) 于 (Tue Aug 10 17:47:43 2004) 提到:
我一般远程调试是在板子上运行gdbserver,主机运行m68k-elf-gdb通过以太网连接到板子上的。
gdbserver在uCLinux的应用程序选项里有。比如你要调试的flat格式文件叫test,对应的elf格式文件叫test.elf,那么在板子上运行gdbserver :4444 test读入flat格式的文件(4444端口可以随便改成别的),在主机端进行如下操作:
bash$ m68k-elf-gdb test.elf
...
(gdb) target remote 192.168.0.2:4444 <--192.168.0.2是你板子的ip
然后就可以进行远程调试了。当然前提是板子和主机互相能ping通。
【 在 Annie0716 (shagua) 的大作中提到: 】
: 不好意思,我还想请教两个问题:
: 我按照你提示的方式改了原来的程序,还是在多次运算是出现问题,是死机现象。
: 我想使用gdb远程调试,但是我根据在网上搜到的方法,用COM1链接出现了问题(我没有
: ...................
☆─────────────────────────────────────☆
Annie0716 (shagua) 于 (Tue Aug 10 18:31:28 2004) 提到:
我再试一下,谢谢你!
不过我不知道是不是可以,因为我的开发板上网络那片IC工作不稳定,通常都会一上电
可以ping通,但是之后IC就会比较热,很难通了。
因此,通常我是使用CF卡,把程序拷到CF卡上,将其mount到开发板上运行的。
所以我才想用串口,没有使用网口的。
我再试试!再次谢谢你!
【 在 chaoslawful (wave~~|Wish u happy!) 的大作中提到: 】
: 我一般远程调试是在板子上运行gdbserver,主机运行m68k-elf-gdb通过以太网连接到板子上的。
: gdbserver在uCLinux的应用程序选项里有。比如你要调试的flat格式文件叫test,对应的elf格式文件叫test.elf,那么在板子上运行gdbserver :4444 test读入flat格式的文件(4444端口可以随便改成别的),在主机端进行如下操作:
: bash$ m68k-elf-gdb test.elf
: ...................
1楼
0
0
回复