【VIP专享】64位汇编语言简介

合集下载

汇编语言的编程艺术-概述说明以及解释

汇编语言的编程艺术-概述说明以及解释

汇编语言的编程艺术-概述说明以及解释1.引言1.1 概述概述汇编语言是一种低级机器语言的替代品,它使用符号指令来代替二进制指令,使程序员能够更加方便地编写和理解计算机程序。

汇编语言是计算机科学中的基础知识之一,它能够让程序员更深入地了解计算机的内部工作原理,并且具有很高的执行效率。

本文将全面介绍汇编语言的编程艺术。

首先,我们将简要介绍汇编语言的基本概念,包括汇编指令、寄存器、内存和堆栈等常用的概念。

然后,我们将探讨汇编语言的编程思想,包括算法设计、优化技巧和调试技巧等方面的内容。

最后,我们将介绍汇编语言的应用领域,展示汇编语言在操作系统、驱动程序和嵌入式系统等领域的重要作用。

本文的目的是帮助读者全面了解汇编语言的编程艺术,提高读者在汇编语言编程方面的技能。

我们将从基础知识入手,逐步深入,通过具体的案例和实践经验,带领读者掌握汇编语言的精髓,培养读者的编程思维和解决问题的能力。

在本文的结尾部分,我们将总结汇编语言的重要性,并提供一些学习汇编语言的方法和资源。

同时,我们也会展望一下汇编语言的未来发展,探讨它在新兴技术领域中的应用前景。

通过阅读本文,读者将深入了解汇编语言编程的核心思想和技术,掌握高效编写和调试汇编语言程序的方法,为进一步学习和应用汇编语言打下坚实的基础。

无论是从事底层编程开发的专业人士,还是对计算机科学感兴趣的学习者,本文都能为您提供有价值的知识和经验。

让我们一起踏上汇编语言编程之旅,探索这门古老而又充满魅力的编程艺术吧!1.2文章结构1.2 文章结构本文将按照以下结构展开对汇编语言的编程艺术进行论述:1. 介绍汇编语言的基本概念:本节将简要介绍汇编语言的定义、特点和基本原理。

包括汇编语言与高级语言的区别,以及为什么学习汇编语言对于程序员来说是很有必要的。

2. 探讨汇编语言的编程思想:本节将深入分析汇编语言的编程思想,包括低级别的计算机组成原理、寄存器的应用、内存访问、指令集和程序结构等。

汇编语言教程

汇编语言教程

汇编语言教程第一章:引言汇编语言是一种底层的编程语言,通常用于编写对计算机硬件直接操作的程序。

本教程将向你介绍汇编语言的基本概念和语法,帮助你快速入门汇编编程。

1.1 汇编语言的概念汇编语言是一种符号性的语言,它使用助记符和指令集来操纵计算机硬件。

每个汇编语言指令都会被翻译成对应的机器码指令,从而让计算机执行相应的操作。

1.2 为什么学习汇编语言学习汇编语言可以帮助你更深入地理解计算机的运行原理,提高编程技能,以及优化性能。

第二章:汇编语言的基本结构在本章中,我们将介绍汇编语言程序的基本结构,包括指令、寄存器、内存等。

2.1 指令汇编语言指令包括数据传送指令、算术指令、逻辑指令等,用于执行各种操作。

2.2 寄存器寄存器是用于存储数据和执行操作的临时存储器。

常见的寄存器包括通用寄存器、特殊寄存器等。

2.3 内存内存用来存储程序和数据,汇编程序通过内存地址来读写数据。

第三章:汇编语言编程实例在本章中,我们将通过一些实际的编程示例来演示如何使用汇编语言编写程序。

3.1 Hello World程序下面是一个简单的Hello World程序的汇编代码示例:section .datamsg db 'Hello, World!', 0x0Asection .textglobal _start_start:mov eax, 4mov ebx, 1mov ecx, msgmov edx, 13int 0x80mov eax, 1xor ebx, ebxint 0x803.2 计算两数之和下面是一个计算两个数之和的汇编代码示例:section .datanum1 dw 10num2 dw 20section .textglobal _start_start:mov ax, [num1]add ax, [num2]ret结语通过本教程,相信你已经对汇编语言有了初步的了解,并且能够编写一些简单的汇编程序。

