历史上的今天
今天是: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
史海拾趣
|
MFC 创建了两个对话框,在主对话框A上点击一个按钮后,show另外一个对话框B,对话框B弹出后,我点击对话框B上的自带OK按钮,对话框B不能关闭,点击菜单关闭按钮也不可以,只能点击主对话框关闭按钮才能把两个对话框一起关闭,请问一下为什么呀,刚 ...… 查看全部问答> |
|
ARM7 44B0,裸机调试。 调试中发现,代码在IRQ中断服务程序中有对CPSR的IRQ中断禁止位的操作,置位或清零。我把这些操作屏蔽之后,之前遇见的代码不稳定容易跑飞、子函数调用结束后无法正常回到调用它的函数中等等异常消失了。 大家帮我分析下: ...… 查看全部问答> |
|
建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问, 有高手帮忙讲解下,谢谢了 1.程序入口在哪里?从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行? 还是在&nb ...… 查看全部问答> |
|
问题描述: 在“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; } 但这里亮 ...… 查看全部问答> |




