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标志设置了.加快的执行速度.

关于浮点数:

 SignExponentFractionBias
Single Precision1 [31]8 [30-23]23 [22-00]127
Double Precision1 [63]11 [62-52]52 [51-00]1023

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

浮点数可表示的范围:

 DenormalizedNormalizedApproximate 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数

SignExponent (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个双精度浮点数.

插段广告

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

淘宝店面地址:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!关于学习数据结构的C语言笔记,我可以给你一些基本的指导和概念。数据结构是计算机科学中非常重要的一门课程,它涉及存储和组织数据的方法。C语言是一种常用的编程语言,很适合用于实现各种数据结构。 下面是一些数据结构的基本概念,你可以在学习笔记中包含它们: 1. 数组(Array):一种线性数据结构,可以存储相同类型的元素。在C语言中,数组是通过索引访问的。 2. 链表(Linked List):也是一种线性数据结构,但不需要连续的内存空间。链表由节点组成,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):一种后进先出(LIFO)的数据结构,类似于装满物品的箱子。在C语言中,可以使用数组或链表来实现栈。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,类似于排队等候的队伍。同样可以使用数组或链表来实现队列。 5. 树(Tree):一种非线性数据结构,由节点和边组成。每个节点可以有多个子节点。二叉树是一种特殊的树结构,每个节点最多有两个子节点。 6. 图(Graph):另一种非线性数据结构,由节点和边组成。图可以用来表示各种实际问题,如社交网络和地图。 这只是数据结构中的一些基本概念,还有其他更高级的数据结构,如堆、哈希表和二叉搜索树等。在学习笔记中,你可以介绍每个数据结构的定义、操作以及适合使用它们的场景。 希望这些信息对你有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值