Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 臂拆卸-对“LDR r7,[pc,0x14]”感到困惑_Arm - Fatal编程技术网

Arm 臂拆卸-对“LDR r7,[pc,0x14]”感到困惑

Arm 臂拆卸-对“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

我正在尝试学习手臂装配。我决定反汇编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
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系统调用