汇编与高级语言

汇编与高级语言

汇编与高级语言现代计算机编程领域中,汇编语言和高级语言是两个重要的概念。

汇编语言是一种低级语言,与计算机硬件密切相关,而高级语言则是一种更抽象、更易于理解和使用的语言。

本文将介绍汇编语言和高级语言的特点、应用以及它们之间的关系。

一、汇编语言的特点和应用汇编语言是计算机中最靠近机器语言的一种编程语言,它采用助记符号来表示机器指令,可以直接操作计算机的硬件。

汇编语言的特点如下:1. 与硬件密切相关:汇编语言是基于计算机硬件架构而存在的,每种计算机架构都有对应的汇编语言。

2. 直接操作内存和寄存器:汇编语言允许程序员直接对计算机的内存和寄存器进行操作,可以实现对底层硬件的精准控制。

3. 非常高效:由于汇编语言直接操作硬件,因此执行效率非常高,适用于对性能要求较高的应用。

4. 学习曲线陡峭:相比高级语言,汇编语言更接近机器语言,学习和使用起来更为复杂和困难。

汇编语言主要应用于以下方面:1. 嵌入式系统开发:由于嵌入式设备对性能和资源的要求较高,汇编语言可以更精确地控制硬件资源,因此在嵌入式系统开发中得到广泛应用。

2. 驱动程序开发:操作系统和硬件设备的驱动程序通常需要直接操作硬件,因此使用汇编语言编写驱动程序更加高效和准确。

3. 优化算法实现:某些特定的算法实现需要对计算机的硬件进行细致的控制和优化,这时汇编语言可以发挥其优势,提升算法执行效率。

二、高级语言的特点和应用高级语言是一种更抽象和易于使用的编程语言,相对于汇编语言来说更加人性化和易于理解。

高级语言的特点如下:1. 独立于硬件:高级语言与具体的计算机架构无关,程序员可以在不同的硬件平台上编写和运行代码。

2. 面向问题解决:高级语言更加注重问题解决,提供了丰富的语法和数据结构,可以更直观地表达程序逻辑。

3. 开发效率高:相比汇编语言,高级语言的语法和编写方式更简洁,开发效率更高。

4. 可移植性强:高级语言编写的程序可以方便地在不同的操作系统和硬件平台上运行,具有较好的移植性。

汇编语言程序设计教程

汇编语言程序设计教程

汇编语言程序设计教程汇编语言是一种基于机器指令的低级语言,常用于嵌入式系统和底层编程。

学习汇编语言可以帮助理解计算机底层工作原理,并提高编程效率。

本篇文章将介绍汇编语言程序设计的基础知识和主要步骤。

一、汇编语言的特点汇编语言是一种直接操作计算机硬件的语言,其特点如下:1.与机器语言一一对应:每一条汇编指令对应一条机器指令,更接近计算机底层的执行方式。

2.语法简单:汇编语言的语法相对简单,只包含一些基本指令和寻址方式。

3.高度灵活:汇编语言可以直接访问计算机硬件和寄存器,灵活控制程序的执行流程。

4.高效性能:由于直接操作底层硬件,汇编语言编写的程序通常具有较高的执行效率。

二、汇编语言的基本组成1.汇编指令:汇编指令是汇编语言最基本的语句单元,用于实现具体的操作和控制流程。

2.伪指令:伪指令是用来对程序进行宏汇编定义和控制汇编程序的运行方式的命令。

3.伪操作码:伪操作码用来定义数据和存储空间,如定义变量和常量。

4.标号和标识符:标号用于标记程序中的位置,标识符用于定义变量和常量的名称。

5.注释:注释用于给程序增加解释说明,提高程序的可读性。

三、汇编语言程序设计的步骤1.确定程序的目标和功能:明确程序的需求和目标,确定所需的处理过程和数据结构。

