计算机组成原理(五)中央处理器

5.1 CPU的功能和基本结构

5.1.1 CPU的功能

CPU的功能和基本结构.png

CPU由运算器和控制器构成。控制器负责协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令;运算器的功能是对数据进行加工。CPU的具体功能有

  1. 指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
  2. 操作控制。一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
  3. 时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
  4. 数据加工。对数据进行算术和逻辑运算。
  5. 中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理。

5.1.2 CPU的基本结构

5.1.2.1 运算器

运算器主要由以下这些组成

  1. 算术逻辑单元:主要功能是进行算术/逻辑运算。
  2. 通用寄存器组:如AX、BX、CX、DX、SP等,用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。
  3. 暂存寄存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容。
  4. 累加寄存器:它是一个通用寄存器,用于暂时存放ALU运算的结果信息,用于实现加法运算。
  5. 程序状态字寄存器:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成。
  6. 移位器:对运算结果进行移位运算。
  7. 计数器:控制乘除运算的操作步数。

5.1.2.2 控制器

控制器由以下这些部分组成

  1. 程序计数器:用于指出下一条指令在主存中的存放地址。CPU就是根据PC的内容去主存中取指令的。因程序中指令(通常)是顺序执行的,所以PC有自增功能。
  2. 指令寄存器:用于保存当前正在执行的那条指令。
  3. 指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号。
  4. 微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
  5. 时序系统:用于产生各种时序信号,它们都是由统一时钟(CLOCK)分频得到。
  6. 存储器地址寄存器:用于存放所要访问的主存单元的地址。
  7. 存储器数据寄存器:用于存放向主存写入的信息或从主存中读出的信息。

对用户可见的寄存器有PSW,程序寄存器PC,ACC,各种通用寄存器等

对用户不可见的寄存器有移位寄存器,暂存寄存器,OP,Ad,IR,存储器地址寄存器MAR,存储器数据寄存器MDR等

5.2 指令执行过程

指令周期:CPU从主存中取出并执行一条指令的时间称为指令周期。指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期,它是CPU操作的最基本单位)。

机器周期.png

一个完整的指令周期应该包括取址、间址、执行和中断四个周期,为了区别不同的工作周期,可以设置四个标志触发器FE,IND,EX和INT来代表哪个周期是有效的,各个周期的数据流向如下

  • 取址周期
    1. 当前指令地址送至存储器地址寄存器,记做:(PC) → MAR
    2. CU发出控制信号,经控制总线传到主存,这里是读信号,记做:1 → R
    3. 将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR) → MDR
    4. 将MDR中的内容(此时是指令)送入IR,记做:(MDR) → IR
    5. CU发出控制信号,形成下一条指令地址,记做:(PC)+1 → PC
  • 间址周期
    1. 将指令的地址码送入MAR,记做:Ad(IR) → MAR或Ad(MDR) → MAR
    2. CU发出控制信号,启动主存做读操作,记做:1 → R
    3. 将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR) → MDR
    4. 将有效地址送至指令的地址码字段,记做:(MDR)→ Ad(IR)
  • 执行周期:执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。
  • 中断周期
    1. CU控制将SP减1,修改后的地址送入MAR,记做:(SP)-1 → SP,(SP) → MAR
    2. CU发出控制信号,启动主存做写操作,记做:1 → W
    3. 将断点(PC内容) 送入MDR,记做:(PC) → MDR
    4. CU控制将中断服务程序的入口地址(由向量地址形成部件产生)送入PC,记做:向量地址→ PC

中断:暂停当前任务去完成其他任务。为了能够恢复当前任务,需要保存断点。一般使用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针,后存入数据。

一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。

  1. 单指令周期:对所有指令都选用相同的执行时间来完成。指令之间串行执行;指令周期取决于执行时间最长的指令的执行时间。对于那些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的运行速度。
  2. 多指令周期:对不同类型的指令选用不同的执行步骤来完成。指令之间串行执行;可选用不同个数的时钟周期来完成不同指令的执行过程。需要更复杂的硬件设计。
  3. 流水线方案:在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。指令之间并行执行。

5.3 数据通路的功能和基本结构

数据通路:数据在功能部件之间传送的路径。

  1. CPU内部单总线模式:将所有寄存器的输入端和输出端都连接到一条公共通路上,这种结构比较简单,但数据传输存在较多的冲突现象,性能较低。连接各部件的总线只有一条时,称为单总线结构;CPU中有两条或更多的总线时,构成双总线结构或多总线结构。

内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线;

