历史上的今天
返回首页

历史上的今天

今天是:2025年02月17日(星期一)

正在发生

2020年02月17日 | arm的bin二进制代码分析

2020-02-17 来源:eefocus

在bin文件中,就是一条条的机器指令,每条指令4个字节。


在ADS中打开一个.s文件,选择project->disassemble

可以看到汇编的机器码

汇编代码如下(ADS中的一个例程/ARM/ADSv1_2/Examples/asm/armex.s):

        AREA ARMex, CODE, READONLY  ; name this block of code

        ENTRY                       ; mark first instruction

                                    ; to execute

start

        MOV     r0, #10             ; Set up parameters

        MOV     r1, #3

        ADD     r0, r0, r1          ; r0 = r0 + r1

 

stop

        MOV     r0, #0x18           ; angel_SWIreason_ReportException

        LDR     r1, =0x20026        ; ADP_Stopped_ApplicationExit

        SWI     0x123456            ; ARM semihosting SWI

 

        END                         ; Mark end of file

 

执行project->disassemble后:

** Section #1 'ARMex' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

    Size   : 28 bytes (alignment 4)

 

    start

    $a

    ARMex

        0x00000000:    e3a0000a    ....    MOV      r0,#0xa

        0x00000004:    e3a01003    ....    MOV      r1,#3

        0x00000008:    e0800001    ....    ADD      r0,r0,r1

    stop

        0x0000000c:    e3a00018    ....    MOV      r0,#0x18

        0x00000010:    e59f1000    ....    LDR      r1,0x18

        0x00000014:    ef123456    V4..    SWI      0x123456

    $d

        0x00000018:    00020026    &...    DCD    131110

使用UltraEdit看bin文件如下:


 

可以看到,与上面的一样。

其中MOV的机器码如下(ARM体系结构pdf:p156):

 

cond,AL(Always)为0b1110

最后有一个131110不知道是什么意思。

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

另一个汇编代码如下(ADS中的一个例程/ARM/ADSv1_2/Examples/asm/ subrout.s):

        AREA subrout, CODE, READONLY    ; name this block of code

        ENTRY                           ; mark first instruction

                                        ; to execute

start

        MOV     r0, #10                 ; Set up parameters

        MOV     r1, #3

        BL      doadd                   ; Call subroutine

 

stop   

        MOV     r0, #0x18               ; angel_SWIreason_ReportException

        LDR     r1, =0x20026            ; ADP_Stopped_ApplicationExit

        SWI     0x123456                ; ARM semihosting SWI

 

doadd  

        ADD     r0, r0, r1              ; Subroutine code

        MOV     pc, lr                  ; Return from subroutine.

 

        END                             ; Mark end of file

 

执行project->disassemble后:

** Section #1 'subrout' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT]

    Size   : 36 bytes (alignment 4)

 

    start

    $a

    subrout

        0x00000000:    e3a0000a    ....    MOV      r0,#0xa

        0x00000004:    e3a01003    ....    MOV      r1,#3

        0x00000008:    ebfffffe    ....    BL       doadd  ; 0x18

    stop

        0x0000000c:    e3a00018    ....    MOV      r0,#0x18

        0x00000010:    e59f1008    ....    LDR      r1,0x20

        0x00000014:    ef123456    V4..    SWI      0x123456

    doadd

        0x00000018:    e0800001    ....    ADD      r0,r0,r1

        0x0000001c:    e1a0f00e    ....    MOV      pc,r14

    $d

        0x00000020:    00020026    &...    DCD    131110

  

使用UltraEdit看bin文件如下:

 

 

不知道为什么,ADS里面的BL       doadd的机器码和bin中的机器码不一样。

 

BL的机器指令如下:

        0x00000008:    ebfffffe    ....    BL       doadd  ; 0x18

 

 

按bin中的机器码,EB000002,1110_1101_0000_0000____0000_0000_0000_0010

会在执行bl指令时的PC后面加上2*4byte,正好跳过3条指令。


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

下面这个将doadd写到另一个.s文件中。


subrout.s文件:

        AREA subrout, CODE, READONLY    ; name this block of code

        ENTRY                           ; mark first instruction

                                        ; to execute

        IMPORT doadd                                  ; import

start

        MOV     r0, #10                 ; Set up parameters

推荐阅读

史海拾趣

Cypress(赛普拉斯)公司的发展小趣事

近年来,随着汽车电子、物联网等应用领域的快速发展,Cypress也制定了新的发展战略。公司将以MCU+存储+USB为核心产品,为汽车电子、物联网等应用领域提供完整的嵌入式系统解决方案。为了实现这一目标,Cypress将继续加大研发投入,推动技术创新和产品升级。同时,公司还将加强与国际合作伙伴的合作,共同开拓新的市场和应用领域。

Calmos Systems Inc公司的发展小趣事

Calmos Systems Inc公司注重企业文化建设和团队建设。公司倡导创新、协作、务实的企业文化,鼓励员工敢于尝试、勇于创新。同时,公司还注重员工的培训和发展,为员工提供广阔的职业发展空间和晋升机会。在团队建设方面,公司定期组织各类团建活动,增强员工之间的凝聚力和向心力。这些举措使得公司拥有一支高效、团结、富有创造力的团队,为公司的发展提供了有力保障。

