安全攻防

学习汇编--硬件相关

2017-07-17  本文已影响23人  cochn

在汇编中,大部分指令都是和CPU与内存相关的

内存

CPU

总线

地址总线

数据总线

控制总线

寄存器

不同的CPU,寄存器的个数、结构是不同的(8086是16位结构的CPU)

通用寄存器

数据寄存器
寻址方式

物理地址 = 基地址 + 偏移地址

    * 8086的地址总线是20根,可以寻址的范围为0x00000 ~ 0xFFFFF。CPU是16位,计算出来的地址范围是0x0000 ~ 0xFFFF。为了满足地址总线的寻址范围,采用基地址+偏移地址的方法,通过CPU中的地址加法器计算出物理地址,再由地址总线传给内存,寻找物理地址。
    * 基地址必须是16的倍数
    * 偏移地址的寻址范围为64kb(0x0000 ~ 0xFFFF)
    * 8086内存最大可以分成16段。2^20 / 2 ^ 16 = 2^4

段寄存器

8086有四个段寄存器:CS、DS、SS、ES,当CPU需要访问内存时由这4个段寄存器提供内存单元的段地址

*   CS (Code Segment):代码段寄存器
*   DS (Data Segment):数据段寄存器
*   SS (Stack Segment):堆栈段寄存器
*   ES (Extra Segment):附加段寄存器
CS和IP
分析CS和IP的工作流程
2990730-69f1503975cf6889.png
  1. 地址加法器计算CPU需要在内存中寻找的地址单元 20000H

  2. 地址加法器计算的20位地址结果传入输入输出控制电路

  3. 输入输出控制电路通过地址总线将地址传入内存

  4. 在内存中找到20000H地址单元,读取指令

  5. 指令通过数据总线传回输入输出控制电路

  6. 将指令放入指令缓冲器

  7. 修改IP中0000H的值

  8. 执行控制器

     注意:
     指令一旦放入指令缓冲器,立即修改IP的值,然后才会执行指令
     
     补充:
     * 在内存中读数据时,读多少个字节由汇编指令决定
     * 指令通过数据总线传回时,一次传多少字节由数据总线决定
     * 8086CPU启动时CS和IP分别被设置为CS=0xFFFFH,IP=0000H
    
指令和数据
jmp指令

jmp用法:

DS和[address]
大小端
PUSH
POP
栈顶超界

当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,都将发生栈顶超界问题
栈顶超界是非常危险的,因为栈空间之外可能存放其他有用的数据、代码等。栈顶超界会覆盖这个数据、代码

注意:
在8086中,push、pop操作的数据都是2个字节的
栈段
上一篇 下一篇

猜你喜欢

热点阅读