精华内容
下载资源
问答
  • 只需要了解基址寄存器EBP和堆栈指针寄存器ESP即可,指令指针寄存器EIP总是指向下一条要执行的指令的地址,一般情况下无需修改EIP。 EBP和ESP寄存器 (1)EBP:EBP称为基址寄存器,可作为通用寄存器用于存放操作...
    指针寄存器
    80386的指针寄存器有基址寄存器EBP,堆栈指针寄存器ESP和指令指针寄存器EIP。只需要了解基址寄存器EBP和堆栈指针寄存器ESP即可,指令指针寄存器EIP总是指向下一条要执行的指令的地址,一般情况下无需修改EIP。


    EBP和ESP寄存器
    (1)EBP:EBP称为基址寄存器,可作为通用寄存器用于存放操作数,常用来代替堆栈指针访问堆栈中的数据。
    (2)ESP:ESP称为堆栈指针寄存器,不可作为通用寄存器使用,ESP存放当前堆栈栈顶的地址,一般情况下,ESP和EBP联合使用来访问函数中的参数和局部变量。


    EBP和ESP寄存器的用途
    EBP和ESP常配合使用完成堆栈的访问,下面是一段常见的堆栈访问指令。
    Push ebp
    Mov ebp,esp
    Sub esp,78
    Push esi
    Push edi
    Cmp dword ptr [ebp+8],0


    展开全文
  • 8086通用指令寄存器

    千次阅读 2018-10-16 22:15:49
    (2)指令指针 (3)标志寄存器 (4)段寄存器等4类。 有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个)。 顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的...

    8086寄存器

    8086 有14个16位寄存器,这14个寄存器按其用途可分为

    (1)通用寄存器
    
    (2)指令指针
    
    (3)标志寄存器
    
    (4)段寄存器等4类。
    

    有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器(4个)。

    顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。

    通用寄存器的数据寄存器是两个字节,以AX为例,分为高8位(AH)低8位(AL)

    基础汇编指令

    add al,1(如果ax=00FFH,那么ax会等于=0000H,进位标志CF变为1)al的值加1赋给al
    sub al,1 al的值减1赋给al
    mov ax,[1000H]  把值为1000H的地址放到ax
    push ax ESP指向的地址减2,把ax里的值压入栈
    pop ax  ESP指向的地址加2,把ax里的值弹出栈
    

    CPU是从高地址往低地址读取。

    物理地址

    在存储器里以字节为单位存储 信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址,又叫实际地址或绝对地址。

    8086是16位的CPU,地址总线是20位

    物理地址=段地址*10H+偏移地址
    例:
    CS:2000H,IP:0033H
    物理地址=2000H*10H+0033H=20033H
    

    先进后出,后进先出,是从高地址往低地址存入。

    ESP指向当前的栈顶,EBP是基址指针。

    内存寻址方式

    标志寄存器

    展开全文
  • ARM内核(Cortex-M3)由ALU,NVIC,Register Banked,Fetch and ...本文先介绍CM3的寄存器组,以及ARM汇编指令。最后通过反汇编例子来分析实际的汇编代码。1 寄存器组CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄...

    6d5cc746b32ab0250189bb7664924099.png

    ARM内核(Cortex-M3)由ALU,NVIC,Register Banked,Fetch and Decoder Unit,Interfaces组成。

    其中的寄存器相当于CM3自己的内存,存取速度非常快。用于暂存数据处理中的过程数据和状态。

    本文先介绍CM3的寄存器组,以及ARM汇编指令。最后通过反汇编例子来分析实际的汇编代码。

    1 寄存器组

    CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。

    1ab1e2c9f90c5071b3f4bed3df79f295.png

    62571f3412c329ff00c835d501dc7e68.png

    R13,堆栈指针(Stack Pointer)

    R13寄存器中存放的是堆栈的栈顶指针,CM3中有两个堆栈指针,也就支持两个堆栈。分别是:主堆栈指针(Main Stack Pointer),进程堆栈指针(Process Stack Pointer)。

    堆栈主要是通过POP,PUSH指令来进行操作。在执行 PUSH 和 POP 操作时,那个通常被称为 SP 的地址寄存器,会自动被调整,以避免后续的操作破坏先前的数据。

    R14 ,连接寄存器(Link Register)

    在一个汇编程序中, LR 用于在调用子程序时存储返回地址。例如,在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值(执行函数调用的下一指令),进而在函数退出时,正确返回并执行下一指令。

    如果函数中又调用了其他函数,那么LR将会被覆盖,所以需要先将LR寄存器入栈PUSH,保护起来。

    R15,程序计数器(Program Count)

    因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4

    特殊功能寄存器组

    Cortex‐M3 中的特殊功能寄存器包括:

    程序状态寄存器组( xPSR),存放当前CPU的状态

    中断屏蔽寄存器组( PRIMASK, FAULTMASK,以及 BASEPRI),用于控制异常的使能和除能

    控制寄存器( CONTROL),用于定义特权级别,以及选择当前使用堆栈指针(PSP/MSP?)。

    CM3的操作模式

    为了架构的安全性和健壮性,CM3支持2个模式(线程模式,handler模式),以及2个特权等级(特权级,用户级)。handler模式下只能是特权级。

    84899035be2061d8b4822b0c5a0daa6c.png

    复位序列

    在进入复位状态后, CM3 做的第一件事就是读取下列两个 32 位整数的值:

    从地址 0x0000,0000 处取出 MSP 的初始值。(初始化MSP,为后续的代码执行创造环境)

    从地址 0x0000,0004 处取出 PC 的初始值---这个值是复位向量。(启动引导代码)

    3aa76a61f46a0d6e28c73a562e491a56.png

    199cfc746b41319f6322e0941538330b.png

    2 ARM汇编指令集

    ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类

    跳转指令:B,BL,BX,BXL(用于函数调用时的跳转,分为带/不带 返回地址/状态 的跳转)

    数据处理指令:MOV,ADD,SUB,DIV,MUL,AND,ORR,CMP...(赋值,加减乘除,与或逻辑,比较)

    程序状态寄存器(PSR)处理指令:MSR,MRS(用于查询或设置状态寄存器/特殊寄存器的数据)

    加载/存储指令: LDR,STR...(用于寄存器与内存之间的数据交换,一般为间接寻址)

    异常产生指令:SWI(用于产生软件中断)

    3 函数调用过程的汇编分析

    通过简单的函数调用,分析入栈,出栈,寄存器的使用,以及常用的ARM汇编指令。

    #include <stdio.h>
    
    int add_f(int x,int y)
    {
    	int ret = 0;
    	ret = x + y;
    	return ret;
    }
    
    int main()
    {
    	int a = 10,b = 20;
    	int c = add_f(a,b);
    	return 0;
    }

    编译,再反汇编:

    46f94f5a3d5d859129e0ba1678d2acb2.png

    汇编代码:

    596d4156604cc59f850622318b79adf5.png

    add_f 函数 分析:

    寄存器参数入栈PUSH,保存上一函数的运行参数fp(R11)

    栈指针SP减小20,伸张栈帧空间,开辟本次函数的栈帧(栈帧,就是指单个函数运行的栈空间,函数在调用的过程中,各个函数栈帧进行串接,堆栈向下生长。)

    进行数据操作(MOV,ADD,SUB,LDR,STR等)

    栈指针SP复位至最开始的地址,收缩栈帧空间

    寄存器参数出栈POP,恢复上一函数的运行参数fp(R11)

    bx lr,带状态的跳转至lr寄存器中的地址

    所谓的栈空间内存由编译器自动回收,也就是这个道理,在编译阶段,就确定了各个函数的栈帧空间的伸张与收缩,无需程序员来进行内存管理。另外,处于堆空间的数据需要手动分配与释放(malloc/free)。

    展开全文
  • 汇编语言学习笔记一:CS和IP寄存器

    万次阅读 多人点赞 2017-11-27 14:28:22
    1、CS是代码段寄存器,IP是指令指针寄存器(相当于偏移地址)。修改CS、IP的指令不同于修改通用的寄存器...(1)同时修改代码段寄存器和指令指针寄存器,形如jmp 段地址:偏移地址。 jmp2AE3:3,执行后:CS=2AE3H,IP=0

    1、CS是代码段寄存器,IP是指令指针寄存器(相当于偏移地址)。修改CS、IP的指令不同于修改通用的寄存器值的指令,修改通用寄存器的值可以用mov 指令(mav ax,123),mov指令被称为传送指令。修改CS、IP的指令是jmp指令。jmp指令被称为转移指令。

    (1)同时修改代码段寄存器和指令指针寄存器,形如jmp 段地址:偏移地址。

    jmp2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将在2AE33H处读取指令

    (2)仅想修改IP的内容,形如“jmp 某一合法寄存器”,功能是用某一合法寄存器中的值修改IP的内容

    jmpax,指令执行前:ax=1000H,CS=2000H,IP=0003H

            指令执行后:ax=1000H,CS=2000H,IP=1000H。

    2、一般来说,CPU在访问内存的时候要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。段寄存器提供段地址。8086CPU有4个段寄存器:CS、DS、ES、SS。典型的提供段地址和偏移地址的寄存器为CS和IP寄存器。也就是说,CPU会将CS:IP合成的物理地址指向的内容当作指令执行。CPU执行指令的步骤一般是:

    (1)将CS、IP中的内容送入地址加法器(段地址*16+偏移地址)合成物理地址。

    (2)地址加法器将物理地址送入输入输出控制电路

    (3)输入输出控制电路将物理地址送上地址总线

    (4)然后CPU从物理地址指向的内存单元读取机器指令,并将机器指令通过数据总线送入CPU的输入输出控制电路。

    (5)输入输出控制电路将读取的指令送入指令缓冲器,同时IP的内容更新为原内容加指令长度。

    (6)然后,执行控制器执行机器指令,并将执行后的内容送入相应的寄存器。


    3、在编程时,可以根据需要将一组内存单元定义为一个段。我们可以将长度为N(N<=64KB,因为偏移地址长度为16位,最大为64KB)的一组代码存在一组连续、起始地址为16的倍数的内存单元中。这样,这段内存就可以看成是代码段,用来存放代码的。


    4、查看CPU和内存,用机器指令和汇编指令编程,做实验

    (1)打开程序调试工具:运行”cmd”->输入debug。

    (2)Debug功能

       1)用R命令查看、改变CPU寄存器的内容

       2)用D命令查看内存中的内容

       3)用E命令改写内存中的内容

       4)用U命令将内存中的机器指令翻译成汇编指令

       5)用T命令执行一条机器指令

       6)用Debug的A命令以汇编指令的格式在内存中写入一条机器指令

    Normal>(3)输入输出控制电路将物理地址送上地址总线

    (4)然后CPU从物理地址指向的内存单元读取机器指令,并将机器指令通过数据总线送入CPU的输入输出控制电路。

    (5)输入输出控制电路将读取的指令送入指令缓冲器,同时IP的内容更新为原内容加指令长度。

    (6)然后,执行控制器执行机器指令,并将执行后的内容送入相应的寄存器。


    r命令查看寄存器的内容


    r命令修改寄存器的内容(修改了ax、cs、ip寄存器的内容)


    d命令查看内存中的内容(d 起始地址),显示分别为地址、地址中的内容、内容的ascll字符形态。


    d命令查看某范围的内存内容(形如d1000:0 9)。


    e命令改写内存中的内容(e 起始地址数据 数据 数据..)


    e命令向内存中写入字符或字符串


    e命令向内存中写入机器码,并使用u命令查看机器码对应的汇编



    t命令执行执行一条或多条指令(先改变cs、ip寄存器的值)


    a命令以汇编指令的形式在内存中写入机器指令,并用d指令查看对应的机器码(之后也可以用t指令执行相应的指令)


    展开全文
  • 寄存器

    千次阅读 2016-09-04 22:24:52
    8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。 通用寄存器 有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及...
  • 80X86CPU中的寄存器

    2020-11-05 23:23:29
    一共14个寄存器,分别为AX,BX,CX,DX,SP,BP,...指令指针寄存器1个(IP指令指针寄存器)。 标志寄存器1个(FLAGS标志寄存器)。 为什么剩下那六个不算通用寄存器,我觉得是因为它们有专门的作用,而不被程序员修改。 ...
  • cpu寄存器

    2019-03-27 16:59:51
    8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。 通用寄存器 通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址...
  • 指令指针寄存器 ; 标志寄存器; 段寄存器 通用寄存器(8个): 可以随意修改 数据寄存器(4个) : (通用的) AX(accumulator) : 累加寄存器 ,常用于运算 BX(base) : 基址寄存器 ,常用于地址索引 ...
  • CS、IP寄存器

    千次阅读 2021-01-17 10:00:35
    2、CS为代码段寄存器,IP为指令指针寄存器 3、8086CPU的工作原理 ①从 CS:IP指向的内存的单元读取指令,读取的指令进门如指令缓存器 ②IP=IP+所读取指令的长度,从而指向下一条指令 ③执行指令。转到步骤①,重复这...
  • 软件逆向基础——寄存器 最近沉迷手游,感觉抽卡出货率太坑,含泪弃之;转战单机游戏,通关一遍后想...·指令指针寄存器 ·标志寄存器 (一些寄存器可以作为通用寄存器;还有一些不行,比如标志寄存器) 通用寄存...
  • 一、修改 CS、IP 的指令 在 CPU 中,程序员能用指令读写的部件只有寄存器,程序员可以通过改变...IP 的全称是 instruction pointer,是指令指针寄存器 在我们修改其他的寄存器的时候,我们使用了 MOV 指令,在 8086C...
  • 汇编语言之寄存器(CPU工作原理)

    千次阅读 2016-10-30 21:17:56
    1、介绍 一个典型的CPU,由运算器、控制器、寄存器等器件组成,对于游戏修改者来说,重点学习寄存器,其它不必管。 不同的CPU,寄存器的个数、结构是不相同的,8086CPU有14个寄存器,每个寄存器...5.指令指针寄存器:I
  • 汇编之寄存器

    2008-11-27 20:38:00
    AX、BX、CX、DX用来存在一般性的数据,称为通用寄存器CX用于存放 loop 的循环次数CS为代码段寄存器,IP为指令指针寄存器 CS:IP指向的内容为当前要执行的指令 CS:IP=CS*N+IP(N为CPU的字长) 修改CS,IP的内容,...
  •   如果需要对恶意软件分析,或者修改现有可执行文件的功能,如果有软件的源代码,固然可以比较好的修改,如果没有,通过汇编指令修改亦可做到。本文介绍CPU寄存器和常用汇编语言指令。   1.CPU寄存器   ESP...
  • 段寄存器 段寄存器就是提供段地址的。 CS(Code Segment)代码段寄存器 ...CS和IP(指令指针寄存器 (instruction pointer))是8086中最关键的寄存器,它们指示了CPU当前要读取指令的地址。 修改CS、IP的指令 mov...
  • 8086寄存器组织结构

    2017-08-07 10:30:34
    8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器、(2)指令指针、(3)标志寄存器和(4)段寄存器等4类。 (1)通用寄存器 有8个, 又可以分成2组,一组是数据寄存器(4个),另一组是指针寄存器及变址寄存器...
  • CS:IP 指示了当前要读取指令的地址,CS为代码段寄存器,IP为指令指针寄存器 可以这么理解: 任意时刻,CPU将CS:IP 指向的内容当作指令执行 如果要修改CS:IP的内容,则需要使用 jmp 指令来完成 ; 同时修改CS,IP可以...
  • 从8086CPU的定义上来讲,只要是可以修改IP(指令指针寄存器),或同时修改CS(代码段寄存器)和IPIP(指令指针寄存器)的指令统称为转移指令。也就是说,转移指令是用来控制CPU指令内存中某处代码的指令。 那么通过转移...
  • 基本程序运行寄存器

    2020-03-09 18:26:12
    介绍 一共有四种: 通用寄存器(32位): EAX:累加器(针对操作数和结果数据) EBX:基址寄存器(DS段钟的数据指针) ... ESP:栈指针寄存器(PUSH、POP、RETN、CALL指令可以直接修改) 段寄...
  • 函数调用过程

    2013-09-27 13:50:32
    修改指令指针寄存器eip的值,使其指向被调函数的执行位置.一个函数被调用,首先要完成以下动作(建立新栈帧):将调用函数的栈帧栈底地址入栈,即将bp寄存器的值压入调用栈中,将来返回时用。设置被调函数的栈帧栈底...
  • DSP 中断寄存器

    千次阅读 2009-03-02 19:38:00
    2.中断服务表指针寄存器ISTP(interrupt servicetable pointer)用于确定中断服务程序在中断服务表中的地址。ISTP中的字段ISTB确定IST的地址的基值,另一字段HPEINT确定特定的中断,并给出这一特定中断取指包在IST中
  • (CS代码段寄存器与IP指令指针寄存器) 8086CPU的转移行为有以下几类。 由于转移指令对IP修改的范围不同,段内转移又分为如下: 8086CPU的转移指令分为以下几类: 这些转移指令的前提条件可能不同,但转...
  • (CS代码段寄存器与IP指令指针寄存器)。它们经常用来实现子程序的设计,本章就来看看call和ret的原理。 ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和IP的内容,从而实现远...
  • 第三章 通用数据处理指令 3.1 简答题 如何修改 MOV ESI, WORD PTR 250 语句使其正确 删除 WORD ...入栈时堆栈指针寄存器做减法操作指向低地址出栈时堆栈指针寄存器做加法操作 指向高地址 都是获取偏移地址 为什么指令
  • 指令计数器--Program counter

    千次阅读 2019-10-03 13:54:24
    别名:指令指针、指令地址寄存器、程序计数器; 操作:顺序操作(计数器加一)、分支操作(计数器修改); Theprogram counter(PC), commonly called theinstruction pointer(IP) inIntelx86...
  • 1ARM汇编指令操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因此我们对ARM体系结构的介绍也围绕ARMv8-A的汇编指令寄存器来展开。处理器架构是处理器厂商为同一个系列的处理器规定的一个规范。...
  • 2、 栈指针寄存器 ESP中存储了当前的堆栈用到哪里了 3、 PUSH指令: 功能: &lt;1&gt; 向堆栈中压人数据 &lt;2&gt; 修改栈顶指针ESP寄存器 指令格式: 1、PUSH r32 2、P...
  • 平时,绝大部分时间我们都基本是使用C语言进行程序... 我们知道PC寄存器的值是指向当前执行指令的地址,但往往调用函数和被调用函数他们的地址是不相连的,这里就引出了第一点--需要将PC的值进行更改,让其指向被调...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 151
精华内容 60
关键字:

修改指令指针寄存器