AMD64 体系结构 学习笔记

关于Address-size

在64位模式下,默认使用,64位寻址空间,可以使用67H 的指令前缀, 重载为32位寻址空间, 64位模式下,不支持16位寻址空间.

关于Operand-size

64位模式下,默认使用32位操作数,使用REX前缀,重载为64为操作数.使用66H的前缀,重载为16位操作数. 一些使用到RSP的近跳转的指令(CALL,Jcc,JMP,LOOP,LOOPcc,PUSH,POP), 默认使用64位的操作数,不需要加上REX前缀.

关于Call:
1, 段内call(near call), 将rIP压入本进程的stack中.
2,段间call(far call, 同样的保护级), 将rIP,CS压入本进程的stack中.
3,切换保护级的call(far call,进入更高的保护.级), 从TSS中获得新的程序的stack指针, 将旧的ss.,rSP,保存到新的stack中,在兼容模式下,将指定数量的参数从旧的stack中复制到新的stack中.long mode下,没有这样的复制动作,个人认为在long mode下,没有代码段分段的概念.将CS, rIP压入新的stack中.

关于任务切换:
1,兼容模式下, 将当前的进程状态(各寄存器的值,页表地址等信息)保存到当前的进程TSS中. 将新的进程的状态信息从新进程的TSS中,载入到处理器.
2.Long mode不在支持硬件进程切换.

关于syscall & sysret:
使用传统的call, ret 处理器需要花费更多的操作,因为它是基于段的保护和特权检查. 它不仅仅在与段寄存器的重新载入引起的段描述符的载入的花费, 也需要时间对对保护, 类型和特权限制的检查.
These instructions eliminate segment-based privilege checking by using predetermined target and return code segments and stack segments. The operating system sets up and maintains the predetermined segments using special registers within the processor, so the segment descriptors do not need to be fetched from memory when the instructions are used. The simplifications made to privilege checking allow SYSCALL and SYSRET to complete in far fewer processor clock cycles than CALL and RET.

这段只能意会,不能言传,哈哈.基本上,操作系统使用CPU中的特殊处理,负责设置,维护将要用到的段.
SYSRET指令只能在CPL=0的程序中使用, CPL>0的应用程序不能使用,

SYSENTER & SYSEXIT , Long mode下不支持.

关于异常处理(exception):

分三种:

1,fault:  发生exception的边界是被中断的指令前, 当处理完exception的例程后,返回重新执行被中断的指令. 页异常(page exception)就是这种异常.

2,trap: 发生边界是指令执行后, 在异常服务程序运行之前,引起异常的程序已经完成. 软件中断和用于debug的断点异常就是这样的类型.

3,Abouts: 是一个模糊不精确的异常, 不能恢复被中断的程序继续运行.

Long mode下, Interrupt & exception 的跳转总要保存旧的进程的SS.rSP, 而从中断处理程序的TSS中载入新的SS,rSP.

Interrupt 返回: IRET, IRETD, and IRETQ 指令使CPU从中断处理程序返回.如果中断或者异常push了一个error code到stack种,在执行IRET前,中断处理程序必须 将其pop出.

关于cache:
cache管理是将整个cache分成多个block,称之为cache line, cache的填充和废弃,都是以cache line 为单位的.
cache的污染:
1, Temporal locality: 处理器假设最近访问过的内存,再很短时间内将被再次访问, 否则则认为cache被污染.
2.Spatial locality: 处理器假设相邻的内存,将再很短的时间内被访问, 否则则认为cache被污染.
3,stale data: 处理器假设很长时间没有被访问的内存,将短时间内不会被访问. 认为cache'被污染,

cache控制的指令:
1:PREFETCHlevel: 如果以无效的内存地址作为操作数执行此指令, 不会产生异常, 指令执行没有效果. 如果操作数所指定的内存地址是non-cacheable或者是writecombining 类型的memory,指令执行也没有效果.

2:PREFETCH: 以读的方式load data到cache, 写这个cache line会有额外的时间消耗用于改变cache line 的 modified标志.
3.PREFETCHW: 以写的方式load data到cache,load的时候就将cache line的modified标志设置了.加快的执行速度.

关于浮点数:

  Sign Exponent Fraction Bias
