第一章基本概念

1.1  简单介绍

本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用Intel或AMD的32位/64位处理器运行本所有例子。

    汇编语言是有所程序设计语言中最古老的语言,它与计算机的机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,所以要求读者深入了解计算机体系结构和操作系统的大量细节。

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操作系统上,通常比实模式程序更加易于编写,易于理解。

为了更好的理解上面两个模式,我又查了一些资料,发现其中一个说的比较详细(http://blog.csdn.net/heiworld/article/details/24371677)。

通过本书能学到些什么?

  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层的程序代码,后者由编译器会变成机器语言。

最后有一个章总结,因为没有需要删减和简化的地方,直接粘贴过来吧。

Intel汇编语言程序设计学习-第一章 基本概念的更多相关文章

  1. Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下

    2.2  IA-32处理器体系结构 如前所述,IA-32是指始于Intel386直到当前最新的奔腾4的系列的处理器(额...这本书是什么时候写的啊,表示现在应该是I7啊),在IA-32的发展过程中,I ...

  2. Intel汇编语言程序设计学习笔记1

    第一章 汇编器链接器:汇编器将汇编语言翻译成机器语言,链接器将单个文件合并为可执行文件 intel 80X86系列处理器的汇编语言与VAX或者motorala 68x00等系统的汇编是否相同?不相同, ...

  3. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

  4. Intel汇编语言程序设计学习-第五章 过程-下

    5.3.3  库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...

  5. Intel汇编语言程序设计学习-第三章 汇编语言基础-下

    3.4  定义数据 3.4.1  内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...

  6. Intel汇编语言程序设计学习-第六章 条件处理-下

    6.6  应用:有限状态机 这个东西说了半天,感觉就是把逻辑弄得跟有向图一样,没看出来什么高端的东西,下面就整理下书上说的概念: 有限状态机(FSM,Finite-State Machine)是依据输 ...

  7. Intel汇编语言程序设计学习-第六章 条件处理-上

    条件处理 本章要点 1.简介 2.布尔和比较指令 3.条件跳转 4.条件循环指令 5.条件结构 6.应用:有限状态机 7.决策伪指令 6.1  简介 本章,读者将看到高级条件分支如何翻译成底层的实现代 ...

  8. Intel汇编语言程序设计学习-第三章 汇编语言基础-中

    3.2  例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...

  9. Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3.1  汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov  eax,5  ;5送EAX寄存器 add   ...

随机推荐

  1. InterJ idea 回滚提交的代码

    如果你要回滚到这一次提交 ctrl shift k 提交 选force push 那么你的代码就回滚到你所想要的这次提交记录了

  2. [virtualenv][python] 环境管理——对 virtualenv 更轻便的封装

    virtualenv_simple_wrapper 如有错误,欢迎指出 Char-z 项目地址 gitee: virtualenv_simple_wrapper 使用说明 下载文件 virtualen ...

  3. 从零学脚手架(四)---babel

    如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli 接下来介绍一个打包编译过程中一个极为重要的工具--babel. ES6的枷锁 细心的朋友可以知道,在之前打包编译 ...

  4. nginx使用-2(模块和日志)

    默认官方模块 1.1.Gzip压缩 压缩文件,使文件变小,传输更快了.目前市场上大部分浏览器是支持GZIP的.IE6以下支持不好,会出现乱码情况. 官方文档:http://nginx.org/en/d ...

  5. java实现下载器(以及创建一个URL对象)

    java实现下载器(以及创建一个URL对象) 1.思路讲解: (1)注意路径:是网络路径噢 (2)创建创建网路协议对象(远程对象):HttpURLConnection urlConnection (3 ...

  6. Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 【数学+分块】

    一.题目 D. Yet Another Subarray Problem 二.分析 公式的推导时参考的洛谷聚聚们的推导 重点是公式的推导,推导出公式后,分块是很容易想的.但是很容易写炸. 1 有些地方 ...

  7. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

    前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...

  8. 五个问题,三大策略,手把手教你定制App性能监控方案

    作者:友盟+U-APM团队 Why? 为什么要做应用性能监控? 首先,我们要知道应用性能监控具体指什么?以及目的: 监控是一套完整的"监视+报警"的系统.对于像我们这样的App开发 ...

  9. Androi Studio 之 RelativeLayout

    RelativeLayout简介 •基本属性 •根据父容器定位 •父容器定位属性示意图 •根据兄弟组件定位 •根据兄弟组件定位 •margin(偏移) •padding(填充) •margin与pad ...

  10. 【ProLog - 3.0 进阶:递归】

    [ProLog中的递归] 如果递归中的一个或多个规则引用谓词本身,则对该谓词使用"递归"定义 在使用时,这往往像一条食物链或者族谱的构成(A的爸爸的爸爸,即A的爷爷,是A的长辈) ...