1. 简介 CMP / CMN : 算术指令 TEQ / TST : 逻辑指令      它们总是会影响CPSR条件标志位. APSR(CPSR)与condition的关系图: 2. CMN -- 比较取负的值 CMN{条件}{P}    <op1>, <op2> status = op1 - (-op2)                          相加操作 CMN R0, #1  @把R0与-1进行比较 3. CMP CMP{条件}{P}    <op1>,…
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍参考了许多零散的文章,本文重点工作在于对相关概念的整理收集,并按相对合理顺序引出后文中对hook技术中的一些难点的解读. Android平台大多采用了ARM架构的CPU,而ARM属RISC,与X86架构的处理器有不同的特征,本文讲介绍ARM中不容易理解的PC寄存器各种问题,包括ARM流水线.PC寄存…
在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.…
转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中.而mov不能实现这个功 能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯…
标号(LABEL)是为一组机器指令所起名字,表示程序中的指令或者数据地址的符号.标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号.通过在目标地址的前面放上一个标号,可以在指令中使用标号来代替直接使用地址.标号是程序目标标志,总是和某地址相联系,供转移或循环指令控制转移使用. 标号是编译程序使用的,也就是说程序中最后生成的代码中标号都换成了相应的数值. 因标号表示是指令地址,所以它有三个属性,即段属性.偏移属性和类型属性.段属性即段地址,标号段必须在CS中.偏移属性是表示该标号…
1. 跳转指令 [ b ] [ bl ]   指令格式:<opcode><cond> <address> 不带返回的跳转指令:b mov r0, #0x12 mov r1, #0x34 b fun_add @一条指令 , 有地址 mov r2, #0x56 @通过上面的跳转此处将不会得到执行 mov r3, #0x78 fun_add: @伪操作 标号类似 C语言中的一个函数体 , 此处只是一个局部 的标号 mov r4, #0x1 mov r5, #0x1 add r…
1. bic BIC指令的格式为: BIC{条件}{S}  目的寄存器,操作数1,操作数2 BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中. 操作数1应是一个寄存器, 操作数2可以是一个寄存器.被移位的寄存器.或一个立即数. 操作数2为32位的掩码,如果在 掩码中置了某一位1,则清除这一位.未设置的掩码位保持不变. bic r0,r0,#0x1f 0x1f=11111b 其含义:清除r0的bit[4:0]位. 2. orr ORR指令的格式为: ORR{条件}{S}  目的寄存器…
其实就是 汇编的排序然后选出中位数 排序写的是最直接的冒泡排序,因为简单. 相应的C代码 r2=r0; while(r1<r0){ r1++; r2=r2-; r3=; while(r3<r2){ ]){ //交换 } r3++ } } 汇编代码: AREA EXAMPLE,CODE,READONLY ENTRY LDR SP,=0X40000000 ;ldr r4,=0x40000000;这才是开头 ;SWAP ;ldr r5,[r4];从堆栈取数 ;ldr r6,[r4,#] ;str r…
1.这是整形乘法指令,无论是 unsigned int 还算是 signed int 实际上指令都是进行相同的运算,只不过最终的结果是由程序中的类型来做相应的解读 2.imul 指令实际上不会发生 overflow,因为积会按乘数最大位数的两倍的位数来存放 3.二进制乘法,可以转换成对被乘数进行一些 left shift 运算, 然后求和…
IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的. 以上两个在汇编和C语言混合编程的时候用到 ENDP    表示PROC所定义的过程结束. (end procedure) ENDS    表示SEGMENT定义的段结束.   (end segment) END     程序结束. B.BL.BX.BLX 和 BXJ 跳转.带链接跳转.跳转并切换指令集.带链接跳转并切换指令集.跳转并转换到 Jazelle 状态. p…