TI官网文档:

http://www.ti.com/product/tms320c6745/technicaldocuments

里面资料非常详细,可以对着里面一个个看,用的比较多的两个文档:

TMS320C674x指令格式:TMS320C674x DSP CPU and Instruction Set User's Guide .pdf

芯片相关的接口地址可以到这里找:  TMS320C6745, TMS320C6747 Fixed- and Floating-Point Digital Signal Processor (Rev. F)

下面是转载C6000的反汇编实例,C674x与之大致类似。原创应该来自于http://blog.chinaunix.net/uid-2282111-id-2113264.html:

1、C6000汇编实例详解1

void tsk_test5(void)
{
unsigned int i,j;
unsigned char a,b;
unsigned long l;
i=0xAA55;
j=0x55AA;
a=0x88;
b=0x99;
l=0x11223344;
while(){
iprintf(\"haha5\\n\");
TSK_time();
iprintf(\"test5 time = %d,count = %d\",TSK_time(),count++);
funtionarg(i,b,l);
} void tsk_test5(void)
{
8000AEB0 STW.D2T2 B3,*SP--[] //SP=SP-4*10;*(SP)=B3;SP向下增长,
8000AEB4 NOP
i=0xAA55;
8000AEB8 MVK.S1 0xffffaa55,A3 //A3=0xffffaa55
8000AEBC .fphead p, l, W, BU, nobr, nosat, //不知道,好像是个系统调用
8000AEC0 MVKH.S1 0x0000,A3 //把0x0000赋值给A3的高16,A3=0x0000AA55
8000AEC4 STW.D2T1 A3,*B15[] //i是局部变量,压入栈中,*(B15+4*5)=A3(B15==SP).
8000AEC6 NOP
j=0x55AA;
8000AEC8 MVK.S2 0x55aa,B4 //B5=0x55aa
8000AECC STW.D2T2 B4,*B15[] //*(B15+4*6)=B4(B15==SP).
8000AECE NOP
a=0x88;
8000AED0 MVK.S1 0x0088,A3
8000AED4 STB.D2T1 A3,*+SP[] //*(SP+28)=A3
8000AED8 NOP
b=0x99;
8000AEDA MVK.S2 ,B4
8000AEDC .fphead n, l, W, BU, nobr, nosat,
8000AEE0 STB.D2T2 B4,*+SP[] //*(SP+29)=B4
8000AEE4 NOP
l=0x11223344;
8000AEE8 MVK.S2 0x3344,B4
8000AEEC MVKH.S2 0x11220000,B4
8000AEF0 || MVK.L2 ,B5
8000AEF4 STDW.D2T2 B5:B4,*+SP[] //长整型,8字节,*(SP+4×4)=B5:B4
8000AEF8 NOP
iprintf(\"haha5\\n\");
8000AEFC C$DW$L$_tsk_test5$$B, C$L4:
8000AEFC MVK.S2 0x187c,B4
8000AF00 MVKH.S2 0x80010000,B4
8000AF04 CALLP.S2 iprintf (PC- = 0x80008b04),B3
8000AF08 || STW.D2T2 B4,*+SP[] //这块要注意,指令前有“||”表示和上面一条指令同时执行,可变参数函数,参数压栈。
TSK_time();
8000AF0C C$RL2:
8000AF0C LDW.D2T2 *+B14[],B4 //B14: 存放全局变量的基地址,也就是BSS段的基地址。*+B14[162]这个应该是TSK_time()的地址。
8000AF10 NOP
iprintf(\"test5 time = %d,count = %d\",TSK_time(),count++);
8000AF14 LDHU.D2T2 *+B14[],B4 //B4=*(B14+4×437)将全局变量count的值放入B4中
8000AF18 LDW.D2T2 *+B14[],B5 //将TSK_time()的返回值放入B5中
8000AF1C MVK.S1 0x1883,A3
8000AF20 MVKH.S1 0x80010000,A3
8000AF24 STW.D2T1 A3,*B15[] //第一个参数(也就是字符串地址)压栈。
8000AF26 STW.D2T2 B4,*B15[] //第三个压栈
8000AF28 ADD.L2 B4,,B4 //count++
8000AF2A STW.D2T2 B5,*B15[] //第二个压栈。
8000AF2C CALLP.S2 0x80008AE4 (PC- = 0x80008ae4),B3
8000AF30 || STH.D2T2 B4,*+B14[] //count=B4;
funtionarg(i,b,l);
8000AF34 C$RL3:
8000AF34 LDW.D2T1 *+SP[],A4 //A4=*(SP+4*5)=i;第一个参数用A4传递
8000AF38 LDBU.D2T2 *+SP[],B4 //B4=*(SP+4*29)=b;第二个参数用B4传递
8000AF3C .fphead n, l, W, BU, nobr, nosat,
8000AF40 LDDW.D2T1 *+SP[],A7:A6 //第三个参数用A7:A6传递。long型数据。
8000AF44 || CALLP.S2 funtionarg (PC- = 0x8000ae34),B3
8000AF46 C$RL4:
8000AF46 BNOP.S1 C$L4 (PC- = 0x8000aefc), //while循环
}

2、C6000汇编实例详解2

//固定参数一般函数 反汇编
unsigned int funtionarg(unsigned int m,unsigned char k,unsigned long l)
{
unsigned int i,j;
unsigned char a,b;
unsigned long ll=;
j=0x55aa;
i=m+j;
a=0x88;
b=a+0x11+k;
ll=l+;
my_delay();
return i;
} unsigned int funtionarg(unsigned int m,unsigned char k,unsigned long l)
{
8000AE34 C$DW$L$_tsk_main$$E, funtionarg:
8000AE34 STW.D2T2 B3,*SP--[] //压栈函数返回地址并分配48个字节
8000AE38 NOP
8000AE3C .fphead n, l, W, BU, br, nosat,
8000AE40 STDW.D2T1 A7:A6,*+SP[] //压栈第三而参数
8000AE44 STB.D2T2 B4,*+SP[] //压栈第二个参数
8000AE48 STW.D2T1 A4,*B15[] //压栈第一个参数
8000AE4A NOP
unsigned int i,j;
unsigned char a,b;
unsigned long ll=;
8000AE4C ZERO.L1 A5:A4 //A5:A4 = 0
8000AE50 STDW.D2T1 A5:A4,*+SP[] //ll=*(SP+4*5)=A5:A4
8000AE54 NOP
j=0x55aa;
8000AE58 MVK.S2 0x55aa,B4 //B4=0x55aa
8000AE5C .fphead n, l, W, BU, nobr, nosat,
8000AE60 STW.D2T2 B4,*B15[] //j=*(SP+4*7)=B4=0x55AA
8000AE62 NOP
i=m+j;
8000AE64 LDW.D2T2 *B15[],B5 //B5=*(SP+4*7)=j
8000AE66 LDW.D2T2 *B15[],B4 //B4=*(SP+4)=m
8000AE68 NOP
8000AE6A ADD.L2 B5,B4,B4 //B4=B4+B5
8000AE6C STW.D2T2 B4,*B15[] //i=*(SP+4*6)=B4
8000AE6E NOP
a=0x88;
8000AE70 MVK.S2 0x0088,B4
8000AE74 STB.D2T2 B4,*+B15[]
8000AE78 NOP
8000AE7C .fphead n, l, W, BU, nobr, nosat,
b=a+0x11+k;
8000AE80 LDBU.D2T2 *+B15[],B4
8000AE84 LDBU.D2T2 *+SP[],B5
8000AE88 NOP
8000AE8A ADD.L2 B5,B4,B4
8000AE8C ADDK.S2 ,B4
8000AE90 STB.D2T2 B4,*+B15[]
8000AE94 NOP
ll=l+;
8000AE98 LDDW.D2T2 *+SP[],B5:B4
8000AE9C .fphead n, l, W, BU, nobr, nosat,
8000AEA0 MVK.L2 ,B6
8000AEA2 NOP
8000AEA4 ADDU.L2 B6,B5:B4,B5:B4
8000AEA8 STDW.D2T2 B5:B4,*+SP[]
8000AEAC NOP
my_delay();
8000AEAE CALLP.S2 my_delay (PC- = 0x8000adc4),B3
8000AEB0 || MVK.S1 ,A4 //参数为100,用A4传参
return i;
8000AEB2 C$RL2:
8000AEB2 LDW.D2T1 *B15[],A4 //A4=*(SP+4*6)=i;A4是返回值
8000AEB4 LDW.D2T2 *++SP[],B3 //B3 程序返回地址
8000AEB8 BNOP.S2 B3,
8000AEBC .fphead p, l, W, BU, br, nosat,
}

3、C6000汇编实例详解3

//可变参数函数反汇编
int iprintf(const char *pbFmt,...)
{
va_list pArg;
char abString[]; va_start(pArg,pbFmt);
vsprintf(abString,pbFmt,pArg);
UARTSendData(abString);
va_end(pArg); return ;
} int iprintf(const char *pbFmt,...)
{
80008B04 OR.L1X ,SP,A15 //A15=SP
80008B08 || STW.D2T1 A15,*B15--[] //SP=SP-4*2,开辟空间8字节
80008B0A NOP
80008B0C ADDK.S2 -,SP //SP=SP-264,开辟空间264字节
80008B10 STW.D2T2 B3,*+B15[] //函数返回地址压栈。
80008B14 NOP
va_list pArg;
char abString[]; va_start(pArg,pbFmt);
80008B18 ADD.L1 ,A15,A3 //通过A15(原来的SP值)取得第一个参数的值。
80008B1C .fphead n, l, W, BU, nobr, nosat,
80008B20 STW.D2T1 A3,*B15[] //通过A15(原来的SP值)取得第一个参数的值。
80008B22 NOP
vsprintf(abString,pbFmt,pArg);
80008B24 CALLP.S2 vsprintf (PC+ = 0x8000cae0),B3
80008B28 || LDW.D1T2 *+A15[],B4
80008B2C || ADD.L1X ,SP,A4 //同过B4 A4和A6传递参数
80008B30 || MV.S1 A3,A6 //以上4条语句同时执行
UARTSendData(abString);
80008B32 C$RL0:
80008B32 CALLP.S2 UARTSendData (PC+ = 0x80008b50),B3
80008B34 || ADD.L1X ,SP,A4 //通过A4传递参数
va_end(pArg); return ;
80008B38 C$RL1:
80008B38 MVK.L1 ,A4
80008B3C .fphead n, l, W, BU, br, nosat,
80008B40 LDW.D2T2 *+B15[],B3 //取得返回地址
80008B44 OR.L2X ,A15,SP
80008B48 || LDW.D1T1 *+A15[],A15
80008B4C BNOP.S2 B3, //通过B3返回
}

TI(德州仪器) TMS320C674x逆向分析之二的更多相关文章

  1. TI(德州仪器) TMS320C674x逆向分析之一

    一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...

  2. 摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释

    现在安卓大行其道,不是高通,就是MTK,甚至于很多人不知道还有德州仪器这个平台了,关于如何在德州仪器Omap37xx平台上调试SE4500,网络上除了针对SE4500的几个pdf文档介绍之外,没有任何 ...

  3. 【DSP开发】德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012

    芯片是产业链上游重要的一个环节,一颗小小的芯片具有极高的技术含量和价值,半导体行业每年都会有一个各大厂商营业额的排名,除去2009年,常年盘踞在前三名位置的分别是英特尔,三星半导体和德州仪器,英特尔凭 ...

  4. 主流芯片解决方案Ambarella的高清网络摄像机、德州仪器和控制海思

    (本文由四川艾普作为数码科技有限公司 苏斌.范清华 收集) 高清网络视频监控发展到今天.正的高清时代.诸多有实力的高清摄像机厂家的产品线也逐渐完好起来,高清网络视频监控的配套产品有更加丰富和成熟.与此 ...

  5. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  6. 【转载】如何在德州仪器网站查找和下载PCB封装

    德州仪器的网站做得相当不错,查找IC资料和下载IC封装样样给力.那么如何在TI网站上能够快速查找到自已需要的PCB封装呢?下面我来告诉你. 1.       在浏览器中输入网址http://weben ...

  7. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  8. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  9. 逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本

    没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧.首先介绍一下背景吧.这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机 ...

随机推荐

  1. spring-如何将spring源码成功导入Eclipse中

    一.从 github上下载Spring源码到本机 二.利用 Gradle 编译 Spring 源码 环境: - Spring源码版本:spring-framework-4.3.x - Gradle版本 ...

  2. ASP.NET状态管理的总结

    阅读目录 开始 hidden-input QueryString Cookie ApplicationState ViewState,ControlState Session Profile 各种状态 ...

  3. Apache Oltu 实现 OAuth2.0 服务端【授权码模式(Authorization Code)】

    要实现OAuth服务端,就得先理解客户端的调用流程,服务提供商实现可能也有些区别,实现OAuth服务端的方式很多,具体可能看 http://oauth.net/code/ 各语言的实现有(我使用了Ap ...

  4. Android开发艺术探索学习笔记(一)

    第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...

  5. 全网最详细的Sublime Text 3的安装Package Control插件管理包(图文详解)

    不多说,直接上干货! 全网最详细的Windows里下载与安装Sublime Text *(图文详解) 全网最详细的Sublime Text 3的激活(图文详解) 全网最详细的Sublime Text ...

  6. 【原】ATI显卡设置双显示器

    Ubuntu 12.04系统下加上增加一个显示器后,一直只能镜像显示,或只能用笔记本的屏幕显示,另一个屏幕无法使用了,上网搜索了一下解决办法,通过下面的方法可以解决问题: 编辑/etc/X11/xor ...

  7. redis源码学习-skiplist

    1.初步认识跳跃表 图中所示,跳跃表与普通链表的区别在于,每一个节点可以有多个后置节点,图中是一个4层的跳跃表 第0层: head->3->6->7->9->12-> ...

  8. 配置codis-proxy

    在整个的处理过程之中,虽然利用codis可以帮助我们动态实现主从的配置,但是从实际来讲用户不可能直接去操作redis客户端,必须通过codis-proxy来代理,所以需要针对于codis-proxy进 ...

  9. Swift基础

    github上找了swift中文翻译,上传到百度云,给大家分享下 链接:http://pan.baidu.com/s/1hqGOxfe 密码:asto

  10. linux系统编程:open常用参数详解

    open用于打开一个文件,通过设置不同的flag,可以让进程只读,只写,可读/可写等操作 一.对一个不存在或者存在的文件(test.txt),进行写入操作 /*==================== ...