版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言入门教程C语言编程网目录TOC\h\h汇编语言基本概念简介\h汇编语言是一种什么程序设计语言?\h汇编语言的应用(用途)\h虚拟机是什么?\h汇编语言的数据表示\h二进制(bit)整数\h二进制加法运算\h字节(byte)简介\h十六进制整数\h补码及进制转换\h二进制减法运算\h字符在计算机中是如何表示的?\h汇编语言布尔表达式(NOT、AND、OR)\hx86处理器架构\hCPU处理器架构和工作原理浅析\h32位x86处理器架构\h64位x86-64处理器架构\hx86计算机组件\h计算机I/O输入输出系统\h汇编语言基础\h第一个汇编语言程序\h汇编语言常量\h汇编语言保留字\h汇编语言标识符及其命名规则\h汇编语言伪指令\h汇编语言指令详解\h汇编语言整数加减法示例\h汇编器以及汇编流程\h汇编语言数据类型以及数据定义详解\h汇编语言等号=伪指令\h汇编语言计算数组和字符串长度\h汇编语言EQU伪指令\h汇编语言TEXTEQU伪指令\h汇编语言64位编程\h汇编语言数据相关的运算符、指令和算术运算\h汇编语言操作数类型\h汇编语言MOV指令:将源操作数复制到目的操作数\h汇编语言MOVZX和MOVSX指令\h汇编语言LAHF和SAHF指令\h汇编语言XCHG指令:交换两个操作数内容\h汇编语言直接偏移量操作数\h汇编语言数据传送示例\h汇编语言加法和减法详解\h汇编语言OFFSET运算符:返回数据标号的偏移量\h汇编语言ALIGN伪指令:对齐一个变量\h汇编语言PTR运算符:重写操作数的大小类型\h汇编语言TYPE运算符:返回变量的大小\h汇编语言LENGTHOF运算符:计算数组中元素的个数\h汇编语言LABEL伪指令\h汇编语言间接寻址\h汇编语言JMP和LOOP(转移)指令\h汇编语言64位MOV指令\h汇编语言64位加法和减法\h汇编语言过程\h汇编语言堆栈简介\h汇编语言运行时堆栈(内存数组)\h汇编语言PUSH和POP指令(压栈和出栈)\h汇编语言PROC和ENDP伪指令:定义一个过程\h汇编语言CALL和RET指令:调用一个过程\h汇编语言过程调用嵌套\h汇编语言示例:整数数组求和\h汇编语言USES运算符:保存和恢复寄存器\h汇编语言链接库简介\h汇编语言Irvine32链接库\h汇编语言Irvine32链接库过程详细说明\h汇编语言Irvine64链接库\h汇编语言条件判断\h汇编语言布尔和比较指令简介\h汇编语言AND指令:对两个操作数进行逻辑(按位)与操作\h汇编语言OR指令:对两个操作数进行逻辑(按位)或操作\h汇编语言位向量(位映射)\h汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作\h汇编语言NOT(反码)指令:翻转操作数的所有位\h汇编语言TEST指令:对两个操作数进行逻辑(按位)与操作\h汇编语言CMP(比较)指令:比较整数\h汇编语言置位和清除单个CPU标志位\h汇编语言64位模式下的布尔指令\h汇编语言条件跳转简介\h汇编语言条件跳转指令汇总\h汇编语言条件跳转应用及示例\h汇编语言LOOPZ(为零跳转)和LOOPE(相等跳转)指令\h汇编语言LOOPNZ(非零跳转)和LOOPNE(不等跳转)指令\h使用汇编语言实现IF语句\h使用汇编语言实现逻辑表达式\h使用汇编语言实现WHILE循环\h汇编语言表驱动选择\h有限状态机(FSM)与汇编语言[附带实例]\h汇编语言条件控制流伪指令\h汇编语言.IF、.ELSE、.ELSEIF、.ENDIF伪指令\h汇编语言用.REPEAT和.WHILE伪指令实现循环\h汇编语言整数运算\h汇编语言移位和循环移位指令简介\h汇编语言SHL(左移)指令:将操作数逻辑左移一位\h汇编语言SHR(右移)指令:将操作数逻辑右移一位\h汇编语言SAL(算术左移)和SAR(算术右移)指令:将操作数左/右移一位\h汇编语言ROL(循环左移)指令:将操作数所有位都向左移\h汇编语言ROR(循环右移)指令:将操作数所有位都向右移\h汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令\h汇编语言SHLD(双精度左移)和SHRD(双精度右移)指令\h汇编语言移位和循环移位的应用\h汇编语言MUL指令:无符号数乘法\h汇编语言IMUL指令:有符号数乘法\h汇编语言GetMseconds:测量程序执行时间\h汇编语言DIV指令:无符号除法\h汇编语言IDICV指令:有符号数除法\h使用汇编语言实现算术表达式[实例]\h汇编语言ADC指令:带进位加法\h汇编语言SBB指令:带借位减法\h汇编语言ASCII和非压缩十进制运算\h汇编语言AAA指令:调整ADD或ADC指令的二进制运算结果\h汇编语言AAS指令:减法后的ASXII调整\h汇编语言AAM(乘法后的ASCII调整)和AAD(除法之前的ASCII调整)指令\h汇编语言压缩十进制运算简介\h汇编语言DAA指令:加法后的十进制调整\h汇编语言DAS指令:减法后的十进制调整\h汇编语言高级过程\h汇编语言堆栈帧简介\h汇编语言寄存器参数的缺点\h汇编语言访问堆栈参数详解\h常用32位编程调用规范简介\h汇编语言局部变量应用\h汇编语言引用参数简介\h汇编语言LEA指令:返回间接操作数的地址\h汇编语言ENTER和LEAVE指令:创建和结束堆栈帧\h汇编语言LOCAL伪指令:声明一个或多个变量名\h汇编语言Microsoftx64调用规范简介\h汇编语言递归及应用详解[附带实例]\h汇编语言INVOKE伪指令:将参数入栈并调用过程\h汇编语言ADDR运算符:传递指针参数\h汇编语言PROC伪指令:过程定义\h汇编语言PROTO伪指令:指定程序的外部过程\h汇编语言过程参数简介\h汇编语言WriteStackFrame过程:显示当前过程堆栈帧的内容\h汇编语言多模块程序简述\h汇编语言EXTERN伪指令:调用外部过程\h汇编语言跨模块使用变量和标号\h汇编语言用Extern伪指令新建模块[附带实例]\h汇编语言用INVOKE和PROTO新建模块\h汇编语言使用USES运算符注意事项\h汇编语言向堆栈传递8位和16位参数\h汇编语言32位模式下传递64位参数\h汇编语言非双字局部变量\hJava虚拟机(JVM)工作原理\h汇编语言字符串和数组\h汇编语言字符串基本指令简介\h汇编语言MOVSB、MOVSW和MOVSD指令:将数据到EDI指向的内存\h汇编语言CMPSB、CMPSW和CMPSD指令:比较两个操作数\h汇编语言SCASB、SCASW和SCASD指令:在字符串或数组中寻找一个值\h汇编语言STOSB、STOSW和STOSD指令:把AL/AX/EAX的内容存储到EDI指向的内存单元中\h汇编语言LODSB、LODSW和LODSD指令:加载一个字节或字\h汇编语言Irvine32字符串过程详解[附带实例]\h汇编语言Irivne64字符串过程详解[附带实例]\h汇编语言二维数组简介\h汇编语言冒泡排序简述\h汇编语言对半查找(二分查找)简述\hJava如何字符串处理及常用方法\h汇编语言结构和宏\h汇编语言STRUCT和ENDS伪指令:定义结构\h汇编语言声明结构变量\h汇编语言TYPE和SIZEOF运算符:引用结构变量和结构名称\h汇编语言实例:显示系统时间\h汇编语言结构嵌套简述[附带实例]\h汇编语言联合(union)的声明和使用\h汇编语言宏过程(macroprocedure)简述\h汇编语言MACRO和ENDM伪指令:定义宏\h汇编语言宏的调用简述\h汇编语言宏的特性\h汇编语言Macro宏库详解\h汇编语言实例:封装器\h汇编语言条件汇编伪指令简述\h汇编语言IFB和IFNB伪指令:检查缺失的参数\h汇编语言宏默认值设定及布尔表达式简述\h汇编语言IF、ELSE和DENDIF伪指令\h汇编语言IFIDN和IFIDNI伪指令:对两个参数进行比较\h汇编语言实例:矩阵行求和\h汇编语言替换(>)、字符(!)、展开(%)运算符简述\h汇编语言宏函数\h汇编语言定使用WHILE、REPEAT、FOR和FORC伪指令定义重复语句块\h汇编语言MS-Windows编程\h汇编语言MS-Windows编程简述\h汇编语言Win32控制台函数简述\h汇编语言MessageBoxA函数:显示消息框\h汇编语言ReadConsole函数:读取文本输入并将其送入缓冲区\h汇编语言GetLastError和FormatMessage函数:获取错误信息\h汇编语言单字符输入简述\h汇编语言GetKeyState函数:获得键盘状态\h汇编语言WriteConsole和WriteConsoleOutputCharacter函数:控制台输出\h汇编语言CreateFile函数:创建新文件或者打开已有文件\h汇编语言CloseHandle函数:关闭一个打开的对象句柄\h汇编语言ReadFile函数:从输入文件中读取文本\h汇编语言WriteFile函数:向文件写入数据\h汇编语言SetFilePointer函数:移动打开文件的位置指针\h汇编语言Irvine32链接库文件I/O(输入/输出)\h汇编语言实例:文件I/O(输入/输出)过程\h汇编语言控制台窗口操作\h汇编语言控制台光标设置函数简述\h汇编语言SetConsoleTextAttribute和WriteConsoleOutputAttribute函数:控制文本颜色\h汇编语言Win32时间与日期函数\h汇编语言64位WindowsAPI使用简述\h汇编语言如何编写图形化的Windows应用程序\h汇编语言MessageBox函数:显示一个简单的消息框\h汇编语言WinMain过程:应用程序的启动过程\h汇编语言WinProc过程:接收并处理所有与窗口有关的事件消息\h汇编语言ErrorHandler过程:获取错误信息\h汇编语言实例:Windows图形化程序\h汇编语言动态内存分配(堆分配)\h汇编语言实例:动态内存分配\h汇编语言x86存储管理简述\h汇编语言线性地址简述\h汇编语言页转换:线性地址转换位物理地址\h浮点数处理与指令编码\h汇编语言IEEE二进制浮点数表示\h汇编语言阶码简介\h汇编语言规格化二进制浮点数\h汇编语言十进制小数转换为二进制实数\h汇编语言FPU寄存器栈(registerstack)\h汇编语言FPU舍入:计算浮点数的精确结果\h汇编语言浮点数异常与常用指令集\h汇编语言浮点数算术运算指令\h汇编语言FCOM指令:比较浮点数值\h汇编语言读写浮点数值\h汇编语言FWAIT(WAIT)指令:异常同步\h汇编语言混合模式运算简述\h汇编语言异常的屏蔽与未屏蔽简述\h汇编语言x86指令编码简述\h汇编语言单字节指令与立即操作数简述\h汇编语言寄存器模式指令简述\h汇编语言处理器操作数大小前缀作用及意义\h汇编语言内存模式指令简述\h高级语言接口\h高级语言调用汇编语言的接口规范\h汇编语言.MODEL伪指令:确定程序的特性\h查看C语言/C++编译器生成的汇编语言代码\hVisualC++__asm伪指令:C语言/C++内嵌汇编语言代码\hC语言/C++内嵌汇编代码实例:文件加密\hC语言/C++调用汇编语言函数\h汇编语言调用C语言/C++函数\h汇编语言调用C语言/C++实例:乘法表\h汇编语言调用C语言/C++库函数\hC/C++调用汇编语言实例:目录表程序汇编语言基本概念简介原文:\h/asm/10/通过本章的学习将带领大家建立汇编语言编程的一些核心概念。比如,汇编语言是如何适应各种语言和应用程序的。本章将系统的介绍虚拟机概念,它在理解软件与硬件层之间的关系时非常重要。最后详细的说明了二进制和十六进制的数制系统,以及如何执行转换和基本的算术运算和一些基础逻辑操作(AND、OR和NOT)等。汇编语言是一种什么程序设计语言?原文:\h/view/3294.html本教程主要介绍与运行MicrosoftWindows32位和64位系统的Intel和AMD处理器相兼容的微处理器编程。
教程中使用了Microsoft宏汇编器(称为MASM)的最新版本。MicrosoftVisualStudio的大多数版本(专业版,旗舰版,精简版……)都包含MASM。
可以访问(\h),了解VisualStudio对MASM支持的最新详细信息。同时,网站中还包括很多关于如何设置软件并开始使用的有用信息。
在运行MicrosoftWindows的x86系统中,其他一些有名的汇编器包括:TASM(Turbo汇编器),NASM(Netwide汇编器)和MASM32(MASM的一种变体)。GAS(GNU汇编器)和NASM是两种基于Linux的汇编器。在这些汇编器中,NASM的语法与MASM的最相似。
汇编语言是最古老的编程语言,在所有的语言中,它与原生机器语言最为接近。它能直接访问计算机硬件,要求用户了解计算机架构和操作系统。
如果小伙伴正在学的大学课程的名称与下列课程之一相似,可以通过本教程学到更多的专业知识:
微计算机汇编语言汇编语言编程计算机体系结构导论计算机系统基础嵌入式系统编程
通过本教程有助于学习计算机体系结构、机器语言和底层编程的基本原理。可以学到足够的汇编语言,来测试其掌握的当今使用最广泛的微处理器系列的知识。不会学到用模拟汇编器来编写一个“玩具”计算机;MASM是一个由业界专业人士使用的工业级汇编器。大家将从程序员的角度来了解Intel处理器系列的体系结构。
如果小伙伴计划成为C或C++开发者,就需要理解内存、地址和指令是如何在底层工作的。在高级语言层次上,很多编程错误不容易被识别。因此,程序员经常会发现需要“深入”到程序内部,才能找出程序不工作的原因。
学习汇编可能会问的问题需要怎样的背景知识?在学习本教程之前,至少使用过一种结构化高级语言进行编程,如Java、C、Python或C++。需要了解如何使用IF语句、数组和函数来解决编程问题。
什么是汇编器和链接器?汇编器(assembler)是一种工具程序,用于将汇编语言源程序转换为机器语言。链接器(linker)也是一种工具程序,它把汇编器生成的单个文件组合为一个可执行程序。还有一个相关的工具,称为调试器(debugger),使程序员可以在程序运行时,单步执行程序并检查寄存器和内存状态。
需要哪些硬件和软件?一台运行32位或64位MicrosoftWindows系统的计算机,并已安装了近期版本的MicrosoftVisualStudio。
MASM能创建哪些类型的程序?32位保护模式(32-BitProtectedMode):32位保护模式程序运行于所有的32位和64位版本的MicrosoftWindows系统。它们通常比实模式程序更容易编写和理解。从现在开始,将其简称为32位模式。
64位模式(64-BitMode):64位程序运行于所有的64位版本MicrosoftWindows系统。
16位实地址模式(16-BitReal-AddressMode):16位程序运行于32位版本Windows和嵌入式系统。64位Windows不支持这类程序。
汇编语言与机器语言有什么关系?机器语言(machinelanguage)是一种数字语言,专门设计成能被计算机处理器(CPU)理解。所有x86处理器都理解共同的机器语言。
汇编语言(assemblylanguage)包含用短助记符如ADD、MOV、SUB和CALL书写的语句。汇编语言与机器语言是一对一(one-to-one)的关系:每一条汇编语言指令对应一条机器语言指令。
C++和Java与汇编语言有什么关系?高级语言如Python、C++和Java与汇编语言和机器语言的关系是一对多(one-to-many)。比如,C++的一条语句就会扩展为多条汇编指令或机器指令。
大多数人无法阅读原始机器代码,因此,这里探讨的是与之最接近的汇编语言。例如,下面的C++代码进行了两个算术操作,并将结果赋给一个变量。假设X和Y是整数:
intY;
intX=(Y+4)*3;
与之等价的汇编语言程序如下所示。这种转换需要多条语句,因为每条汇编语句只对应一条机器指令:
moveax,Y;Y送入EAX寄存器
addeax,4;EAX寄存器内容加4
movebx,3;3送入EBX寄存器
imulebx;EAX与EBX相乘
movx,eax;EAX的值送入X
寄存器(register)是CPU中被命名的存储位置,用于保存操作的中间结果。这个例子的重点不是说明C++与汇编语言哪个更好,而是展示它们的关系。
汇编语言可移植吗?一种语言,如果它的源程序能够在各种各样的计算机系统中进行编译和运行,那么这种语言被称为是可移植的(portable)。
例如,一个C++程序,除非需要特别引用某种操作系统的库函数,否则它就几乎可以在任何一台计算机上编译和运行。Java语言的一大特点就是,其编译好的程序几乎能在所有计算机系统中运行。
汇编语言不是可移植的,因为它是为特定处理器系列设计的。目前广泛使用的有多种不同的汇编语言,每一种都基于一个处理器系列。
对于一些广为人知的处理器系列如Motorola68x00、x86、SUNSparc、Vax和IBM-370,汇编语言指令会直接与该计算机体系结构相匹配,或者在执行时用一种被称为微代码解释器(microcodeinterpreter)的处理器内置程序来进行转换。
为什么要学习汇编语言?如果对学习汇编语言还心存疑虑,考虑一下这些观点:
如果是学习计算机工程,那么很可能会被要求写嵌入式(embedded)程序。嵌入式程序是指一些存放在专用设备中小容量存储器内的短程序,这些专用设备包括:电话、汽车燃油和点火系统、空调控制系统、安全系统、数据采集仪器、显卡、声卡、硬盘驱动器、调制解调器和打印机。由于汇编语言占用内存少,因此它是编写嵌入式程序的理想工具。处理仿真和硬件监控的实时应用程序要求精确定时和响应。高级语言不会让程序员对编译器生成的机器代码进行精确控制。汇编语言则允许程序员精确指定程序的可执行代码。电脑游戏要求软件在减少代码大小和加快执行速度方面进行高度优化。就针对一个目标系统编写能够充分利用其硬件特性的代码而言,游戏程序员都是专家。他们经常选择汇编语言作为工具,因为汇编语言允许直接访问计算机硬件,所以,为了提高速度可以对代码进行手工优化。汇编语言有助于形成对计算机硬件、操作系统和应用程序之间交互的全面理解。使用汇编语言,可以运用并检验从计算机体系结构和操作系统课程中获得的理论知识。一些高级语言对其数据表示进行了抽象,这使得它们在执行底层任务时显得有些不方便,如位控制。在这种情况下,程序员常常会调用使用汇编语言编写的子程序来完成他们的任务。硬件制造商为其销售的设备创建设备驱动程序。设备驱动程序(devicedriver)是一种程序,它把通用操作系统指令转换为对硬件细节的具体引用。比如,打印机制造商就为他们销售的每一种型号都创建了一种不同的MS-Windows设备驱动程序。通常,这些设备驱动程序包含了大量的汇编语言代码。汇编语言有规则吗?大多数汇编语言规则都是以目标处理器及其机器语言的物理局限性为基础的。比如,CPU要求两个指令操作数的大小相同。与C++或Java相比,汇编语言的规则较少,因为,前者是用语法规则来减少意外的逻辑错误,而这是以限制底层数据访问为代价的。
汇编语言程序员可以很容易地绕过高级语言的限制性特征。例如,Java就不允许访问特定的内存地址。程序员可以使用JNI(JavaNativeInterface)类来调用C函数绕过这个限制,可结果程序不容易维护。
反之,汇编语言可以访问所有的内存地址。但这种自由的代价也很高:汇编语言程序员需要花费大量的时间进行调试。汇编语言的应用(用途)原文:\h/view/3378.html早期在编程时,大多数应用程序部分或全部用汇编语言编写。它们不得不适应小内存,并尽可能在慢速处理器上有效运行。随着内存容量越来越大,以及处理器速度急速提高,程序变得越来越复杂。
程序员也转向高级语言如C语言、FORTRANCOBOL,这些语言具有很多结构化能力。最近,Python、C++、C#和Java等面向对象语言已经能够编写含数百万行代码的复杂程序了。
很少能看到完全用汇编语言编写的大型应用程序,因为它们需要花费大量的时间进行编写和维护。不过,汇编语言可以用于优化应用程序的部分代码来提升速度,或用于访问计算机硬件。
下表比较了汇编语言和高级语言对各种应用类型的适应性。
应用类型高级语言汇编语言商业或科学应用程序,为单一的中型或大型平台编写规范结构使其易于组织和维护大量代码最小规范结构,因此必须由具有不同程度经验的程序员来维护结构。这导致对已有代码的维护困难硬件设备驱动程序语言不一定提供对硬件的直接访问。即使提供了,可能也需要难以控制的编码技术,这导致维护困难对硬件的访问直接且简单。当程序较短且文档良好时易于维护为多个平台(不同的操作系统)编写的商业或科学应用程序通常可移植。在每个目标操作系统上,源程序只做少量修改就能重新编译需要为每个平台单独重新编写代码,每个汇编器都使用不同的语法。维护困难需要直接访问硬件的嵌入式系统和电脑游戏可能生成很大的可执行文件,以至于超出设备的内存容量理想,因为可执行代码小,运行速度快
C和C++语言具有一个独特的特性,能够在高级结构和底层细节之间进行平衡。直接访问硬件是可能的,但是完全不可移植。大多数C和C++编译器都允许在其代码中嵌入汇编语句,以提供对硬件细节的访问。虚拟机是什么?原文:\h/view/3295.html虚拟机概念(virtualmachinemachine)是一种说明计算机硬件和软件关系的有效方法。
在安德鲁·塔嫩鲍姆(AndrewTanenbaum)的书《结构化计算机组织》(StructuredComputerOrganization)中可以找到对这个模型广为人知的解释。要说明这个概念,先从计算机的最基本功能开始,即执行程序。
计算机通常可以执行用其原生机器语言编写的程序。这种语言中的每一条指令都简单到可以用相对少量的电子电路来执行。为了简便,称这种语言为L0。
由于L0极其详细,并且只由数字组成,因此,程序员用其编写程序就非常困难。如果能够构造一种较易使用的新语言L1,那么就可以用L1编写程序。有两种实现方法:
解释(Interpretation):运行L1程序时,它的每一条指令都由一个用L0语言编写的程序进行译码和执行。L1程序可以立即开始运行,但是在执行之前,必须对每条指令进行译码。翻译(Translation):由一个专门设计的L0程序将整个L1程序转换为L0程序。然后,得到的L0程序就可以直接在计算机硬件上执行。虚拟机与只使用语言描述相比,把每一层都想象成有一台假设的计算机或者虚拟机会更容易一些。通俗地说,虚拟机可以定义为一个软件程序,用来模拟一些其他的物理或虚拟计算机的功能。
虚拟机,将其称为VM1,可以执行L1语言编写的指令。虚拟机VM0可以执行L0语言编写的指令:
每一个虚拟机既可以用硬件构成也可以用软件构成。程序员可以为虚拟机VM1编写程序,如果能把VM1当作真实计算机予以实现,那么,程序就能直接在这个硬件上执行。否则,用VM1写出的程序就被翻译/解释为VM0程序,并在机器VM0上执行。
机器VM1与VM0之间的差异不能太大,否则,翻译或解释花费的时间就会非常多。如果VM1语言对程序员来说还不够友好到足以用于应用程序的开发呢?
可以为此设计另一个更加易于理解的虚拟机VM2。这个过程能够不断重复,直到虚拟机VMn足够支持功能强大、使用方便的语言。
Java编程语言就是以虚拟机概念为基础的。Java编译器把用Java语言编写的程序翻译为Java字节码(Javabytecode)。
后者是一种低级语言,能够在运行时由Java虚拟机(JVM)程序快速执行。JVM已经在许多不同的计算机系统上实现了,这使得Java程序相对而言独立于系统。
特定的机器与实际机器和语言相对,用Level2表示VM2,Level1表示VM1,如下图所示。计算机数字逻辑硬件表示为Level1机器。其上是Level2,称为指令集架构(ISA,InstructionSetArchitecture)。通常,这是用户可以编程的第一个层次,尽管这种程序包含的是被称为机器语言的二进制数值。
指令集架构(Level2)计算机芯片制造商在处理器内部设计一个指令集来实现基本操作,如传送、加法或乘法。这个指令集也被称为机器语言。每一个机器语言指令或者直接在机器硬件上执行,或者由嵌入到微处理器芯片的程序来执行,该程序被称为微程序。
汇编语言(Level3)在ISA层,编程语言提供了一个翻译层,来实践大规模软件开发。汇编语言出现在Level3,使用短助记符,如ADD、SUB和MOV,易于转换到ISA层。汇编语言程序在执行之前要全部翻译(汇编)为机器语言。
高级语言(Level4)Level4是高级编程语言,如C、C++和Java。这些语言程序所包含的语句功能强大,并翻译为多条汇编语言指令。比如,查看C++编译器生成的列表文件输出,就可以看到这样的翻译。汇编语言代码由编译器自动汇编为机器语言。汇编语言的数据表示原文:\h/view/3296.html汇编语言程序员处理的是物理级数据,因此他们必须善于检查内存和寄存器。通常,二进制数被用于描述计算机内存的内容;有时也使用十进制和十六进制数。所以必须熟练掌握数字格式,以便快速地进行数字的格式转换。
每一种数制格式或系统,都有一个基数(base),也就是可以分配给单一数字的最大符号数。下表给岀了数制系统内可能的数字,这些系统是硬件和软件手册中最常使用的。
系统基数可能的数字二进制201八进制801234567十进制100123456789十六进制160123456789ABCDEF
在表的最后一行,十六进制使用的是数字0到9,然后字母A到F表示十进制数10到15。在展示计算机内存的内容和机器级指令时,使用十六进制是相当常见的。二进制(bit)整数原文:\h/view/3299.html计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能够适应开/关(on/off)或真/假(true/false)的概念。
二进制数(binarynumber)用2个数字作基础,其中每一个二进制数字(称为位,bit)不是0就是1。
位自右向左,从0开始顺序增量编号。左边的位称为最高有效位(MostSignificantBit,MSB)右边的位称为最低有效位(LSB,leastsignificantbit)。一个16位的二进制数,其MSB和LSB如下图所示:
二进制整数可以是有符号的,也可以是无符号的。有符号整数又分为正数和负数,无符号整数默认为正数,零也被看作是正数。
在书写较大的二进制数时,有些人喜欢每4位或8位插入一个点号,以增加数字的易读性。比如,1101.1110.0011.1000.0000和11001010.10101100
无符号二进制整数从LSB开始,无符号二进制整数中的每一个位代表的是2的加1次幂。下图展示的是对一个8位的二进制数来说,2的幂是如何从右到左增加的:
下表列出了从20到215的十进制值。
2ⁿ十进制值2ⁿ十进制值20128256212295122242101024238211204824162124096253221381922664214163842712821532768无符号二进制整数到十进制数的转换对于一个包含n个数字的无符号二进制整数来说,加权位记数法(weightedpositionalnotation)提供了一种简便的方法来计算其十进制值:dec=(Dn-1x2n-1)+(Dn-2x2n-2)+…+(D1x21)+(D0x20)D表示一个二进制数字。比如,二进制数00001001就等于9。计算该值时,剔除了数字等于0的位:
(1X23)+(1X20)=9下图表示了同样的计算过程:
无符号十进制整数到二进制数的转换将无符号十进制整数转换为二进制,方法是不断将这个整数除以2,并将每个余数记录为一个二进制数字。下表展示的是十进制数37转换为二进制数的步骤。余数的数字,从第二行开始,分别表示的是二进制数字D0
D1、D2、D3、D4和D5:
除法商余数除法商余数37/21814/22018/2902/2109/2411/201
将表中余数列的二进制位逆序连接(D5,D4,…),就得到了该整数的二进制值100101。由于计算机总是按照8的倍数来组织二进制数字,因此在该二进制数的左边增加两个0,形成00100101。
提示:有多少位呢?设无符号十进制值为n,其对应的二进制数的位数为b,用一个简单的公式就可以计算出b:b=(log2n)的上限。比如,如果n=17,则log217=4.087463,取其上限的最小整数5。大多数计数器没有以2为底的对数运算,但是有些网页可以帮助实现这种计算。二进制加法运算原文:\h/view/3300.html两个二进制整数相加时,是位对位处理的,从最低的一对位(右边)开始,依序将每一对位进行加法运算。两个二进制数字相加,有四种结果,如下所示:
0+0=00+1=11+0=11+1=10
1与1相加的结果是二进制的10(等于十进制的2)。多出来的数字向更高位产生一个进位。如下图所示,两个二进制数00000100和00000111相加:
从两个数的最低位(位0)开始,计算0+1,得到底行对应位上的1。然后计算次低位(位1)。在位2上,计算1+1,结果是0,并产生一个进位1。然后计算位3,0+0,还要加上位2的进位,结果是1。
其余的位都是0。上图右边是等价的十进制数值加法(4+7=11),可以用于验证左边的二进制加法。
有些情况下,最高有效位会产生进位。这时,预留存储区的大小就显得很重要。比如,如果计算11111111加00000001,就会在最高有效位之外产生一个1,而和数的低8位则为全0。
如果和数的存储大小最少有9位,那么就可以将和数表示为100000000。但是,如果和数只能保存8位,那么它就等于00000000,也就是计算结果的低8位。字节(byte)简介原文:\h/view/3301.html在x86计算机中,所有数据存储的基本单位都是字节(byte),一个字节有8位。其他的存储单位还有字(word)(2个字节),双字(doubleword)(4个字节)和四字(quadword)(8个字节)。
下图展示了每个存储单位所包含的位的个数:
下表列出了所有无符号整数可能的取值范围。
类型取值范围按位计的存储大小类型取值范围按位计的存储大小无符号字节0到28-18无符号四字0到264-164无符号字0到216-116无符号八字0到2128-1128无符号双字0到232-132
大的度量单位对内存和磁盘空间而言,还可以使用大的度量单位:
1千字节(kilobyte)等于210,或1024个字节。1兆字节(megabyte)(1MB)等于220,或1048576字节。1吉字节(gigabyte)(1GB)等于230即10243,或1073741824字节。1太字节(terabyte)(1TB)等于240,即10244,或1099511627776字节。1拍字节(petabyte)等于250,或1125899906842624字节。1艾字节(exabyte)等于260,或1152921504606846976字节。1泽字节(zettabyte)等于270个字节。1尧字节(yottabyte)等于280个字节。十六进制整数原文:\h/view/3303.html大的二进制数读起来很麻烦,因此十六进制数字就提供了一种简便的方式来表示二进制数据。十六进制整数中的1个数字就表示了4位二进制位,两个十六进制数字就能表示一个字节。
一个十六进制数字表示的范围是十进制数0到15,所以,用字母A到F来代表十进制数10到15。
下表列出了每个4位二进制序列如何转换为十进制和十六进制数值。
二进制十进制十六进制二进制十进制十六进制000000100088000111100199001022101010A001133101111B010044110012C010155110113D011066111014E011177111115F
下面的例子说明了二进制数000101101010011110010100是如何与十六进制数16A794等价的。
16A794000101101010011110010100无符号十六进制数到十进制的转换十六进制数中,每一个数字位都代表了16的幂。这有助于计算一个十六进制整数的十进制值。假设用下标来对一个包含4个数字的十六进制数编号D3D2D1D0。
下式计算了这个整数的十进制值:dec=(D3X163)+(D2X162)+(D1X161)+(D0x160)这个表达式可以推广到任意n位数的十六进制整数:dec=(Dn-1X16n-1)+(Dn-2x16n-2)+…+(D1X161)+(D0x160)一般情况下,可以通过公式把基数为B的任何n位整数转换为十进制数:dec=(Dn-1XBn-1)+(Dn-2XBn-2)+…+(D1XB1)+(D0xB0)。比如,十六进制数1234就等于(1x163)+(2x162)+(3X161)+(4x160),也就是十进制数4660。同样,十六进制数3BA4等于(3x163)+(11x162)+(10x161)+(4x160),也就是十进制数15268。
下图演示了第二个数转换的计算过程:
下表列出了16的幂从160到167的十进制数值。
16n十进制值16n十进制值160116465536161161651048576162256166167772161634096167268435456无符号十进制数到十六进制的转换无符号十进制整数转换到十六进制数的过程是,把这个十进制数反复除以16,每次取余数作为一个十六进制数字。例如,下表列出了十进制数422转换为十六进制的步骤:
除法商余数422/1626626/161A1/1601
表中,余数列的数字按照最后一行到第一行的顺序,组合为十六进制的结果。因此本例中,十六进制结果就表示为1A6。同样的算法也适用于《二进制整数》一节中的二进制整数。如果要将十进制数转换为其他进制数,就在计算时把除数(16)换成相应的基数。
补码及进制转换原文:\h/view/3318.html有符号二进制整数有正数和负数。在x86处理器中,MSB表示的是符号位:0表示正数,1表示负数。下图展示了8位的正数和负数:
补码表示负整数用补码(two`s-complement)表示时,使用的数学原理是:一个整数的补码是其加法逆元。(如果将一个数与其加法逆元相加,结果为0。)
补码表示法对处理器设计者来说很有用,因为有了它就不需要用两套独立的电路来处理加法和减法。例如,如果表达式为A-B,则处理器就可以很方便地将其转换为加法表达式:A+(-B)。
将一个二进制整数按位取反(求补)再加1,就形成了它的补码。以8位二进制数00000001为例,求其补码为11111111,过程如下所示:
初始值00000001第一步:按位取反11111110第二步:将上一步得到的结果加111111110
+00000001和值:补码表示11111111
11111111是-1的补码。补码操作是可逆的,因此,11111111的补码就是00000001。
十六进制数的补码将一个十六进制整数按位取反并加1,就生成了它的补码。一个简单的十六进制数字取反方法就是用15减去该数字。下面是一些十六进制数求补码的例子:
6A3D-->95C2+1-->95C3
95C3-->6A3C+1-->6A3D有符号二进制数到十进制的转换用下面的算法计算一个有符号二进制整数的十进制数值:
如果最高位是1,则该数是补码。再次对其求补,得到其正数值。然后把这个数值看作是一个无符号二进制整数,并求它的十进制数值。如果最高位是0,就将其视为无符号二进制整数,并转换为十进制数。
例如,有符号二进制数11110000的最高有效位是1,这意味着它是一个负数,首先要求它的补码,然后再将结果转换为十进制。过程如下所示:
初始值11110000第一步:按位取反00001111第二步:将上一步得到的结果加100001111
+1第三步:生成补码00010000第四步:转换为十进制16
由于初始值(11110000)是负数,因此其十进制数值为-16。
有符号十进制数到二进制的转换有符号十进制整数转换为二进制的步骤如下:
把十进制整数的绝对值转换为二进制数。如果初始十进制数是负数,则在第1步的基础上,求该二进制数的补码。
比如,十进制数-43转换为二进制的过程为:
1)无符号数43的二进制表示为00101011。
2)由于初始数值是负数,因此,求出00101011的补码11010101这就是十进制数-43的二进制表示。
有符号十进制数到十六进制的转换有符号十进制整数转换为十六进制的步骤如下:把十进制整数的绝对值转换为十六进制数。如果初始十进制数是负数,则在第1步的基础上,求该十六进制数的补码。有符号十六进制数到十进制的转换有符号十六进制整数转换为十进制的步骤如下:
如果十六进制整数是负数,求其补码,否则保持该数不变。把第1步得到的整数转换为十进制。如果初始值是负数,则在该十进制整数的前面加负号。
通过检查十六进制数的最高有效(最高)位,就可以知道该数是正数还是负数。如果最高位≥8,该数是负数;如果最高位≤7,该数是正数。比如,十六进制数8A20是负数,而7FD9是正数。
最大值和最小值n位有符号整数只用n-1来表示该数的范围。下表列出了有符号单字节、字、双字、四字和八字的最大值与最小值。
类型范围存储位数类型范围存储位数有符号字节-27到+27-18有符号四字-263到+263-164有符号字-215到+215-116有符号八字-2127到+2127-1128有符号双字-231到+231-132二进制减法运算原文:\h/view/3321.html如果采用与十进制减法相同的方法,那么从一个较大的二进制数中减去一个较小的无符号二进制数就很容易了。示例如下:
01101(十进制数13)
-00111(十进制数7)
位0上的减法非常简单:
01101
-00111
0下一个位置上执行(0-1),要向左边的相邻位借1,其结果是从2中减去1:
01001
-00111
10再下一位上,又要向左边的相邻位借一位,并从2中减去1:
00011
-00111
110最后,最高两位都执行的是零减去零:
00011
-00111
00110(十进制数6)执行二进制减法还有更简单的方法,即将被减去数的符号位取反,然后将两数相加。这个方法要求用一个额外的位来保存数的符号。
现在以刚才计算的(01101-00111)为例来试一下这个方法。首先,将00111按位取反11000加1,得到11001。然后,把两个二进制数值相加,并忽略最高位的进位:
01101(+13)
11001(-7)
00110(+6)结果正是我们预期的+6。字符在计算机中是如何表示的?原文:\h/view/3323.html如果计算机只存储二进制数据,那么它如何表示字符呢?计算机使用的是字符集,将字符映射为整数。早期,字符集只用8位表示。即使是现在,在字符模式(如MS-DOS)下运行时,IBM兼容微机使用的还是ASCII(读为“askey”)字符集。
ASCII是美国标准信息交换码(AmeTicanStandardCodeforInformationInterchange)的首字母缩写。在ASCII中,每个字符都被分配了一个独一无二的7位整数。
由于ASCII只用字节中的低7位,因此最高位在不同计算机上被用于创建其专有字符集。比如,IBM兼容微机就用数值128〜255来表示图形符号和希腊字符。
ANSI字符集美国国家标准协会(ANSI)定义了8位字符集来表示多达256个字符。前128个字符对应标准美国键盘上的字母和符号。后128个字符表示特殊字符,诸如国际字母表、重音符号、货币符号和分数。
MicrosoftWindows早期版本使用ANSI字符集。
Unicode标准当前,计算机必须能表示计算机软件中世界上各种各样的语言。因此,Unicode被创建出来,用于提供一种定义文字和符号的通用方法。
Unicode定义了数字代码(称为代码点(codepoint)),定义的对象为文字、符号以及所有主要语言中使用的标点符号,包括欧洲字母文字、中东的从右到左书写的文字和很多亚洲文字。代码点转换为可显示字符的格式有三种:
UTF-8用于HTML,与ASCII有相同的字节数值。UTF-16用于节约使用内存与高效访问字符相互平衡的环境中。比如,MicrosoftWindows近期版本使用了UTF-16,其中的每个字符都有一个16位的编码。UTF-32用于不考虑空间,但需要固定宽度字符的环境中。每个字符都有一个32位的编码。ASCII字符串有一个或多个字符的序列被称为字符串(string)。更具体地说,一个ASCII字符串是保存在内存中的,包含了ASCII代码的连续字节。比如,字符串“ABC123”的数字代码是41h、42h、43h、31h、32h和33h。
以空字节结束(null-terminated)的字符串是指,在字符串的结尾处有一个为0的字节。C和C++语言使用的是以空字节结束的字符串,一些Windows操作系统函数也要求字符串使用这种格式。
使用ASCII表下图中列出了在Windows控制台模式下运行时使用的ASCII码。
在查找字符的十六进制ASCII码时,先沿着表格最上面一行,再找到包含要转换字符的列即可。表格第二行是该十六进制数值的最高位;左起第二列是最低位。
例如,要查找字母a的ASCII码,先找到包含该字母的列,在这一列第二行中找到第一个十六进制数字6。然后,找到包含a的行的左起第二列,其数字为1。因此,a的ASCII码是十六进制数61。
下图用简单的形式说明了这个过程:
ASCII控制字符0〜31的字符代码被称为ASCII控制字符。若程序用这些代码编写标准输出(比如C++中),控制字符就会执行预先定义的动作。下表列出了该范围内最常用的字符。
ASCII码(十进制)说明ASCII码(十进制)说明8回退符(向左移动一列)12换页符(移动到下一个打印页)9水平制表符(向前跳过n列)13回车符(移动到最左边的输出列)10换行符(移动到下一个输出行)27换码符数字数据表示术语用精确的术语描述内存中和显示屏上的数字及字符是非常重要的。比如,在内存中用单字节保存十进制数65,形式为01000001。调试程序可能会将该字节显示为“41”,这个数字的十六进制形式。
如果这个字节复制到显存中,则显示屏上可能显示字母“A”,因为在ASCII码中,01000001代表的是字母A。由于数字的解释可以依赖于它的上下文,因此,下面为每个数据表示类型分配一个特定的名称,以便将来的讨论更加清晰:
二进制整数是指,以其原始格式保存在内存中的整数,以备用于计算。二进制整数保存形式为8位的倍数(如8、16、32或64)。
数字字符串是一串ASCII字符,例如“123”或“65”。这是一种简单的数字表示法,下表以十进制数65为例,列出了这种表示法能使用的各种形式。
格式数值格式数值二进制数字字符串“01000001”十六进制数字字符串“41”十进制数字字符串“65”八进制数字字符串“101”汇编语言布尔表达式(NOT、AND、OR)原文:\h/view/3337.html布尔代数(booleanalgebra)定义了一组操作,其值为真(true)或假(false)。它的发明者是十九世纪中叶的数学家乔治・布尔(GeorgeBoole)。
在数字计算机发明的早期,人们发现布尔代数可以用来描述数字电路的设计。同时,在计算机程序中,布尔表达式被用来表示逻辑操作。
一个布尔表达式(booleanexpression)包括一个布尔运算符以及一个或多个操作数。每个布尔表达式都意味着一个为真或假的值。以下为运算符集合:
非(NOT):标记为¬或~或'与(AND):标记为^或·或(OR):标记为∨或+
NOT是一元运算符,其他运算符都是二元的。布尔表达式的操作数也可以是布尔表达式。示例如下:
达式说明表达式说明¬XNOTX¬X∨Y(NOTX)ORYX^YXANDY¬(X^Y)NOT(XANDY)X∨YXORYX^¬YXAND(NOTY)NOTNOT运算符将布尔值取反。用数学符号书写为¬X,其中,X是一个变量(或表达式),其值为真(T)或假(F)。下表列出了对变量X进行NOT运算后所有可能的输岀。左边为输入,右边(阴影部分)为输出:
X¬XFTTF
真值表中,0表示假,1表示真。
AND布尔运算符AND需要两个操作数,用符号表示为X^Y。下表列出了对变量X和Y进行AND运算后,所有可能的输出(阴影部分):
XYX^YFFFFTFTFFTTT
当两个输入都是真时,输出才为真。这与C++和Java的复合布尔表达式中的逻辑AND是相对应的。
汇编语言中AND运算符是按位操作的。如下例所示,X中的每一位都与Y中的相应位进行AND运算:
X:11111111
Y:00011100
X^Y:00011100如下图所示,结果值00011100中的每一位表示的是X和Y相应位的AND运算结果。
OR布尔运算符OR需要两个操作数,用符号表示为X∨Y。下表列出了对变量X和Y进行OR运算后,所有可能的输出:
XYX∨YFFFFTTTFTTTT
当两个输入都是假时,输出才为假。这个真值表与C++和Java的复合布尔表达式中的逻辑OR对应。
OR运算符也是按位操作。在下例中,X的每一位与Y的对应位进行OR运算,结果为11111100:
X:11101100
Y:00011100
X∨Y:11111100如下图所示,每一位都独立进行OR运算,生成结果中的对应位。
运算符优先级运算符优先级原则(operatorprecedencerule)用于指示在多运算符表达式中,先执行哪个运算。在包含多运算符的布尔表达式中,优先级是非常重要的。
如下表所示,NOT运算符具有最高优先级,然后是AND和OR运算符。可以使用括号来强制指定表达式的求值顺序:
表达式运算符顺序¬X∨YNOT,然后OR¬(X^Y)OR,然后NOTX∨(X^Y)AND,然后OR布尔函数真值表布尔函数(Booleanfunction)接收布尔输入,生成布尔输出。所有布尔函数都可以构造一个真值表来展示全部可能的输入和输出。下面的这些真值表都表示包含两个输入变量X和Y的布尔函数。右侧的阴影部分是函数输岀:
示例1:¬X∨Y
X¬XY¬X∨YFTFTFTTTTFFFTFTT
示例2:X^¬Y
XY¬YX^¬YFFTFFTFFTFTTTTFF
示例3:(Y^S)∨(X^¬S)
XYSY^S¬SX^¬S(Y^S)∨(X^¬S)FFFFTFFFTFFTFFTFFFTTTTTFFTTTFFTFFFFFTTTFFTTFTFFFFTTTTFFT
示例3的布尔函数描述了一个多路选择器(multiplexer),一种数字组件,利用一个选择位(S)在两个输出(X和Y)中选择一个。如果S为假,函数输出(Z)就和X相同;如果S为真,函数输出就和Y相同。下面是多路选择器的框图:
x86处理器架构原文:\h/asm/20/汇编语言是学习计算机如何工作的很好的工具,它需要读者具备计算机硬件的工作知识。通过本章的学习将帮助程序员理解自己所写的汇编代码。本章重点介绍与x86汇编语言相关的底层硬件知识。以及从程序员角度看到的主机系统。其中包括了所有的IntelIA-32和Intel64处理器和高级微设备(AMD)处理器。本章还详细的介绍了指令执行时处理器内部发生的一些基本操作,以及操作系统如何加载和执行程序,并通过样本主板布局来了解x86系统的硬件环境,最后还讨论了在应用程序与操作系统之间,层次化输入输出是如何工作的。CPU处理器架构和工作原理浅析原文:\h/view/3456.html汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识。
基本微机设计下图给出了假想机的基本设计。中央处理单元(CPU)是进行算术和逻辑操作的部件,包含了有限数量的存储位置——寄存器(register),一个高频时钟、一个控制单元和一个算术逻辑单元。
其中:
时钟(clock)对CPU内部操作与系统其他组件进行同步。控制单元(controlunit,CU)协调参与机器指令执行的步骤序列。算术逻辑单元(arithmeticlogicunit,ALU)执行算术运算,如加法和减法,以及逻辑运算,如AND(与)、OR(或)和NOT(非)。
CPU通过主板上CPU插座的引脚与计算机其他部分相连。大部分引脚连接的是数据总线、控制总线和地址总线。
内存存储单元(memorystorageunit)用于在程序运行时保存指令与数据。它接受来自CPU的数据请求,将数据从随机存储器(RAM)传输到CPU,并从CPU传输到内存。
由于所有的数据处理都在CPU内进行,因此保存在内存中的程序在执行前需要被复制到CPU中。程序指令在复制到CPU时,可以一次复制一条,也可以一次复制多条。
总线(bus)是一组并行线,用于将数据从计算机一个部分传送到另一个部分。一个计算机系统通常包含四类总线:数据类、I/O类、控制类和地址类。
数据总线(databus)在CPU和内存之间传输指令和数据。I/O总线在CPU和系统输入/输出设备之间传输数据。控制总线(controlbus)用二进制信号对所有连接在系统总线上设备的行为进行同步。当前执行指令在CPU和内存之间传输数据时,地址总线(addressbus)用于保持指令和数据的地址。
时钟与CPU和系统总线相关的每一个操作都是由一个恒定速率的内部时钟脉冲来进行同步。机器指令的基本时间单位是机器周期(machinecycle)或时钟周期(clockcycle)。
一个时钟周期的时长是一个完整时钟脉冲所需要的时间。下图中,一个时钟周期被描绘为两个相邻下降沿之间的时间:
时钟周期持续时间用时钟速度的倒数来计算,而时钟速度则用每秒振荡数来衡量。例如,一个每秒振荡10亿次(1GHz)的时钟,其时钟周期为10亿分之1秒(1纳秒)。
执行一条机器指令最少需要1个时钟周期,有几个需要的时钟则超过了50个(比如8088处理器中的乘法指令)。由于在CPU、系统总线和内存电路之间存在速度差异,因此,需要访问内存的指令常常需要空时钟周期,也被称为等待状态(waitstates)。指令执行周期一条机器指令不会神奇地一下就执行完成。CPU在执行一条机器指令时,需要经过一系列预先定义好的步骤,这些步骤被称为指令执行周期(instructionexecutioncycle)。
假设现在指令指针寄存器中已经有了想要执行指令的地址,下面就是执行步骤:
1)CPU从被称为指令队列(instructionqueue)的内存区域取得指令,之后立即增加指令指针的值。
2)CPU对指令的二进制位模式进行译码。这种位模式可能会表示该指令有操作数(输入值)。
3)如果有操作数,CPU就从寄存器和内存中取得操作数。有时,这步还包括了地址计算。
4)使用步骤3得到的操作数,CPU执行该指令。同时更新部分状态标志位,如零标志(Zero)、进位标志(Carry)和溢出标志(Overflow)。
5)如果输出操作数也是该指令的一部分,则CPU还需要存放其执行结果。
通常将上述听起来很复杂的过程简化为三个步骤:取指(Fetch)、译码(Decode)和执行(Execute)。操作数(operand)是指操作过程中输入或输出的值。例如,表达式Z=X+Y有两个输入操作数(X和Y),—个输岀操作数(Z)。
下图是一个典型CPU中的数据流框图。该图表现了在指令执行周期中相互交互部件之间的关系。在从内存读取程序指令之前,将其地址放到地址总线上。然后,内存控制器将所需代码送到数据总线上,存入代码高速缓存(codecache)。指令指针的值决定下一条将要执行的指令。指令由指令译码器分析,并产生相应的数值信号送往控制单元,其协调ALU和浮点单元。虽然图中没有画出控制总线,但是其上传输的信号用系统时钟协调不同CPU部件之间的数据传输。
读取内存作为一个常见现象,计算机从内存读取数据比从内部寄存器读取速度要慢很多。这是因为从内存读取一个值,需要经过下述步骤:
将想要读取的值的地址放到地址总线上。设置处理器RD(读取)引脚(改变RD的值)。等待一个时钟周期给存储器芯片进行响应。将数据从数据总线复制到目标操作数。
上述每一步常常只需要一个时钟周期,时钟周期是基于处理器内固定速率时钟节拍的一种时间测量方法。计算机的CPU通常是用其时钟速率来描述。例如,速率为1.2GHz意味着时钟节拍或振荡为每秒12亿次。
因此,考虑到每个时钟周期仅为1/1200000000秒,4个时钟周期也是非常快的。但是,与CPU寄存器相比,这个速度还是慢了,因为访问寄存器一般只需要1个时钟周期。
幸运的是,CPU设计者很早之前就已经指出,因为绝大多数程序都需要访问变量,计算机内存成为了速度瓶颈。他们想出了一个聪明的方法来减少读写内存的时间一一将大部分近期使用过的指令和数据存放在高速存储器cache中。
其思想是,程序更可能希望反复访问相同的内存和指令,因此,cache保存这些值就能使它们能被快速访问到。此外,当CPU开始执行一个程序时,它会预先将后续(比如)一千条指令加载到cache中,这个行为是基于这样一种假设,即这些指令很快就会被用到。
如果这种情况重复发生在一个代码块中,则cache中就会有相同的指令。当处理器能够在cache存储器中发现想要的数据,则称为cache命中(cachehit)。反之,如果CPU在cache中没有找到数据,则称为cache未命中(cachemiss)。
x86系列中的cache存储器有两种类型:一级cache(或主cache)位于CPU上;二级cache(或次cache)速度略慢,通过高速数据总线与CPU相连。这两种cache以最佳方式一起工作。
还有一个原因使得cache存储器比传统RAM速度快,cache存储器是由一种被称为静态RAM(staticRAM)的特殊存储器芯片构成的。这种芯片比较贵,但是不需要为了保持其内容进行不断地刷新。另一方面,传统存储器,即动态RAM(dynamicRAM),就需要持续刷新。它速度慢一些,但是价格更便宜。
加载并执行程序在程序执行之前,需要用一种工具程序将其加载到内存,这种工具程序称为程序加载器(programloader)。加载后,操作系统必须将CPU向程序的入口,即程序开始执行的地址。以下步骤是对这一过程的详细分解。
1)操作系统(OS)在当前磁盘目录下搜索程序的文件名。如果找不到,则在预定目录列表(称为路径(path))下搜索文件名。当OS无法检索到文件名时,它会发出一个出错信息。
2)如果程序文件被找到,OS就访问磁盘目录中的程序文件基本信息,包括文件大小,及其在磁盘驱动器上的物理位置。
3)OS确定内存中下一个可使用的位置,将程序文件加载到内存。为该程序分配内存块,并将程序大小和位置信息加入表中(有时称为描述符表(descriptortable))。另外,OS可能调整程序内指针的值,使得它们包括程序数据地址。
4)OS开始执行程序的第一条机器指令(程序入口)。当程序开始执行后,就成为一个进程(process)。OS为这个进程分配一个标识号(进程ID),用于在执行期间对其进行追踪。
5)进程自动运行。OS的工作是追踪进程的执行,并响应系统资源的请求。这些资源包括内存、磁盘文件和输入输出设备等。
6)进程结束后,就会从内存中移除。
不论使用哪个版本的MicrosoftWindows,按下Ctrl-Alt-Delete组合键,可以选择任务管理器(taskmanager)选项。在任务管理器窗口可以查看应用程序和进程列表。
应用程序列表中列出了当前正在运行的完整程序名称,比如,Windows浏览器,或者MicrosoftVisualC++。如果选择进程列表,则会看见一长串进程名。其中的每个进程都是一个独立于其他进程的,并处于运行中的小程序。
可以连续追踪每个进程使用的CPU时间和内存容量。在某些情况下,选定一个进程名称后,按下Delete键就可以关闭该进程。32位x86处理器架构原文:\h/view/3458.html本节重点讲解了32位x86处理器的基本架构特点。这些处理器包括了IntelIA-32系列中的成员和所有32位AMD处理器。
操作模式x86处理器有三个主要的操作模式:保护模式、实地址模式和系统管理模式;以及一个子模式:虚拟8086(virtual-8086)模式,这是保护模式的特殊情况。以下是对这些模式的简介:
1)保护模式(ProtectedMode)保护模式是处理器的原生状态,在这种模式下,所有的指令和特性都是可用的。分配给程序的独立内存区域被称为段,而处理器会阻止程序使用自身段范围之外的内存。
2)虚拟8086模式(Virtual-8086Mode)保护模式下,处理器可以在一个安全环境中,直接执行实地址模式软件,如MS-DOS程序。换句话说,如果一个程序崩溃了或是试图向系统内存区域写数据,都不会影响到同一时间内执行的其他程序。现代操作系统可以同时执行多个独立的虚拟8086会话。
3)实地址模式(Real-AddressMode)实地址模式实现的是早期Intel处理器的编程环境,但是增加了一些其他的特性,如切换到其他模式的功能。当程序需要直接访问系统内存和硬件设备时,这种模式就很有用。
4)系统管理模式(SystemManagementMode)系统管理模式(SMM)向操作系统提供了实现诸如电源管理和系统安全等功能的机制。这些功能通常是由计算机制造商实现的,他们为了一个特定的系统设置而定制处理器。
基本执行环境1)地址空间在32位保护模式下,一个任务或程序最大可以寻址4GB的线性地址空间。从P6处理器开始,一种被称为扩展物理寻址(extendedphysicaladdressing)的技
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外科学总论肾移植术后心血管并发症预防要点课件
- 2026年上海市金山公证处招聘备考题库完整答案详解
- 2026年中国农业科学院第一批统一公开招聘备考题库完整答案详解
- 2026年某三甲医院辅医岗招聘备考题库及参考答案详解1套
- 2026年秦皇岛市九龙山医院第二批公开选聘工作人员备考题库完整参考答案详解
- 外科学总论冻伤的远期预后课件
- 2026年瑞安市湖岭镇卫生院向社会公开招聘编外中药士1名备考题库及答案详解参考
- 2026年狮山镇官窑初级中学教师招聘备考题库及一套答案详解
- 中国热带农业科学院椰子研究所2026年第一批公开招聘工作人员备考题库及1套完整答案详解
- 2026年海南省财金集团有限公司招聘总经理备考题库带答案详解
- 雨课堂在线学堂《项目管理概论》作业单元考核答案
- 投资退出管理办法
- 2025至2030中国工业窑炉行业发展分析及发展趋势分析与未来投资战略咨询研究报告
- 学堂在线 雨课堂 学堂云 不朽的艺术:走进大师与经典 章节测试答案
- 《统计法》基础知识课件
- 仓库禁烟禁火管理制度
- 胖东来员工管理制度
- 购门协议书范本
- 诊所注销申请书
- 心脏瓣膜病麻醉管理
- TBT3208-2023铁路散装颗粒货物运输防冻剂
评论
0/150
提交评论