我正在尝试学习ARM组装 . 我决定反汇编“读取”功能,这就是我得到的 . 从它的外观来看,似乎是使用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上,如果它有帮助的话 .
谢谢!
1 回答
你几乎遗漏了最重要的部分,所以不得不即兴发挥
是的,它正在做你说它正在做的事情,它在进行系统调用之前在r7中加载一些值,现在它是什么值为什么它使用pc相对负载(可能是一个不适合作为一个直接的常量) ,和/或链接时间解析值而不是编译时间)并且不同的系统调用有不同的值,r7是否为参数?那么你没有提供足够的信息来讨论这个问题 . 一旦你有/看到那些信息,那么这些答案应该是非常明显的......如果这些是你的问题 .