系统总线是指同一台计算机系统的各部件,如CPU、内存、通道和各类I/O接口间互相连接的总线。

CPU内部单总线方式.png
  • 寄存器之间数据传送

    • 比如把PC内容送至MAR,实现传送操作的流程及控制信号为:
    • (PC)→Bus PCout有效,PC内容送总线
    • Bus→MAR MARin有效,总线内容送MAR
  • 主存与CPU之间的数据传送

    • 比如CPU从主存读取指令,实现传送操作的流程及控制信号为:
    • (PC)→Bus→MAR PCout和MARin有效,现行指令地址→MAR
    • 1→R CU发读命令(通过控制总线发出,图中未画出)
    • MEM(MAR)→MDR MDRin有效
    • MDR→Bus→IR MDRout和IRin有效,现行指令→IR
  • 执行算术或逻辑运算

    • 比如一条加法指令,微操作序列及控制信号为:
    • Ad(IR)→Bus→MAR MDRout和MARin有效
    • 1→R CU发读命令
    • MEM(MAR)→数据线→MDR MDRin有效
    • MDR→Bus→Y MDRout和Yin有效,操作数→Y
  1. CPU内部三总线方式

  2. 专用数据通路方式:根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能较高,但硬件量大。

5.4 控制器的功能和工作原理

5.4.1 硬布线控制器的设计

根据指令操作码、目前的机器周期、节拍信号、机器状态条件,即可确定现在这个节拍下应该发出哪些“微命令”

微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生

硬布线控制器.png

每个输出的控制信号对应一个微命令,也就是对应一个微操作

如:要让C1对应微操作(PC)->MAR,则将其接到PCout、MARin即可

设计步骤:

  1. 分析每个阶段的微操作序列(取值、间址、执行、中断四个阶段)
  • 取指周期(所有指令都一样)

PC→MAR
1 →R
M ( MAR ) →MDR
MDR →IR
OP ( IR ) →ID
( PC ) + 1→PC

  • 间址周期(所有指令都一样)

Ad(IR) →MAR
1→R
M ( MAR )→MDR
MDR→Ad(IR)

  • 执行周期(各不相同)

CLA(ACC清零)
COM(ACC取反)
SHR(算术右移)
CSL(循环左移)
STP(停机)
ADD X(加法指令)
STA X(存数指令)
LDA X(取数指令,把X所指内容取到ACC)
JMP X(无条件转移)
BAN X(条件转移,当ACC为负时转移)

安排微操作时序的原则:

  • 微操作的先后顺序不得随意更改
  • 被控对象不同的微操作尽量安排在一个节拍内完成
  • 占用时间较短的微操作尽量安排在一个节拍内完成并允许有先后顺序
  1. 选择CPU的控制方式(采用定长机器周期还是不定长机器周期?每个机器周期安排几个节拍?)

  2. 安排微操作时序(如何用3个节拍完成整个机器周期内的所有微操作?)

微操作信号.png
  1. 电路设计(确定每个微操作命令的逻辑表达式,并用电路实现)

硬布线控制器一般用于RISC(精简指令集系统)

此扩充指令较困难,执行速度很快.

5.4.2 微程序控制器

5.4.2.1 微程序控制器的基本概念

微程序:一个微程序由微指令序列组成,每一种指令对应一个微程序

微命令:在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为微命令

微指令:微指令是若干微命令的集合,一条微指令通常包括

  • 操作控制字段,用于产生某一步操作所需的各个操作控制信号。
  • 顺序控制字段,用于控制产生下一条要执行的微指令地址

微命令与微操作一一对应
微指令中可能包含多个微命令

5.4.2.2 微程序控制器的基本结构

  • 控制存储器CM:用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成。
  • 微指令寄存器CMDR:用于存放从CM中取出的微指令,它的位数同微指令字长相等。
  • 微地址形成部件:产生初始微地址和后继微地址,以保证微指令的连续执行。
  • 微地址寄存器CMAR:微地址寄存器,接收微地址形成部件送来的微地址,为在CM中读取微指令作准备。
  • 地址译码:将地址码转化为存储单元控制信号。
微程序控制器的基本结构.png

5.4.2.3 微程序控制器的工作原理

指令周期=取值周器→间址周期→执行周期→中断周期。其中间址、中断周期可有可无

处理取指周期、间址周期、中断周期的微指令序列通常是公用的。执行周期的微指令序列各不相同

取指周期的微指令序列固定从#0开始存放。执行周期的微指令序列的存放根据指令操作码确定

