您的位置:控制工程论坛网论坛 » 电机与运动控制 » 转贴:求教 汇编代码的运行问题

cecmaster

cecmaster   |   当前状态:离线

总积分:198  2024年可用积分:0

注册时间: 2003-05-12

最后登录时间: 2007-01-25

空间 发短消息加为好友

转贴:求教 汇编代码的运行问题

cecmaster  发表于 2004/12/20 17:12:27      4487 查看 2 回复  [上一主题]  [下一主题]

手机阅读

发信人: 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 回复
总共 , 当前 /