2.设计算法:使用伪代码或流程图的形式描述程序的算法逻辑,包括输入、处理和输出过程。

3.选择合适的汇编指令和寻址方式:根据程序需求,选择适当的指令和寻址方式,确保程序能够正确实现算法逻辑。

4.编写程序源代码:根据算法和选定的指令,编写程序源代码,包括声明、定义变量、初始化和实现算法的具体指令。

5.进行编译和调试:使用汇编编译器将源代码转换为机器码,然后进行程序的调试和测试,确保程序能够正常运行。

6.优化性能和可读性:根据程序的需求和实际运行结果,进行性能优化和代码可读性的提高,提高程序的执行效率和可维护性。

四、汇编语言程序设计的示例下面是一个简单的汇编语言程序示例,实现了计算两个数之和的功能:```section .datanumber1 db 10 ;定义变量number1,并初始化为10number2 db 20 ;定义变量number2,并初始化为20sum db ? ;定义变量sum,用于存储两个数之和section .textglobal _start_start:;将number1和number2的值相加,并保存到sum中mov al, [number1]add al, [number2]mov [sum], al;结束程序mov eax, 1 ;1代表退出程序int 0x80 ;调用系统中断```以上示例通过使用mov和add指令来实现变量的赋值和求和操作。

汇编基础教程

汇编基础教程

汇编基础教程汇编语言是一种低级计算机语言,它能够直接操作计算机硬件并进行编程。

在计算机领域中,掌握汇编语言是非常重要的基础知识。

本教程将带您逐步学习汇编语言的基础知识,从而帮助您更好地理解计算机的工作原理并进行底层编程。

一、汇编语言的概述汇编语言是一种近似于机器语言的计算机语言,它通过使用助记符来代表机器指令,以便于程序员编写和理解。

汇编语言相对于机器语言而言,更容易阅读和编写,但仍然需要了解底层硬件结构和指令集架构。

二、汇编语言的基本结构1. 数据段:用于定义程序中所使用的数据,并分配内存空间。

2. 代码段:用于存放实际的汇编指令,控制程序的执行流程。

3. 堆栈段:用于存放函数调用、参数传递和局部变量等信息。

4. 其他段:可根据需要定义其他段,如常量段、字符串段等。

三、汇编语言的数据类型和寻址方式1. 数据类型:汇编语言支持的数据类型包括字节(BYTE)、字(WORD)和双字(DWORD)等。

2. 寻址方式:汇编语言提供多种寻址方式,包括直接寻址、寄存器间接寻址、基址变址寻址和相对寻址等。

四、汇编语言的指令集和常用指令1. 汇编语言的指令集包括数据传输指令、算术运算指令、逻辑运算指令、比较指令和跳转指令等。

2. 常用指令示例:- MOV指令:用于将一个数据从源操作数移动到目的操作数。

- ADD指令:用于将两个数据相加,并将结果存储到目的操作数中。

- SUB指令:用于将目的操作数减去源操作数,并将结果存储到目的操作数中。

- JMP指令:用于无条件跳转到指定的地址。

- CMP指令:用于比较两个数据的大小,并设置相应的条件码。

五、汇编语言的程序结构与流程控制1. 程序结构:一个汇编程序包括初始化、输入、处理和输出等模块。

2. 流程控制:汇编语言提供分支和循环结构来实现程序的流程控制,如条件判断和循环执行等。

六、汇编语言的调试和优化1. 调试:汇编语言程序的调试可以通过单步执行、断点设置和寄存器监视等方式进行。

经典汇编语言教程

经典汇编语言教程

经典汇编语言教程一、汇编语言概述汇编语言是一种低级语言,它直接操作计算机的硬件资源。

本节将介绍汇编语言的定义、特点以及与高级语言的对比。

二、汇编语言的基本语法在本节中,我们将介绍汇编语言的基本语法规则,包括数据类型、变量定义、标号等。

同时还会介绍一些常用的指令和寻址方式。