微程序控制器的工作原理.png

取指周期微程序通常是公用的,故如果某指令系统中有n条机器指令,则CM中微程序的个数至少是n+1个

一些早期的CPU、物联网设备的CPU可以不提供间接寻址和中断功能,因此这类CPU可以不包含间址周期、中断周期的微程序段

物理上,取指周期、执行周期看起来像是两个微程序,但逻辑上应该把它们看作一个整体。因此,“一条指令对应一个微程序”的说法是正确的

5.4.2.4 微指令的格式

  1. 水平型微指令:一条微指令能定义多个可并行的微命令。

优点:微程序短,执行速度快;
缺点:微指令长,编写微程序较麻烦。

  1. 垂直型微指令:一条微指令只能定义一个微命令,由微操作码字段规定具体功能

优点:微指令短、简单、规整,便于编写微程序;
缺点:微程序长,执行速度慢,工作效率低。

  1. 混合型微指令:在垂直型的基础上增加一些不太复杂的并行操作。

微指令较短,仍便于编写;微程序也不长,执行速度加快。

微指令的格式.png

5.4.2.5 微指令的编码方式

  1. 直接编码(直接控制)方式

在微指令的操作控制字段中,每一位代表一个微操作命令,某位为“1”表示该控制信号有效

优点:简单、直观,执行速度快,操作并行性好。

缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存容量极大。

  1. 字段直接编码方式

将微指令的控制字段分成若干“段”,每段经译码后发出控制信号

微命令字段分段的原则:

  • 互斥性微命令分在同一段内,相容性微命令分在不同段内。

  • 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间。

  • 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作。

【2012年真题】某计算机的控制器采用微程序控制方式,微指令中的操作控制字段采用字段直接编码法,共有33个微命令,构成5个互斥类,分别包含7、3、12、5和6个微命令,则操作控制字段至少有多少位?

第1个互斥类有7个微命令,要留出1个状态表示不操作,所以需要表示8种不同的状态,故需要3个二进制位。
以此类推,后面4个互斥类各需要表示4、13、6、7种不同的状态,分别对应2、4、3、3个二进制位。

故操作控制字段的总位数为3+2+4+3+3 = 15 位

  1. 字段间接编码方式

一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码,又称隐式编码。

优点:可进一步缩短微指令字长。

缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段。

5.4.2.6 微指令的地址形成方式

  1. 微指令的下地址字段指出

微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称为断定方式。

  1. 根据机器指令的操作码形成

当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。

  1. 增量计数器法

( CMAR ) + 1 → CMAR

  1. 分支转移

转移方式:指明判别条件;转移地址:指明转移成功后的去向。

  1. 通过测试网络
  2. 由硬件产生微程序入口地址

第一条微指令地址由专门硬件产生(用专门的硬件记录取指周期微程序首地址)

中断周期由硬件产生中断周期微程序首地址(用专门的硬件记录)

【2014年真题】某计算机采用微程序控制器,共有32条指令,公共的取指令微程序包含2条微指令,各指令对应的微程序平均由4条微指令组成,采用断定法(下地址字段法)确定下条微指令地址,则微指令中下地址字段的位数至少是多少位?

总共需要存储多少条微指令?

32×4+2 = 130条

标注出130个不同的位置至少需要多少个二进制位?

27= 128,28 = 256

下地址字段的位数至少是8位

5.4.2.7 微程序控制单元的设计步骤

设计步骤:

  1. 分析每个阶段的微操作序列(参照硬布线)

  2. 写出对应机器指令的微操作命令及节拍安排

(1) 写出每个周期所需要的微操作(参照硬布线)

(2)补充微程序控制器特有的微操作:

  • a. 取指周期:
    Ad ( CMDR ) → CMAR
    OP ( IR ) → 微地址形成部件→ CMAR

  • b. 执行周期:

    Ad(CMDR)→ CMAR

取指周期的最后一条微指令完成后,要根据指令操作码确定其执行周期的微程序首地址

  1. 确定微指令格式

根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数。最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长。

  1. 编写微指令码点

根据操作控制字段每一位代表的微操作命令,编写每一条微指令的码点。

硬布线与微程序的比较.png

5.5 指令流水线

5.5.1 指令流水线的基本概念

一条指令的执行过程可以分为如下三个过程

  • 取指:根据PC内容访问主存储器,取出一条指令送到IR中。
  • 分析:对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。
  • 执行:根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中。

当多条指令在处理器中执行时,可以采用以下两种方式

  1. 顺序执行方式

