Arm 臂拆卸-对“LDR r7,[pc,0x14]”感到困惑
我正在尝试学习手臂装配。我决定反汇编read函数,这就是我得到的结果。从外观上看,它似乎在使用R7寄存器作为系统调用号进行系统调用svc 0Arm 臂拆卸-对“LDR r7,[pc,0x14]”感到困惑,arm,Arm,我正在尝试学习手臂装配。我决定反汇编read函数,这就是我得到的结果。从外观上看,它似乎在使用R7寄存器作为系统调用号进行系统调用svc 0 mov ip, r7 # save R7 ldr r7, [pc, #0x14] # get system call number and put it into R7 ?? svc #0 # make system call mov r7, ip # restore R7 cm
mov ip, r7 # save R7
ldr r7, [pc, #0x14] # get system call number and put it into R7 ??
svc #0 # make system call
mov r7, ip # restore R7
cmn r0, #0x1000
bxls lr
rsb r0, r0, #0 # R0 = 0
b #2976848216
我有点困惑,为什么它加载系统调用号的方式是LDR r7[PC,0x14]。这不就是用C代码r7=*pc+0x14实现的吗?我研究了其他可能也使用系统调用的函数,例如kill、wait等,它们使用非常类似的约定,即LDR R7、[PC,0x14]
这是在Android上,如果它有帮助的话
谢谢
mov ip, r7 @# save R7
ldr r7, [pc, #0x14] @# get system call number and put it into R7 ??
svc #0 @# make system call
mov r7, ip @# restore R7
cmn r0, #0x1000 @
bxls lr @
rsb r0, r0, #0 @# R0 = 0
.word 0x1234
.word 0xABCD
你几乎遗漏了最重要的部分,所以不得不即兴创作
00000000 <.text>:
0: e1a0c007 mov ip, r7
4: e59f7014 ldr r7, [pc, #20] ; 20 <.text+0x20>
8: ef000000 svc 0x00000000
c: e1a0700c mov r7, ip
10: e3700a01 cmn r0, #4096 ; 0x1000
14: 912fff1e bxls lr
18: e2600000 rsb r0, r0, #0
1c: 00001234 andeq r1, r0, r4, lsr r2
20: 0000abcd andeq sl, r0, sp, asr #23
是的,它正在做你说它正在做的事情,它在进行系统调用之前在r7中加载了一些值,现在它的值是多少,它为什么使用pc相对负载,可能是一个常数,不能作为立即数,和/或链接时解析值而不是编译时,不同的系统调用是否有不同的值,r7是否为参数?你没有提供足够的信息来谈论这个。一旦你得到/看到了这些信息,那么这些答案应该是非常明显的…如果其中任何一个是你的问题。不是学习arm组装的最佳方法…尝试一些简单的方法,比如uint-fun-uint-a,uint-b{返回a+b;}编译,分解并从那里开始。您希望它以什么其他方式加载系统呼叫号码?解释加载常量的方法。感谢老计时器,当我反汇编代码时,我在rsb之后看到了一些其他指令,但认为没有意义,所以我将其忽略。我想这就是您需要的数据:不过现在有意义了。根据反汇编程序的不同,对于固定长度的指令集(如ARM模式下的ARM),反汇编程序可能会简单地反汇编所有内容,包括我在这里展示的不是指令的内容,对于其他情况,他们可能会尝试从数据中找出代码,我无法按照编写的方式组装您的分支,但作为一个无条件分支,这意味着它后面可能是代码或数据,在您的情况下,它与神秘数据值的位置一致。如果您提到的所有这些系统调用的值都相同,那么它可能仍然是一个参数,也可能是其他东西,在任何一种情况下,都可能会传入参数r0、r1、r2、r3,您没有显示这些参数可能会被系统调用使用,我不知道android系统调用约定,而且可能会因版本或实现而有所不同,但这将是理解这一点的另一条途径,在arm上查找android系统调用