Intel汇编语⾔程序设计学习-第⼀章基本概念
第⼀章基本概念
1.1  简单介绍
本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语⾔程序设计,可以使⽤Intel或AMD的32位/64位处理器运⾏本所有例⼦。windows程序设计第7版pdf
汇编语⾔是有所程序设计语⾔中最古⽼的语⾔,它与计算机的机器语⾔最为接近,通过汇编语⾔可以直接访问计算机的硬件,所以要求读者深⼊了解计算机体系结构和操作系统的⼤量细节。
1.1.1  ⼀些精彩的提问
(没⽤的地⽅我都直接简化或者删除了啊!)
需要具备什么背景知识?
⾄少要学完⼀门程序设计的⼊门语⾔。
什么是汇编器和链接器?
汇编器是把汇编语⾔源程序转换为机器语⾔的实⽤⼯具程序。链接器是吧编译器创建的多个单独的⽂件组合连接成可执⾏的应⽤程序的实⽤⼯具。另外⼀个⼯具称为调试器、允许在程序运⾏时单步执⾏并查看寄存器和内存的内容。
需要什么硬件和软件?
需要⼀台装配有Intel386,Intel486,Pentium或IA-32兼容处理器的计算机。例如使⽤AMD系列处理器完全完全能够正常⼯作。MASM兼容从Windows95开始的所有32位版本的WIndows操作系统。⼀些与直接硬件访问和磁盘扇区编程相关的程序必须在DOS,WIndows95/98/Me下运⾏,这是由于Windows NT/2000/XP有严格的安全限制。
能创建什么类型地址模式程序?
16位实地址模式程序:16位实地址模式程序可以在MS-DOS或MS-Windows的控制台窗⼝下运⾏。实地址模式程序也称为实模式程序,使⽤Intel8086/8088处理器要求的分段内存模式。
32位保护模式程序:32位保护模式程序可运⾏所有32位版本的Windows操作系统上,通常⽐实模式程序更加易于编写,易于理解。
通过本书能学到些什么?
1.计算机体系结构(也适⽤于Intel IA-32系列处理器)的基本原理。
2.⼀些基本的布尔逻辑概念以及它是如何⽤于程序设计和计算机硬件的。
3.IA-32处理器如何管理内存,如何使⽤实模式、保护模式和虚拟模式。
4.⾼级语⾔编译器(如C++)是如何将源代码语句翻译成汇编语⾔和机器语⾔的。
5.⾼级语⾔是如何在机器语⾔层次实现算是表达式。循环和逻辑结构的。
6.数据的表⽰⽅法,包括有符号和⽆符号整数、实数以及字符数据。
7.如何在机器语⾔层次调试程序。对于C/C++这样的能够访问低层数据和硬件的语⾔来说,这种调试能⼒尤为重要。
8.应⽤程序是如何通过终端服务程序、系统调⽤和共享内存区域才做系统进⾏交互的。
9.汇编语⾔代码与C++程序之间的接⼝。
10.穿件汇编语⾔应⽤程序。
汇编语⾔与机器语⾔有什么关系?
机器语⾔是⼀种数字语⾔,只有计算机的处理器(CPU)才能理解它。IA-32兼容处理器能够理解⼀种通⽤的机器语⾔。汇编语⾔由使⽤短助记符的语句构成,如ADD,MOV,SUB和CALL等。汇编语⾔通机器语⾔之间是⼀⼀对应的关系:⼀条汇编执⾏对应⼀条机器语⾔指令。
C++和Java等语⾔与汇编语⾔有什么关系?
⼀对多的关系,下⾯是我⽤vs2012反汇编的⼏句代码:
bool bBool = true;
013313BE  mov  byte ptr [bBool],1 把1这个值直接放到指针指向位置
char cByte = 2;
013313C2  mov  byte ptr [cByte],2同上
double fDouble = 3.0;              double的⽐较特别,之后会解释
013313C6  movsd      xmm0,mmword ptr ds:[1335858h]
013313CE  movsd      mmword ptr [fDouble],xmm0
int nY = 3;                        同上
013313D3  mov        dword ptr [nY],3
int nX = (4 + nY) * 3;
013313DA  mov        eax,dword ptr [nY]  先把Y放寄存器⾥
013313DD  add        eax,4                      寄存器值加4
013313E0  imul        eax,eax,3                寄存器的值=寄存器的值乘3
013313E3  mov        dword ptr [nX],eax  把当前寄存器值拷贝到X中
汇编语⾔是可移植的吗?
并不能,因为汇编语⾔总是为特定系列的处理器设计的。
为什么要学习汇编语⾔?(我的⽬的是为了了解汇编,然后去⽅便学习别的东西,⽽并不是作者所说的那样详细,下⾯是作者的想法)
1.适合编写嵌⼊式程序。
2.⼀些实时应⽤(如仿真和硬件监控)要去精确计量时间并实时响应。⾼级语⾔不允许程序员完全通知编译器⽣成的机器码,不过汇编语⾔允许程序员控制程序⼏乎每个字节。
3.许多专⽤硬件设备,有各种各样的限制。
4.汇编语⾔有助于对计算机硬件、操作系统、应⽤程序之间交互的整体理解。使⽤汇编语⾔,可以随时应⽤和校验计算机体系结构和操作系统课上学习的知识和理论。
5.应⽤程序员有时会发现⾼级语⾔中的种种限制会阻碍位操作和数据加密等底层操作的有效实现,他们⼀般会调⽤汇编语⾔编写此过程。
6.各种驱动。
1.1.2  汇编语⾔应⽤程序
前⾯说了⼀些,没啥⽤直接省略了。
C++中也可以使⽤汇编,这就是在使⽤⾼级结构和访问低层细节之间提供了⼀种折中的⽅案,⽤户可以使⽤汇编语⾔直接访问硬件,但这将是程序完全丧失可移植性。⼤多数C++编译器都具有⽣成汇编语⾔源代码的能⼒,程序员对⽣成汇编语⾔代码进⾏精炼、优化后再便以为可执⾏⽂件。
1.2  虚拟机的概念
虚拟机的概念是说明计算机软硬件之间相互关系的最佳途径之⼀。计算机能够执⾏机器语⾔书写的程序,这种语⾔的每条指令都简单到能⽤相对较少的电路单元即可执⾏。为简化期间。我们称这种语⾔为L0。
程序员使⽤L0语⾔编程⾮常困难,因为需要考虑⾮常低层、⾮常细微的地⽅,并且L0由纯粹的数字构成,如果能构造⼀种更加易⽤的新语⾔L1的话,那么程序可以⽤L1来编写了,有两种⽅法可以达到该⽬的的。
解释⽅法:当执⾏⽤L1语⾔编写的程序时,使⽤以L0语⾔编写的解释程序对L1程序的每条指令解码并执⾏,这样L1程序马上可以执⾏,但是每条指令在执⾏之前都必须解码。
翻译⽅式:⽤特别设计编写的L0程序将整个L1源程序翻译成L0程序,⽣成的L0程序就可以直接在计算机硬件上执⾏了。(上⾯两种⽅式让我想起两个JavaScript引擎,JavaScriptCore和V8,早期的JavaScriptCore就是采取解释⽅法,效率⽐较低,⽽V8⾃从诞⽣就是为了效率,直接编译成本地代码,⽽且跳过了字节码的阶段。)
每台虚拟机都可由硬件或软件构成。⼈们可以为虚拟机VM1编写程序,如果虚拟机VM1能够实现为真
实的计算机硬件,程序就可以直接在硬件上执⾏了。除此之外,为MV1编写的程序也可以通过监视或翻译的⽅法在虚拟机VM0上执⾏。
机器VM0和VM1不应该有根本的不同,否则翻译和监视过程将过于耗时。如果VM1⽀持的语⾔对编写应⽤程序的程序员不够友好怎么办?继续抽象,设计虚拟机知道VMn,它⽀持的语⾔功能强⼤并且易于使⽤。
程序设计语⾔Java就是基于虚拟机概念的,Java语⾔编写的程序由Java编译器翻译成Java字节码,后者是⼀种低层语⾔,可以由Java虚拟机(JVM)来快速执⾏。由于在许多不同的计算机系统上都时间了JVM,使得Java程序相对⽽⾔是与系统⽆关的。
具体实现:
数字逻辑(第0层):计算机的数字逻辑硬件⽤虚拟机的第0层表⽰。
微结构(第⼀层):计算机芯⽚制造商通常不允许普通⽤户编写微指令,特殊的微结构指令通常是⼚商秘密。像从内存中取数字并且加1这样的基本操作可能需要3-4条维指令。
指令集体系结构(第2层):计算机芯⽚制造商设计了⼀套国华在未处理器内部的指令集,⽤于执⾏如移动、加法和乘法等基本操作,这套指令集称为常规机器语⾔,或简称为机器语⾔。每条机器语⾔指令将分解成⼏条伪指令执⾏。
操作系统(第3层):随着计算机的发展,⼈们设计了其他能够是程序员更加⾼产的虚拟机。第3层的虚拟机能够理解⽤户发出的注⼊加载执⾏程序、显⽰⽬录之类的交互命令,这就是众所周知的计算机操作系统。操作系统软件被翻译成机器码在第2层上运⾏。(操作系统的源码有C或汇编语⾔写成,⼀旦编译之后,操作系统实际上不过是⼀个能够解释第3层命令的第2层程序。)
汇编语⾔(第4层):在操作系统层次之上的程序设计语⾔提供了能够实际⽤来开发⼤型软件的翻译层。汇编语⾔属于第4层,它使⽤ADD,SUB和MOV等很容易翻译到指令集体系结构层(第2层)的短助记符,其他⼀些汇编语句(如中断调⽤),则由操作系统(第3层)直接执⾏汇编语⾔程序在执⾏前⼀般要全部翻译(汇编)成机器语⾔。
⾼级语⾔(第5层):第5层是诸如C++,C#,VB和Java之类的⾼级语⾔,这些语⾔有功能强⼤的语句,每条语句通常被翻译成4层的多条指令。在内部,编译器把第5层的程序翻译成第4层的程序代码,后者由编译器会变成机器语⾔。
最后有⼀个章总结,因为没有需要删减和简化的地⽅,直接粘贴过来吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。