mov ax, 5 mov bx, 5 cmp ax, bx 这段指令是5-5=0,但是并不是在寄存器中a改值: 还没有给ax寄存器放值之前如上图,放入ax和bx之后如下图: 这个时候再 类似的如果是sub指令: 会影响到累加器ax,这就是sub与cmp指令的区别。
汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器
代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!
今天的目标就是ARM汇编的加减乘除 二、步骤 伪代码 int add(int a, int b) { return a + b; } int calc(int a, int b, int c, int d) { int e = add(a-b, c-d); return e * a; } 咱们心算一下 calc(3,2,4,3) 的结果 (3-2)+(4-3) * 3 = 6 汇编代码 和mul 几个指令 bl 无条件跳转指令,类似C语言中的goto, 也可以调用函数用 str 数据存储指令 add 加法指令 sub 减法指令 mul 乘法指令 编译 编译连接加运行,好几条命令,一条一条敲显然不符合我们高级程序员的身份 /arm-linux-androideabi-ld -o $name $name.o adb push $name /data/local/tmp/$name adb shell chmod +x / 奋飞: 这个 ARM的除比较复杂,不是一条指令就能搞定的…… 其实ARM汇编就是要细心和耐心,不要一看到汇编就头大,仔细一条一条的分析和其他语言差不多,甚至更呆板一些。
学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。 (3)【减法指令】:SUB SUB 目的寄存器,操作数1,操作数2 把操作数1减去操作数2,并将结果存放到目的寄存器中。 SUB R0,R1,R2 ;R0 = R1 - R2 SUB R0,R1,#256 ;R0 = R1 - 256 3.比较指令 (1)【直接比较指令】:CMP CMP 操作数1,操作数2 【AREA】 一个汇编程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段,因此在汇编程序的开头,我们一般的语句会用到AREA。 ENTRY 伪指令用于指定汇编程序的入口点。
引入伪指令后,利用LDR可以为R0赋任意大小值,编译器会自动拆分成真正的的指令,实现目的。 有了前面5个汇编指令的基础,我们就可以写代码了。 第004节_汇编与机器码 前面介绍过伪指令,伪指令是实际不存在的ARM命令,编译器在编译时转换成存在的ARM指令。我们代码中的ldr r1, =0x56000050这条伪指令的真实指令时什么呢? 我们可以通过反汇编来查看。 在前面的Makefile中加上: arm-linux-objdump -D led_on.elf > led_on.dis 上传服务器,编译。 ARM指令采用流水线机制,当前执行地址A的指令,已经在对地址A+4的指令进行译码,已经在读取地址A+8的指令,其中A+8就是PC的值。 第008节_几条汇编指令_bl_add_sub_ldm_stm ⑥ADD/SUB 加法/减法 举例1: add r0,r1,#4 效果为 r0=r1+4; 举例2: sub r0,r1
str -(Store Register)存储指令 格式: str{条件} 源寄存器,<存储器地址> 将源寄存器中数据存到存储器地址中。 实例1: str r1,[r2] ; 将r1中的值存到r2所指定的地址中 str r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中 str r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4 实例2(以u-boot中lowlevel_init函数的一段代码说明str指令的用法): ldr r0, =SMRDATA ldr r1, _TEXT_BASE //r1等于_TEXT_BASE内容,也就是TEXT_BASE(0x3ff80000) sub 0000为标准的相对地址,因为现在程序运行在起始地址为0x0000 0000的地方 ldr r1, =BWSCON //将BWSCON所指向的首地址值存到
今天我们来说一下arm的汇编指令和伪指令。 一、指令和伪指令 我们首先来了解一下什么叫做指令和伪指令。 指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。 arm汇编有两种风格,ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如:LDR R0, [R1]。 GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]。 二、arm汇编特点 ARM汇编特点1:LDR/STR架构。 , {r2-r7,lr} 相对寻址 beqflag ARM汇编特点3:指令后缀。同一指令经常附带不同后缀,变成不同的指令。 那么arm汇编指令就暂时介绍这几个,接下来介绍几个伪指令。 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。伪指令的意义在于指导编译过程。
cmp:(compare)指令进行比较两个操作数的大小 格式: cmp oprd1,oprd2 比较oprd1和oprd2操作数,然后通过助记符来实现想要的判断。 teq: (test equal)测试相等,该指令通常用于比较操作数1和操作数2是否相等。 格式: teq oprd1,oprd2 TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。 该指令通常用于比较操作数1和操作数2是否相等。(EOR指令也是实现异或运算,只是不更新CPSR) cmp和teq助记符如下 ? ?
-g选项,那么用objdump反汇编时可以把C代码和汇编代码穿插起来显示,这样C代码和汇编代码的对应关系看得更清楚。 反汇编的结果很长,以下只列出我们关心的部分。 ,其实还有一种办法是gcc -S main.c,这样只生成汇编代码main.s,而不生成二进制的目标文件。 0x0 实际上回过头发现main函数最开始也有初始化的3条汇编指令,先把ebp压栈,此时esp减4为0x6ffffba8,再将esp赋值给ebp,最后将esp减去8,所以在我们调试第一条运行的指令( 参考: 《linux c 编程一站式学习》 《网络渗透技术》
cmp:(compare)指令进行比较两个操作数的大小 格式: cmp oprd1,oprd2 比较oprd1和oprd2操作数,然后通过助记符来实现想要的判断。 teq: (test equal)测试相等,该指令通常用于比较操作数1和操作数2是否相等。 格式: teq oprd1,oprd2 TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。 该指令通常用于比较操作数1和操作数2是否相等。 (EOR指令也是实现异或运算,只是不更新CPSR) cmp和teq助记符如下 助记符 含 义 EQ 相等equal NE 不相等not equal CS 无符号数大于或等于Carry Set CC
汇编 得到对应的汇编代码后,我们就可以通过执行汇编指令将对应的汇编代码转换为二进制文件了,GCC 指令如下:gcc -C 汇编文件 -o 输出文件路径。 启动链接的指令为:gcc hello.o -o hello.exe。事实上,这也是 GCC 将源文件直接编译为可执行文件的指令(gcc 源文件 -o 可执行文件输出路径)。 ? ,将 C语言代码编译成汇编代码然后进行汇编。 2、将 sub-header.h 文件放在 GCC 默认会搜索的头文件目录中,Linux 下为 usr/include,Windows 下为 MinGW 安装目录的 include 子目录下。 3、将 sub-header 的相对路径 / 绝对路径通过 -I 参数加入 GCC 编译命令中,使 GCC 将 sub-header 目录作为头文件搜索目录之一。
-g选项,那么用objdump反汇编时可以把C代码和汇编代码穿插起来显示,这样C代码和汇编代码的对应关系看得更清楚。 反汇编的结果很长,以下只列出我们关心的部分。 ,其实还有一种办法是gcc -S main.c,这样只生成汇编代码main.s,而不生成二进制的目标文件。 实际上回过头发现main函数最开始也有初始化的3条汇编指令,先把ebp压栈,此时esp减4为0x6ffffba8,再将esp赋值给ebp,最后将esp减去8,所以在我们调试第一条运行的指令(movl 参考: 《linux c 编程一站式学习》 《网络渗透技术》
ARM汇编语言指令集汇总 跳转指令 存储器和寄存器交互数据指令(内存访问) 数据传送指令 数据算术运算指令 数据逻辑运算指令 比较指令 组合和分离指令 并行指令 测试指令 ThumbEE指令 协处理器指令 伪指令 无线 MMX 技术伪指令 其他指令 寄存器寻址方式 跳转指令 指令 简介 B 无条件跳转 BL 带链接的无条件跳转 BX 带状态跳转,更改指令集 BLX 带链接和状态切换的无条件跳转,更改指令集 指令 简介 ⬅️ ADD 加 ️ SUB 减️ MUL 乘 DIV 除 ADC 带进位的加法指令 SBC 带借位减法指令 AND 逻辑“与” ASR 算术右移 RSB 反向减法 SBC 带进位减法 RSC WZERO wr1 其他指令 指令 简介 CPS 更改处理器状态 CPY 复制 DBG 调试 SWT 协处理器指令,切换用户模式 DCB 伪指令:分配一片连续的字节存储单元并用指定的数据初始化 BIC ,R1,LSL #2 R0=R1*4 寄存器间接寻址 LDR R0,[R1] ;将R1寄存器中的值作为地址,取出值给R0 寄存器间接寻址偏移寻址 LDR R0,[R1,#-4] 更多可参考 《ARM汇编指南
16位汇编第九讲汇编指令以及逆向中的花指令 一丶LOOP指令(循环指令) 作用: 循环指令利用cx计数器自动减1,方便实现计数循环的程序结构 返回指令回到主程序继续执行 如果懂C语言或者别的更高级的语言的请看 这个其实就是函数,为了代码的重用性,可利用性研究出来的,否则汇编代码一多就会很乱,比如有效的管理代码 比如ret指令,其实就是平衡栈的 四丶花指令 请看下面的汇编代码 ? 我们发现jmp的地方下面申请了一个字节,但是在汇编的时候,这1个字节和mov的机器码在一起了 因而产生的汇编代码就出错了,花指令混淆就是这样,这段代码还是可以正常执行的 对抗手法 1.如果是动态的调试, 那么花指令是没用的(动态调试就是一步一步走)为什么,因为为了保证汇编代码不出错 每走一次代码都会重新反汇编 2.花指令主要对抗的是静态调试,因为病毒是不能运行的,只能看二进制和汇编,这个时候怎么办 我们发现了
汇编知识扫盲之常见汇编指令 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. .所以这个指令只为填充字节. 2. SUB 减法. SBB 带借位减法. DEC 减 1. NEC 求反(以 0 减之). NEG 求补 CMP 比较. 五、程序转移指令 1>无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2>条件转移指令 (短转移,-128到+127 JECXZ ECX为零时转移. 4>中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5>处理器控制指令 HLT 处理器暂停,
adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop 得出以下汇编 0C008000): 0c008000 <_start-0x14>: c008000: e59f000c ldr r0, [pc, #12] ; c008014 <_start> //ldr指令 (不带=) : r0= c008014里面内容= e1a00000 c008004: e28f0008 add r0, pc, #8 ; 0x8 //adr指令: r0= (当前PC值+8)+0x8=c008014 c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start+0x4> //ldr指令(带=) : 看上去这只是一个指令,但是它要占用 2 个 32bit 的空间,一条是指令,另一条是 _start 的数据(因为在编译的时候不能确定 _start 的值,而且也不能用 mov 指令来给 r0 赋一个 32bit
,首先我们必须具备的基础知识是几条简单的汇编指令和寄存器的功能和作用以及通常用的几个寄存器。 1.常用的intelx86汇编指令。 [push 寄存器] 功能:将一个寄存器中的数据入栈。包含两个动作:将寄存器中的数据入栈,栈顶指针向上(低地址)偏移。 具备上边常用的intelx86汇编指令以及常用寄存器的功能。 3.sub esp,4Ch,对照上边的汇编指令,这里做的操作是 -= ,即esp = esp-4ch,我们都知道,指针进行加减还是指针。 (2)跳转 如何确定call指令是否执行了上述的动作,我们使用反汇编代码进行调试。 黄箭头表示此条指令还未执行,那么我们查看此时栈底指针esp的地址,查看内存中的内容。
准备工具及知识 你需要准备以下工具: (1) 一台64位Linux操作系统的x86计算机(虚拟机也可) (2) gcc编译器、gdb调试器以及nasm汇编器(安装命令:sudo apt-get install 熟练使用C语言、熟悉gcc编译器以及Linux操作系统 2. 熟悉x86汇编,熟练使用mov, push, pop, jmp, call, ret, add, sub这几个常用命令 3. 了解函数的调用过程以及调用约定 考虑到大部分学校里面使用的x86汇编教材都是32位、windows平台下的,这里简单介绍一下64位Linux平台下的汇编的不同之处(如果你已熟悉Linux下的X86-64 另外,本文所有汇编都是用intel格式写的,为了使gdb显示intel格式的汇编指令,需在home目录下新建一个.gdbinit的文件,输入以下内容并保存: set disassembly-flavor 让我们来分析一下程序中的汇编指令吧,先将目标程序的汇编码输出到victim.asm文件中,命令如下: objdump -d victim -M intel > victim.asm 然后打开victim.asm
:# hostname -f 含义:表示输出当前主机名中的FQDN(全限定域名) 2、id 指令 作用:查看一个用户的一些基本信息(包含用户id,用户组id,附加组id…),该指令如果不指定用户则默认当前用户 作用:查看目录的真实大小 语法:#du -sh 目录路径 选项含义: -s:summaries,只显示汇总的大小 -h:表示以高可读性的形式进行显示 案例:统计“/root/yunweihenniux kill掉Apache的进程 与kill命令作用相似但是比kill更加好用的杀死进程的命令:killall 语法:# killall 进程名称 10、ifconfig 指令(重点) 作用:用于操作网卡相关的指令 作用:manual,手册(包含了Linux中全部命令手册,英文) 语法:# man 命令 (退出按下q键) 案例:通过man命令查询cp指令的用法 man cp 二、练习题 如何通过命令行重启linux touch /tmp/test.conf 如何通过vim编辑打开/tmp/test.conf? vim /tmp/test.conf 如何查看/etc/passwd的头3行和尾3行?
云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。
扫码关注云+社区
领取腾讯云代金券