Single Precision 1 [31] 8 [30-23] 23 [22-00] 127
Double Precision 1 [63] 11 [62-52] 52 [51-00] 1023

浮点数的指数是以实际指数值加上Bias值,存储在存储位置的
因此实际的指数值=存储的指数值-Bias

浮点数可表示的范围:

  Denormalized Normalized Approximate Decimal
Single Precision ± 2 -149 to (1-2 -23)×2 -126 ± 2 -126 to (2-2 -23)×2 127 ± ~10 -44.85 to ~10 38.53
Double Precision ± 2 -1074 to (1-2 -52)×2 -1022 ± 2 -1022 to (2-2 -52)×2 1023 ± ~10 -323.3 to ~10

 根据规定的浮点数的范围和指数计算方法,可以得知,规格化的非零的浮点数的指数部分的值,为1到254,之间.

浮点数分为:
1,规格化浮点数:指数部分为1-254
2.非规格化浮点数: 指数部分为0,尾数非0的数
3,正负0:指数部分为0,尾数0的数
4,正负无穷:指数部分为255,尾数0的数
5.NaN, 不合法的浮点数.
   QNan: :指数部分为255,尾数第一个有效位为1的数
QNan: :指数部分为255,尾数第一个有效位为0的非0数

Sign Exponent (e) Fraction (f) Value
0 00..00 00..00 +0
0 00..00 00..01
:
11..11
Positive Denormalized Real
0.f × 2(-b+1)
0 00..01
:
11..10
XX..XX Positive Normalized Real
1.f × 2(e-b)
0 11..11 00..00 +Infinity
0 11..11 00..01
:
01..11
SNaN
0 11..11 10..00
:
11..11
QNaN
1 00..00 00..00 -0
1 00..00 00..01
:
11..11
Negative Denormalized Real
-0.f × 2(-b+1)
1 00..01
:
11..10
XX..XX Negative Normalized Real
-1.f × 2(e-b)
1 11..11 00..00 -Infinity
1 11..11 00..01
:
01..11
SNaN
1 11..11 10..00
:
11.11
QNaN

128位多媒体指令:

1. Move 系列指令

    MOVD: 内存,通用寄存器和XMM寄存器之间传递32位或者64位数据, 如果要传递64位数据,需要REX指令前缀.

                传递到XMM寄存器,将回0扩展其余的高位.

   MOVQ:  内存,通用寄存器和XMM寄存器之间传递64位数据,  传递到XMM寄存器,将回0扩展其余的高位.

   MOVDQA: 内存,XMM寄存器和XMM寄存器之间传递128位数据,如果和内存之间传递数据,则需要内存地址对齐.

  MOVDQU: 内存,XMM寄存器和XMM寄存器之间传递128位数据,如果和内存之间传递数据,不需要内存地址对齐.

 MOVDQ2Q: 将XMM寄存器中的低64位传递到MMX寄存器中.

  MOVQ2DQ: 将MMX寄存器中的数据传递到XMM寄存器的低64位,被0扩展到128位.

2, 使用Non-Temporal方式传递数据,可以减少cache的污染. 这些指令直接从内存中获取数据,而不通过cache

   MOVNTDQ,  MASKMOVDQU

  PMOVMSKB:  将XMM寄存器中的每个字节存到32位或者64位通用寄存器的低位,并且0扩展,

数据转换: 从XMM寄存器,内存中的整数转换成浮点数

  CVTDQ2PS:4个32位 有符号整数转换成4个单精度浮点数

   CVTDQ2PD:2个64位 有符号整数转换成2个双精度浮点数

  转换MMX寄存器或内存中中的整数为浮点数:

CVTPI2PS: 将2个DWORD宽度的整数转换为2个单精度浮点数到XMM的低64位,并且0扩展到128位

CVTPI2PD: 将2个DWORD宽度的整数转换为2个双精度浮点数.

插段广告

AMD64 体系结构 学习笔记_第1张图片

Linux文化T恤,淘宝销售,有兴趣的可以购买。

淘宝店面地址:

http://auction1.taobao.com/auction/item_detail-0db2-5ba9dd77b24e43b427e1d71d7b19a0d2.jhtml

你可能感兴趣的:(AMD64 体系结构 学习笔记)