展开

关键词

实操原理cmp 对比sub与cmp

mov ax, 5 mov bx, 5 cmp ax, bx 这段是5-5=0,但是并不是在寄存器中a改值: 还没有给ax寄存器放值之前如上图,放入ax和bx之后如下图: 这个时候再 类似的如果是sub: 会影响到累加器ax,这就是sub与cmp的区别。

31320

: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器

20210
  • 广告
    关闭

    什么是世界上最好的编程语言?丨云托管征文活动

    代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    代码还原的技术 ARM入门教程(二) 加减乘除

    今天的目标就是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就是要细心和耐心,不要一看到就头大,仔细一条一条的分析和其他语言差不多,甚至更呆板一些。

    41500

    Linux 必会的 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 伪用于程序的入口点。

    9110

    第008课 第1个ARM裸板程序及引申(点亮LED灯)

    引入伪后,利用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

    29910

    -str存储(4)

    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所向的首地址值存到

    39050

    arm(2)| 和伪

    今天我们来说一下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就暂时介绍这几个,接下来介绍几个伪。 伪不是,伪的根本区别是经过译后会不会生成机器码。伪的意义在于译过程。

    72930

    -CMP、TEQ

    cmp:(compare)进行比较两个操作数的大小   格式: cmp oprd1,oprd2   比较oprd1和oprd2操作数,然后通过助记符来实现想要的判断。 teq: (test equal)测试相等,该通常用于比较操作数1和操作数2是否相等。    格式: teq oprd1,oprd2   TEQ用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。 该通常用于比较操作数1和操作数2是否相等。(EOR也是实现异或运算,只是不更新CPSR)    cmp和teq助记符如下 ? ?

    27730

    角度来理解linux下多层函数调用堆栈运行状态

    -g选项,那么用objdump反时可以把C代码和代码穿插起来显示,这样C代码和代码的对应关系看得更清楚。 反的结果很长,以下只列出我们关心的部分。 ,其实还有一种办法是gcc -S main.c,这样只生成代码main.s,而不生成二进制的目标文件。 0x0 实际上回过头发现main函数最开始也有初始化的3条,先把ebp压栈,此时esp减4为0x6ffffba8,再将esp赋值给ebp,最后将esp减去8,所以在我们调试第一条运行的( 参考: 《linux c 程一站式学习》 《网络渗透技术》

    51520

    -CMP、TEQ(5)

    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

    495100

    开篇:预备知识---2

    ​ 得到对应的代码后,我们就可以通过执行将对应的代码转换为二进制文件了,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 目录作为头文件搜索目录之一。

    17220

    角度来理解linux下多层函数调用堆栈运行状态

    -g选项,那么用objdump反时可以把C代码和代码穿插起来显示,这样C代码和代码的对应关系看得更清楚。 反的结果很长,以下只列出我们关心的部分。 ,其实还有一种办法是gcc -S main.c,这样只生成代码main.s,而不生成二进制的目标文件。 实际上回过头发现main函数最开始也有初始化的3条,先把ebp压栈,此时esp减4为0x6ffffba8,再将esp赋值给ebp,最后将esp减去8,所以在我们调试第一条运行的(movl 参考: 《linux c 程一站式学习》 《网络渗透技术》

    58700

    ARM语言

    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

    8320

    16位第九讲以及逆向中的花

    16位第九讲以及逆向中的花 一丶LOOP(循环) 作用:   循环利用cx计数器自动减1,方便实现计数循环的程序结构 返回回到主程序继续执行 如果懂C语言或者别的更高级的语言的请看   这个其实就是函数,为了代码的重用性,可利用性研究出来的,否则代码一多就会很乱,比如有效的管理代码 比如ret,其实就是平衡栈的 四丶花  请看下面的代码 ? 我们发现jmp的地方下面申请了一个字节,但是在的时候,这1个字节和mov的机器码在一起了 因而产生的代码就出错了,花混淆就是这样,这段代码还是可以正常执行的 对抗手法 1.如果是动态的调试, 那么花是没用的(动态调试就是一步一步走)为什么,因为为了保证代码不出错 每走一次代码都会重新反 2.花主要对抗的是静态调试,因为病毒是不能运行的,只能看二进制和,这个时候怎么办 我们发现了

    558100

    知识扫盲之常见

    知识扫盲之常见 一、数据传输     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   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  处理器暂停,

    59920

    -adr与ldr伪区别(8)

    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

    72760

    角度看函数堆栈调用

    ,首先我们必须具备的基础知识是几条简单的和寄存器的功能和作用以及通常用的几个寄存器。 1.常用的intelx86。 [push 寄存器] 功能:将一个寄存器中的数据入栈。包含两个动作:将寄存器中的数据入栈,栈顶针向上(低地址)偏移。 具备上边常用的intelx86以及常用寄存器的功能。 3.sub esp,4Ch,对照上边的,这里做的操作是 -= ,即esp = esp-4ch,我们都知道,针进行加减还是针。 (2)跳转 如何确定call是否执行了上述的动作,我们使用反代码进行调试。 黄箭头表示此条还未执行,那么我们查看此时栈底针esp的地址,查看内存中的内容。

    7520

    C语言 | C++ 基础栈溢出及保护机制

    准备工具及知识 你需要准备以下工具: (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

    84488

    Linux之高级

    :# 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行?

    7100

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券