三、汇编语言的数据处理指令本节将详细介绍汇编语言中的数据处理指令,包括算术运算、逻辑运算、移位操作等。

同时还会介绍如何使用寄存器和内存进行数据处理。

四、汇编语言的程序控制指令在这一节中,我们将介绍汇编语言中的程序控制指令,包括条件跳转、循环控制、函数调用等。

同时还会介绍一些常用的标志位和标志位操作指令。

五、汇编语言的输入输出操作本节将介绍汇编语言中的输入输出操作,包括键盘输入、屏幕输出、文件读写等。

同时还会介绍一些常用的输入输出指令和中断处理。

六、汇编语言的调试技巧在这一节中,我们将介绍汇编语言的调试技巧,包括使用调试器、查看寄存器和内存、设置断点等。

同时还会介绍一些常见错误和调试方法。

七、汇编语言的优化技巧本节将介绍汇编语言的优化技巧,包括减少指令数量、提高指令执行速度、优化内存使用等。

同时还会介绍一些常用的优化方法和工具。

八、汇编语言的应用实例在这一节中,我们将通过一些实际的应用实例来演示汇编语言的使用,包括计算器、游戏、操作系统等。

同时还会介绍一些常见的应用开发技巧和注意事项。

九、汇编语言的扩展知识本节将介绍汇编语言的一些扩展知识,包括汇编语言在嵌入式系统中的应用、汇编语言与其他编程语言的结合等。

同时还会介绍一些相关的学习资源和进一步的学习建议。

十、汇编语言的发展趋势在这一节中,我们将探讨汇编语言的发展趋势,包括新的指令集、新的开发工具、新的应用领域等。

同时还会介绍一些相关的研究方向和前沿技术。

总结:汇编语言作为一种低级语言,不仅能够直接操作计算机的硬件资源,还能够提供更高的执行效率和更灵活的控制能力。

通过学习汇编语言,我们可以更深入地了解计算机的底层原理,提高程序的性能和可靠性。

课件汇编语言程序设计

课件汇编语言程序设计

汇编语言的应用领域
系统软件
汇编语言在系统软件领域的应用 非常广泛,如操作系统、设备驱
动程序等底层软件的编写。
游戏开发
在游戏开发中,汇编语言主要 用于实现游戏引擎和底层图形 渲染等关键技术。
嵌入式系统
在嵌入式系统中,由于硬件资源 有限,汇编语言常常被用于实现 系统内核和关键模块的优化。
安全领域
由于汇编语言的底层特性,它在 安全领域中也有着广泛的应用,
段的大小和起始地址可以 通过汇编指令进行定义和 修改。
ABCD
段是内存中连续的内存单 元的集合,通常用于存储 程序代码、数据等。
内存单元的访问通常通过 偏移量来实现,偏移量指 定了从段起始地址开始的 相对地址。
寻址模式
寻址模式是指确定如何访问内存单元或寄存器 中的数据的方式。
常见的寻址模式有直接寻址、间接寻址、基址 寻址、变址寻址等。
高效性
由于汇编语言与机器指令一一对应,因此其执行效率非常 高。
面向机器
汇编语言直接与计算机硬件打交道,因此其程序的可移植 性较差。
语言简洁
汇编语言的指令集较少,语法简单,易于学习和掌握。
汇编语言的历史和发展
01
早期的汇编语言
随着计算机的诞生和发展,人们开始使用汇编语言进行程序设计。早期
的汇编语言比较简单,主要用于编写操作系统和编译器等底层软件。
02
C语言可以通过调用汇编语言 编写的函数来实现与汇编语言 的交互。
03
C语言中的某些关键字和运算 符可以与汇编语言进行交互, 例如asm关键字和volatile关键 字。
Java语言与汇编语言的接口
01
Java虚拟机(JVM)可以解释和执行汇编语言编写 的代码。

汇编语言程序设计

汇编语言程序设计

