完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
c代码是这样的:(test.c)
extern int u32_sqrt2(int, int*);int main()[ int ival[16] = [1073741824,536870912,268435456,134217728,67108864,33554432,16777216,8388608,4194304,2097152,1048576,524288,262144,131072,65536,32768]; int m = u32_sqrt2(49, ival); printf("m:%d---------------",m); return (m);] 汇编代码是这样的:(lab.asm) .global u32_sqrt2u32_sqrt2: SUBAW.D2 B15,0x6,B15 MV.L1X B4,A3 || STW.D2T1 A4,*B15[1] STW.D2T1 A3,*B15[2] ;36 int r = 0; MVK.L1 0,A3 STW.D2T1 A3,*B15[3] ;39 for(i=0;i<16; i++) MV.L2X A3,B4 STW.D2T2 B4,*B15[4] MVK.S2 16,B5 CMPLT.L2 B4,B5,B0 [!B0] BNOP.S1 L4,5 ;41 int x = ival;L1: MV.L2 B4,B5 || LDW.D2T2 *B15[2],B4 LDW.D2T2 *B4[B5],B4 NOP 4 STW.D2T2 B4,*B15[5] ;43 if(x + r <= val) LDW.D2T2 *B15[3],B5 LDW.D2T2 *B15[1],B6 NOP 3 ADD.L2 B5,B4,B4 CMPGT.L2 B4,B6,B0 [ B0] BNOP.S1 L2,5 ;45 val -= x + r; LDW.D2T2 *+B15[5],B6 LDW.D2T2 *+B15[1],B31 NOP 3 ADD.L2 B5,B6,B4 SUB.L2 B31,B4,B4 STW.D2T2 B4,*B15[1] ;46 r = (r >> 1) | x; LDW.D2T2 *B15[3],B4 MV.L2 B6,B5 NOP 3 SHR.S2 B4,0x1,B4 OR.L2 B5,B4,B4 STW.D2T2 B4,*B15[3] ;47 ] BNOP.S1 L3,5 ;50 r = r >> 1;L2: MV.L2 B5,B4 SHR.S2 B4,0x1,B4 STW.D2T2 B4,*B15[3] ;39 for(i=0;i<16; i++)L3: LDW.D2T2 *B15[4],B4 ADD.L2 B4,1,B4 STW.D2T2 B4,*B15[4] MVK.S2 16,B5 CMPLT.L2 B4,B5,B0 [ B0] BNOP.S1 L1,5 ;53 return r;L4: LDW.D2T1 *+B15[3],A4 ;55 ] ADDK.S2 24,B15 BNOP.S2 B3,5 汇编对应的c语言是这样的:int u32_sqrt(int val, int* ival)[ int r = 0; int i; for(i=0;i<16; i++) [ int x = ival; if(x + r <= val) [ val -= x + r; r = (r >> 1) | x; ] else [ r = r >> 1; ] ] return r;] 编译正常,运行时发现调用u32_sqrt2一直不会返回。 请问这段汇编代码有问题吗? |
|
相关推荐
5 个讨论
|
|
lifei639156 发表于 2018-8-1 06:54 我发现汇编代码在下面这一句出错了: ;39 for(i=0;i<16; i++)L3: LDW.D2T2 *B15[4],B4 ADD.L2 B4,1,B4 STW.D2T2 B4,*B15[4] 这里每次从*B15[4]取出的i都是0,加1后变为1,再存放到,*B15[4], 下次再调到这儿时,LDW.D2T2 *B15[4],B4得到的数据是0。 代码中修改*B15[4]的只有这个地方,请问哪儿有问题? 多谢了! |
|
|
|
|
|
zhuo85 发表于 2018-8-1 07:27 #1. 为什么C代码产生的汇编不做修改编译不过? #2. 上面*B15操作没有考虑指令的延时,LDW的delay slot 为 4, 即4个nop后取值才到达目标寄存器。所以上面的代码第一次的ADD B4,1, B4的B4的值不是上面LDW来的。 指令说明参考sprufe8b。写汇编一定要了解每条指令的delay slot,不然错了都不知道怎么回事。 其实不建议写汇编了。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2018-8-1 07:42 因为编译器产生的汇编代码中包含了 .fphead p, l, W, BU, nobr, nosat, 1011111b 这样的语句, 这些被我删除了, 删除的地方有些需要添加NOP |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
457 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
935 浏览 1 评论
540 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
419 浏览 1 评论
971 浏览 0 评论
67浏览 3评论
CC3100BOOST使用CC3200lunchXL进行烧录
914浏览 2评论
TAS5411-Q1喇叭有爆破音,电压就会被拉低,有什么好办法解决吗?
263浏览 2评论
156浏览 2评论
203浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-3 11:19 , Processed in 0.768989 second(s), Total 51, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号