arm汇编传参

arm汇编传参开发环境 androidstudi 3 调试工具 IDA7 0so 代码 include lt jni h gt include lt string gt include lt stdlib h gt include lt stdio h gt intGetSum inta1 inta2 intsum a1 a2 re

so代码:

#include 
  
    #include 
   
     #include 
    
      #include 
     
       int GetSum(int a1,int a2) { int sum = a1+a2; return sum; } extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { char s[12]; memset(s,0, sizeof(s)); int sum = GetSum(2,5); sprintf(s,"%d",sum); return env->NewStringUTF(s); } 
      
     
    
  

arm汇编:

libnative_lib.so:AEE46872 LDR R4, [R4] ; __stack_chk_guard libnative_lib.so:AEE46874 LDR.W R12, [R4] libnative_lib.so:AEE46878 STR.W R12, [SP,#0x34] libnative_lib.so:AEE4687C STR R0, [SP,#0x24] libnative_lib.so:AEE4687E STR R1, [SP,#0x20] libnative_lib.so:AEE46880 MOVS R0, #0 libnative_lib.so:AEE46882 STR R0, [SP,#0x2C] libnative_lib.so:AEE46884 STR R0, [SP,#0x28] libnative_lib.so:AEE46886 STR R0, [SP,#0x30] //arm传递参数是使用固定寄存器r0-r3 超过使用堆栈方式传入 //与x86汇编不一样,x86使用的是push 传递参数。 libnative_lib.so:AEE46888 MOVS R0, #2 传入参数1为常量2 libnative_lib.so:AEE4688A MOVS R1, #5 //传入参数2为常量5 libnative_lib.so:AEE4688C STR R3, [SP,#0x18] libnative_lib.so:AEE4688E STR R4, [SP,#0x14] libnative_lib.so:AEE46890 STR R2, [SP,#0x10] libnative_lib.so:AEE46892 BLX unk_AEE46764 //调用GetSum 方法 libnative_lib.so:AEE46896 STR R0, [SP,#0x1C] //R0返回值为7 libnative_lib.so:AEE46898 LDR R2, [SP,#0x1C] GetSum方法: libnative_lib.so:AEE46848 ; =============== S U B R O U T I N E ======================================= libnative_lib.so:AEE46848 libnative_lib.so:AEE46848 libnative_lib.so:AEE46848 _Z6GetSumii libnative_lib.so:AEE46848 libnative_lib.so:AEE46848 var_14= -0x14 libnative_lib.so:AEE46848 var_10= -0x10 libnative_lib.so:AEE46848 var_C= -0xC libnative_lib.so:AEE46848 var_8= -8 libnative_lib.so:AEE46848 var_4= -4 libnative_lib.so:AEE46848 libnative_lib.so:AEE46848 SUB SP, SP, #0x14 ; CODE XREF: sub_AEE46764+8↑j libnative_lib.so:AEE46848 libnative_lib.so:off_AEE49FD0↓o libnative_lib.so:AEE4684A MOV R2, R1 libnative_lib.so:AEE4684C MOV R3, R0 libnative_lib.so:AEE4684E STR R0, [SP,#0x14+var_4] //参数1值存入[SP,#0x14+var_4]中 libnative_lib.so:AEE46850 STR R1, [SP,#0x14+var_8]//参数2值存入[SP,#0x14+var_8]中 libnative_lib.so:AEE46852 LDR R0, [SP,#0x14+var_4]//[SP,#0x14+var_4]的值载入到寄存器R0中 值为2 libnative_lib.so:AEE46854 LDR R1, [SP,#0x14+var_8]//[SP,#0x14+var_8]的值载入到寄存器R1中 值为5 libnative_lib.so:AEE46856 ADD R0, R1 //R0+R1 = 7 libnative_lib.so:AEE46858 STR R0, [SP,#0x14+var_C] libnative_lib.so:AEE4685A LDR R0, [SP,#0x14+var_C] //作为返回值存入R0中 libnative_lib.so:AEE4685C STR R2, [SP,#0x14+var_10] libnative_lib.so:AEE4685E STR R3, [SP,#0x14+var_14] libnative_lib.so:AEE46860 ADD SP, SP, #0x14 libnative_lib.so:AEE46862 BX LR libnative_lib.so:AEE46862 ; End of function _Z6GetSumii 

 

4121383-2fce54002b3dc6d1.png

IDA动态调试 ,单步跟踪的时候,右边的能看到每个寄存器的值。 

4121383-5767cc5ad7ee987d.png

LDR R0, [SP,#0x14+var_4] //在例子中sp的地址值是BE9A3894 = R0= [BE9A3894 +0x14-4]= BE9A38A4 = 2 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214025.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午5:09
下一篇 2026年3月18日 下午5:09


相关推荐

  • 【自然语言处理】知识图谱之知识推理「建议收藏」

    【自然语言处理】知识图谱之知识推理「建议收藏」1.知识推理的分类归纳推理归纳推理所推出的结论是没有包含在前提内容中的。由个别事物推出一般性的知识的过程,是以为增殖新知识的过程。演绎推理:在已知领域内的一般性知识的前提下,通过求解一个具体的问题,或者证明一个结论的正确性。它所得出的结论,实际上早已蕴含在一般性的知识的前提中。演绎推理只是将已有的事实揭露出来,因此不能增殖新的知识。确定性推理多数时候是指逻辑推理,具有…

    2022年5月24日
    77
  • 电脑键盘锁定怎么解锁笔记本_电脑键盘被锁如何解锁

    电脑键盘锁定怎么解锁笔记本_电脑键盘被锁如何解锁主流的笔记本厂商为了扩展键盘功能,为用户提供便捷的操作体验,给F1~F12增加了特定的快捷功能。默认情况下这些快捷功能需要按Fn+(F1~F12)来实现,不过经常使用快捷功能的用户可能需要锁定Fn键,使系统默认调用快捷功能,避免每次都要按Fn。一、戴尔、联想、小米,用Fn+Esc锁定/解锁如果笔记本Esc键的右下角有一个带fn标志的锁,说明这台笔记本适用…

    2022年8月13日
    9
  • 图像缩放之双三次插值法

    图像缩放之双三次插值法今天学习了第三种图像缩放的方法 双三次插值法

    2026年3月18日
    2
  • linux 宝塔 卸载mysql_宝塔面板(linux)卸载的一些方法的整理以及卸载之后一些文件的删除…

    linux 宝塔 卸载mysql_宝塔面板(linux)卸载的一些方法的整理以及卸载之后一些文件的删除…大鸟说过很多宝塔面板的教程,貌似没说过如何卸载宝塔面板,如果我们安装一款面板,都会要求要干净纯净的系统,就是说,如果你安装过环境可能会导致安装不成功。宝塔面板可以安装,当然也可以卸载,官方也给出了卸载脚本,大鸟把这些方法罗列下写在这里。一:脚本卸载1你需要先在面板中将通过面板安装的所有软件卸载,如nginx、mysql、php等等然后,进入SSH命令行,输入以下命令:/etc/init.d/bt…

    2025年9月16日
    9
  • java小程序实例大全_12个用Java编写基础小程序&经典案例(收藏)

    java小程序实例大全_12个用Java编写基础小程序&经典案例(收藏)原标题:12个用Java编写基础小程序&经典案例(收藏)如果是刚接触或者刚学习java,练习一些基础的算法还是必须的,可以提升思维和语法的使用。1、输出两个int数中的最大值importjava.util.Scanner;publicclassdemo{publicstaticvoidmain(String[]args){Scannerscanner=newSc…

    2022年7月7日
    37
  • 查看win11激活状态[通俗易懂]

    查看win11激活状态[通俗易懂](一)命令行查看:slmgr.vbs-dlv如上图所示,windows11已激活。(二)右键计算机属性查看(1)单击系统:(2)单击激活:可以看到已经处于激活状态。

    2022年5月7日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号