汇编语⾔程序设计汇编语⾔程序设计课程介绍1.属于低级语⾔的程序设计2.硬件类课程和操作系统先⾏课3.软件开发的⼀个组成部分(加密解密、逆向⼯程、有害代码的分析防治)4.⾼级语⾔程序设计的扩展(硬件资源的管理、驱动等)5.对计算机专业:专业基础课、必修课第⼀章汇编语⾔基础知识§1.1计算机语⾔基本概念⼀、机器语⾔:(0、1代码)1.机器指令:是指挥计算机完成某⼀基本操作的命令,是由硬件电路设计决定的,也叫硬指令。

由操作码和地址码组成。

2.指令系统:每台计算机所特有的、全部指令的集合构成该CPU的指令系统。

3.机器语⾔程序:机器指令的集合构成了机器语⾔,⽤机器语⾔编写的程序就是机器语⾔程序。

4.特点:计算机能直接识别,执⾏速度快,但难于记忆、识别和编写。

⼆、汇编语⾔:1.汇编指令:⽤便于记忆、并能描述指令功能的符号表⽰的机器指令。

2.汇编程序:就是把汇编语⾔源程序翻译成机器语⾔程序的⼀种系统软件。

3.汇编语⾔:汇编指令、伪指令、宏指令和汇编程序⼀起组成了汇编语⾔。

4.特点:汇编指令与机器指令⼀⼀对应,相对机器语⾔易于理解、掌握。

汇编语⾔直接⾯向机器,⽤汇编语⾔编制的程序简洁、快速。

三、⾼级语⾔:1.⾼级语⾔:机器语⾔和汇编语⾔以外的程序设计语⾔统称⾼级语⾔。

2.特点:其特点是更加接近⾃然语⾔和惯⽤的数学表达形式,与计算机硬件结构⽆关,因⽽便于使⽤,便于交流和推⼴。

⾼级语⾔编程效率⾼,但运⾏效率低。

3.⾼级语⾔需要使⽤编译程序和解释程序将源程序翻译成机器语⾔程序,然后交计算机执⾏。

§1.2数据表⽰与运算⼀、位计数制:1.位权表⽰法:每位的位权与该位的数值相乘后相加得到该数的数值。

2.⼗进制:逢⼗进⼀,⽤0、1、2、3、4、5、6、7、8、9⼗个数码表⽰。

(D)⼆进制:逢⼆进⼀,⽤0、1两个数码表⽰。

(B)⼋进制:逢⼋进⼀,⽤0、1、2、3、4、5、6、7⼋个数码表⽰。

(Q)⼗六进制:逢⼗六进⼀,⽤0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F⼗六个数码表⽰。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

x86-64位汇编语言简介一、x86-64的寄存器x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是:rax,rbx,rcx,rdx,rsi,rdi,rsp,rbpr8,r9,r10,r11,r12,r13,r14,r15同时,x86-64全面支持x86-32和x86-16的通用寄存器:eax,ax,al,ah,ebx,bx,bl,bh,....而且,还对传统的edi,esi做了改进:edi ,32位di,16位dil ,8位,在传统的x86机器中,di是不可按照8位来访问的,但在x86-64下可以。

同样esi也可以按照8位来访问。

一个很特别的寄存器rip,相当于x86-32的eip. 在x86-32是不可直接访问的,如mov eax,eip是错的,但在x86-64位下却可以,如mov,rax,qword ptr [rip+100]是对的。

而且,它除了是个程序计数器外,也是个“数据基地址”,有此可见,它现在是身兼两职!为什么在x86-64位下要用rip做访问数据的基地址呢?因为,在x86-64下,DS,ES,CS,SS都没有实际意义了,也就是说,它们不再参与地址计算,只是为了兼容x86-32。

FS,GS还是参与地址计算,它们两个和x86-32的意义相同。

二、x86-64的汇编x86-64的汇编和x86-32的没有多大的区别。

添加了新寄存器和指令。