以上便是关于Calmos Systems Inc公司在电子行业里发展起来的5个相关故事。这些故事展示了公司在创立初期、技术创新、市场拓展、国际化战略以及企业文化与团队建设等方面的努力和成果,为公司的发展奠定了坚实的基础。

Gespac Inc公司的发展小趣事

随着国内市场的饱和,Calmos Systems Inc公司开始将目光投向国际市场。公司制定了详细的国际化战略,包括市场调研、产品定位、销售渠道建设等方面。公司派遣专业团队前往海外市场进行考察和交流,了解当地市场需求和文化特点。同时,公司还积极寻求与国际知名企业的合作机会,共同开拓国际市场。在国际化战略的推动下,公司的业务范围不断扩大,国际市场份额逐年提升。

DENWIRE公司的发展小趣事

Calmos Systems Inc公司创立之初,面临着资金短缺、市场竞争激烈的挑战。公司创始人凭借对电子技术的深厚理解和对市场需求的敏锐洞察,带领团队研发出了一款具有创新性的电子产品。然而,由于品牌知名度低,市场推广困难,产品销量一度不佳。为了打开市场,创始人亲自拜访潜在客户,了解他们的需求,不断优化产品功能。经过不懈的努力,产品逐渐赢得了客户的认可,为公司的发展奠定了基础。

Delta Electronics Manufacturing Corp公司的发展小趣事

Delta非常重视人才的培养和团队建设。公司建立了完善的培训体系,为员工提供多元化的培训和发展机会。同时,Delta还注重团队协作和沟通,鼓励员工分享经验和知识,共同解决问题。这种良好的团队氛围和文化,不仅增强了员工的凝聚力和归属感,也为公司的发展提供了有力的保障。

Gazelle Microcircuits Inc公司的发展小趣事
负电压的生成需要额外的电路和功耗,取消这些电压输出可以降低主板的整体功耗和发热量,提高能效。

问答坊 | AI 解惑

两个对话框,显示后按OK或者菜单上关闭按钮均不管用

MFC 创建了两个对话框,在主对话框A上点击一个按钮后,show另外一个对话框B,对话框B弹出后,我点击对话框B上的自带OK按钮,对话框B不能关闭,点击菜单关闭按钮也不可以,只能点击主对话框关闭按钮才能把两个对话框一起关闭,请问一下为什么呀,刚 ...…

查看全部问答>

求助:帮我分析下,IRQ模式下对cpsr寄存器的操作

ARM7 44B0,裸机调试。 调试中发现,代码在IRQ中断服务程序中有对CPSR的IRQ中断禁止位的操作,置位或清零。我把这些操作屏蔽之后,之前遇见的代码不稳定容易跑飞、子函数调用结束后无法正常回到调用它的函数中等等异常消失了。 大家帮我分析下: ...…

查看全部问答>

关于VXWORKS任务

建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问, 有高手帮忙讲解下,谢谢了 1.程序入口在哪里?从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行? 还是在&nb ...…

查看全部问答>

socket数据接收处理问题C#

问题描述: 在“private void btnDiagnosticClicked(object sender, EventArgs e)”方法中 执行“RecData = MainMenu.socketHH.GetRecData();”“RecData”一直接收为空。 而在“private void ReceiveCallback(IAsyncResult ar)”方法中 “recB ...…

查看全部问答>

内核定制 activesync 经常不好用,无法连接PC机。

    在内核定制的过程中有这样的情况,只要对catalog部分稍作修改,哪怕是改完之后再还原到原来的选项,生成镜像后activesync都非常有可能不好用。 不知道问题出在哪,在这部分的内核定制过程中应该注意什么。感觉到很诧异,特向大侠们 ...…

查看全部问答>

驱动中如何提升注册表访问读写权限?

驱动中如何提升注册表访问读写权限? 谢谢…

查看全部问答>

arm linux驱动编写中,中断服务程序中可以进行ioremap吗?

发现只要在中断服务程序中执行到ioremap函数就会报错 nable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c355c000 [00000000] *pgd=338e5031, *pte=00000000, *ppte=00000000 Internal error: Oops: 817 [#1 ...…

查看全部问答>

跑马灯的实验,不明白

#include sbit p_tmp=P1^7; void main() {   int k=3;   //sbit p_t=P1^3;  如果在这里定义,会报编译的错误,难道sbit不能在方法体中定义吗?   p_tmp=P1^k;   p_tmp=0; } 但这里亮 ...…

查看全部问答>

TLC116

  该TLC116系列可控硅采。采用优质玻璃钝化PNPN技术。 TLC116的绝对额定值为:(1)符号是IT(RMS),这个参数是有效值(360°导通状态电流传导角等于40℃)组合成的Tl型、价值3,单位是A;(2)符号是IT(RMS),这个参数是有效值(360°导通状态电流传 ...…

查看全部问答>

HDL 实践

经过我仔细测试,发现如下问题;   ALTERA 的Quartus 9.0 以及以下版本不支持SYSTEM C; 但Quartus 9.1 支持SYSTEM C 语法。学习HDL的几点重要提示: 1.了解HDL的可综合性问题:HDL有两种用途:系统仿真和硬件实现。 如果程序只用于仿真,那么 ...…

查看全部问答>