传统冯·诺依曼机采用顺序执行方式,又称串行执行方式。前一条指令完后,才启动下一条指令

顺序执行方式.png

优点:控制简单,硬件代价小。

缺点:执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。

总耗时T = n×3t = 3nt

  1. 流水线执行方式

为了提高指令的执行速度,可以把取k+1条指令提前到分析第k条指令的期间完成,而将分析第k+1条指令与执行第k条指令同时进行

流水线执行方式.png

优点:程序的执行时间缩短了1/3,各功能部件的利用率明显提高。

缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了。

5.5.2 流水线的表示方法

  1. 指令执行过程图,如上小节提到的图
  2. 时空图
时空图.png

指令执行过程图主要用于分析指令执行过程以及影响流水线的因素

时空图主要用于分析流水线的性能

5.5.3 流水线的性能指标

  1. 吞吐率

吞吐率是指在单位时间内流水线所完成的任务数量,或是输出结果的数量。

设任务数为n;处理完成n个任务所用的时间为Tk,则吞吐率(TP)计算公式为
TP=\frac{n}{T_k}
当各段执行时间均相等、任务连续的理想情况下,设\triangle t为时钟周期,流水线的实际吞吐率为
TP=\frac{n}{(k+n-1)\triangle t }
连续输入的任务数趋向于∞时,最大吞吐率TP_{max}=1/\triangle t

流水线的时空图.png
  1. 加速比

加速比定义为完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。

设T0表示不使用流水线时的执行时间,即顺序执行所用的时间;Tk表示使用流水线时的执行时间则计算流水线加速比(S)的基本公式为
S=\frac{T_0}{T_k}
当各段执行时间均相等、任务连续的理想情况下,T_k=(k+n-1)\triangle t,而不使用流水线,所需时间T_0=kn\triangle t,实际加速比为
S=\frac{kn\triangle t}{(k+n-1)\triangle t}=\frac{kn}{k+n-1}
连续输入的任务数趋向于∞时,S_{max}=k

  1. 效率

流水线的设备利用率称为流水线的效率(E)。在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积与n个任务所用的时间与k个流水段所围成的时空区总面积之比。
E=\frac{n个任务占用的时空区有效面积}{n个任务所用的实际与k个流水段所围成的时空区总面积}=\frac{T_0}{kT_k}
连续输入的任务数趋向于∞时,E_{max}=1

5.5.4 影响流水线的因素

  1. 结构相关(资源冲突)

由于多条指令在同一时刻争用同一资源而形成的冲突称为结构相关。

解决办法:

  • 后一相关指令暂停一周期
  • 资源重复配置:数据存储器+指令存储器
  1. 数据相关(数据冲突)

数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关

解决办法:

  • 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。可分为硬件阻塞(stall)和软件插入“NOP”两种方法。
  • 数据旁路技术。
  • 编译优化:通过编译器调整指令顺序来解决数据相关。
  1. 控制相关(控制冲突)

当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关。

解决办法:

  • 尽早判别转移是否发生,尽早生成转移目标地址
  • 预取转移成功和不成功两个控制流方向上的目标指令
  • 加快和提前形成条件码
  • 提高转移方向的猜准率

5.5.5 流水线的分类

  1. 部件功能级、处理机级和处理机间级流水线

根据流水线使用的级别的不同,流水线可分为部件功能级流水线、处理机级流水线和处理机间流水线。

部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶差、对阶、尾数相加以及结果规格化等4个子过程。

处理机级流水是把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回5个子过程。

处理机间流水是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放在与下一个处理机所共享的存储器中。

  1. 单功能流水线和多功能流水线

按流水线可以完成的功能,流水线可分为单功能流水线和多功能流水线。

单功能流水线指只能实现一种固定的专门功能的流水线;

多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。

  1. 动态流水线和静态流水线

按同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线。

静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。

动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。

  1. 线性流水线和非线性流水线

按流水线的各个功能段之间是否有反馈信号,流水线可分为线性流水线与非线性流水线。

线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。

非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。

5.5.6 流水线的多发技术

  1. 超标量技术

每个时钟周期内可并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件。

超标量计算机不能调整指令的执行顾序,因此通过编译优化技术,把可并行执行的指令搭配起来,挖掘更多的指令并行性

超标量技术.png
  1. 超流水技术

在一个时钟周期内再分段,在一个时钟周期内一个功能部件使用多次。不能调整指令的执行顺序,靠编译程序解决优化问题

超流水技术.png
  1. 超长指令字

由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件。

超长指令字.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容