写64位汇编代码时,可以用8、16、32、64位寄存器,如:push rdisub rsp, 48 ;mov r10, rcx; Line 36mov rdi, rdxxor eax, eaxmov ecx, 512rep stosb; Line 43movsxd r8, DWORD PTR [r10+16]mov QWORD PTR [rsp+32], rdxmov r9, QWORD PTR [r10+648]mov rdx, QWORD PTR [r10+52]mov rcx, QWORD PTR [r10+44]call fs_read_disk; Line 47mov ecx, 1cmp eax, ecxcmovne ecx, eaxmov eax, ecx; Line 52add rsp, 48pop rdiret 0再如:$L1818:; Line 2398mov al, BYTE PTR [rdx+rbx]cmp al, 32jne SHORT $L1819mov BYTE PTR [rdx+rbx], 0$L1819:add r8d, 1movsxd rdx, r8dxor eax, eaxmov rcx, r12mov rdi, rbxrepne scasbnot rcxsub rcx, 1cmp rdx, rcxjb SHORT $L1818但,有点值得注意,当操作传统的32位寄存器时,那么,整个64位寄存器都会受到影响,如:mov eax,0ah那么,rax也等于000000000000000ah再如:mov rcx,0aaaaaaaaaaaaaaaah(此时ecx等于0aaaaaaaah)mov ecx,0ddddddddh(此时,rcx等于00000000ddddddddh,高32位受到了影响).规则:Example 1: 64-bit Add:Before:RAX =0002_0001_8000_2201RBX =0002_0002_0123_3301ADD RBX,RAX ;48 is a REX prefix for size.Result:RBX = 0004_0003_8123_5502Example 2: 32-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD EBX,EAX ;32-bit addResult:RBX = 0000_0000_8123_5502(32-bit result is zero extended)Example 3: 16-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BX,AX ;66 is 16-bit size overrideResult:RBX = 0002_0002_0123_5502(bits 63:16 are preserved)Example 4: 8-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BL,AL ;8-bit addResult:RBX = 0002_0002_0123_3302(bits 63:08 are preserved)三、指令集变化小结:当然,这里说的都是最基本的东西,是针对通用寄存器言的。

其实,x86-64对FPU(数学处理单元)和MMX,SSE,SSE2都做了很大的改进。

然而,对写OS来说,我们最关心的还是通用寄存器1.地址宽度和操作数宽度前缀64位模式中,缺省的地址宽度是64位,缺省的操作数宽度是32位。

地址宽度和操作数宽度前缀允许32位和64位数据和地址在指令序列中混用。

下表(1-7)显示了在IA-32e模式下需要指令前缀地址宽度。

注意,在64位模式下不支持16位地址。

在敬爱内容和传统模式下,地址宽度函数的功能和在IA-32传动架构中一样。

下表(1-8)显示了66H指令前缀和REX.W前缀的有效组合来指定IA-32e操作模式下的操作数宽度问题。

在64位模式下,缺省的操作数宽度是32位,REX前缀包括4位域来指定16个不同的值。

REX前缀的W位域指定为REX.W。

REX.W=1时前缀表明操作数位64为操作数。

注意,软件依然能使用操作数宽度66H前缀来切换到16位操作宽度。

然而如果同时用REX.W和66H前缀,REX.W的优先权要高。

在SSE/SSE2/SSE3 SIMD指令的情况下,66H, F2H和F3H前缀作为操作码扩展,并被认为是指令的一部分。

在这些情况下,有效的REX.W前缀和66H代码扩展前缀之间没有相互关系。

2.REX前缀REX前缀是64位模式下引入的新的指令前缀字节,他作以下工作:•指定新的GPRs和SSE寄存器•指定64位代码宽度•指定扩展的控制寄存器(只给系统软件使用)不是所有的指令都需要REX前缀。

这个前缀只在指令引用扩展的寄存器或使用64位操作数的时候才有必要。

如果该前缀放在不需要的地方将会被忽略。

一个指令只能有一个REX前缀。

这个前缀一旦使用,就必须直接放在操作码字节或两字节操作码扩展前缀之前。

其他位置的REX前缀将被忽略。

包含有REX前缀的指令依然要遵循传统的15字节的指令宽度的限制。

下图描述了REX 前缀如何符合指令的字节次序的。

3.控制和调试寄存器的新编码在64位模式下,有为控制机存器和调试寄存器指定的附加的编码。

当ModRM寄存器的域编码一个控制或调试寄存器的时候,REX.R位被用来修改这些域。

这些编码允许处理器访问CR8-CR15和DR8-DR15。

在64位模式中附加了一个控制寄存器(CR8)。

CR8成为任务优先级寄存器(TPR)。

在IA-32e技术的首次实现的时候,CR9-CR15和DR8-DR15都没有实现,对它们的访问将引起无效代码异常(#UD)。

4.新的指令下面的新指令在带有64位扩展的64位模式下被引入。

•SWAPGS 指令•SYSCALL and SYSRET 指令•CDQE 指令•CMPSQ 指令•CMPXCHG16B 指令•LODSQ 指令•MOVSQ 指令•MOVZX(64-bits) 指令•STOSQ 指令5.堆栈指针在64位模式,堆栈指针为64位。

堆栈大小不是像兼容模式或传统模式中那样靠SS段描述符中的某位来控制,也不通过指令前缀来指示。

对隐式堆栈引用将忽略地址大小的指示。

除远分支以外,所有隐式引用RSP的指令在64位模式下缺省为64位操作数。

影响到的指令包括:PUSH, POP, PUSHF, POPF, ENTER, 和LEAVE。

使用这些指令在64位模式下将不可能产生32位堆栈值的压栈和退栈。

如果使用66H操作数前缀,将支持16位的压栈和退栈。

当寄存器RAX-RSP被用作操作数的时候,64位模式缺省的操作尺寸无需REX前缀作为这些指令的先导。

如果式R8-R15作为操作数,则REX依然是需要的。

这是因为前缀在访问新扩展寄存器中是需要的。

6.分支转移64位扩展技术扩充2个分支机制来适应64位线性地址空间的分支。

他们是:•64位模式下近分支转移被重新定义•在64位模式和兼容模式下,64位调用门描述符定义成远调用64位模式下,所有近分支转移(CALL, RET, JCC, JCXZ, JMP 和LOOP)被强迫为64位。

这些指令被更新为提供64位的RIP值而无需REX前缀。

下面的近转移被有效的操作数宽度所控制:•指令指针的宽度的截断•由于CALL或RET引起的退栈压栈或退栈的大小•由于CALL或RET而引起的堆栈指针增加或减少的大小•间接转移操作数大小在64位模式下,以上的所有操作都被强制为64位而不管操作数前缀(操作数大小的前缀被忽略)。

然而相对转移的位移区域依然受到32位的限制;近转移的地址大小没有被强制为64位。

地址大小影响到JCXZ和LOOP中RCX的大小;他们也影响到内存间接转移的地址计算。

这样的地址缺省是64位,但是他们可以通过地址宽度前缀转换到32位宽度。

软件会用远转移来改变优先级。

传统IA-32结构提供调用门机制来允许软件去从一个优先级转到另一个优先级,尽管调用门也可以不改变优先级而只是做转移。

当调用门使用的时候,直接或间接的选择器指针会指向一个门描述符(指令重的便宜被忽略)目的代码段的偏移可以从调用门描述符中获得。

IA-32e模式重新定义了32位调用门描述符的类型值,使其成为64位调用门描述符,并扩展64位描述符使其能够容纳64位的偏移。

64位模式调用门描述符允许远转移访问有效的线性地址空间的任何地方。

这些调用门也控制代码段选择器(CS),允许转换到特权级和缺省尺寸并作为门转换的结果。

因为通常情况下是指定32位的,唯一在64位模式下指定完全64位绝对RIP的是间接分支转移,由于这个原因,直接远分支转移被从64位模式的指令集中删除了。

IA-32e模式扩充了SYSENTER和SYSEXIT指令的语义,以便他们操作在64位存储空间。

IA-32e也引入了两个新的指令:SYSCALL和SYSRET,他们只在64位模式有效。

相关文档
最新文档