汇编指令

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

折月煮酒 提交于 2020-01-10 08:57:02
引言   上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令   数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作数和一个目的操作数,指令会将原操作数的值复制到目的操作数并覆盖。   数据传送指令一共可分为五种,分别是mov、movs、movz、push以及pop,下面LZ依次介绍一下这五个指令的作用。    mov指令   mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。   这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。   可以看到,在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。需要一提的是,mov指令可以在后面加上任何数据格式,比如上面这一过程中,数据格式则为四个字节,也就是双字。因此不难推断出,我们还可以使用movb和movw去复制一个字节或者两个字节。 movs指令  

《30天自制操作系统》笔记(12)——多任务入门

送分小仙女□ 提交于 2020-01-10 06:56:22
《30天自制操作系统》笔记(12)——多任务入门 进度回顾 上一篇 介绍了设置显示器高分辨率的方法。本篇讲一下操作系统实现多任务的方法。 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好。 多任务就是让电脑 同时 运行多个程序(如一边写代码一边听音乐一边下载电影)。 电脑的CPU只有固定有限的那么一个或几个, 不可能 真的同时运行多个程序。所以就用近似的方式,让多个程序 轮换 着运行。当轮换速度够快(0.01秒),给人的 感觉 就是"同时"运行了。 多任务之不实用版 我们首先从最基本的想法开始,做一个不实用版的多任务作为例子。在学习这个例子的过程中引入真正的多任务必须的TSS、TR、far模式JMP的概念,为后续内容打基础。 当你向CPU发出任务切换的指令时,CPU会先把寄存器中的值全部 写入 内存某处;然后,从内存另一位置把所有寄存器的值 读取 出来。这就完成了一次任务切换。 任务切换消耗的时间就是读写内存消耗的时间,大概为 0.0001秒 。 任务状态段TSS 存取全部寄存器的值这件事,当然需要有一个数据结构,这就是 "任务状态段" (Task Status Segment)简称TSS。 1 struct TSS32 2 { 3 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; 4 int eip,

【转贴】GCC 内联汇编

旧巷老猫 提交于 2020-01-10 04:55:40
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?

x86常用汇编寄存器

时光怂恿深爱的人放手 提交于 2020-01-10 04:51:47
通用寄存器 32位 16位 高8位 低8位 EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL ESI SI EDI DI ESP SP EBP BP E:Extend,X:逻辑与算数 EAX (Extend Add):累加器,在乘法和除法指令中自动使用;Win32中,一般用在函数的返回值中。 EBX (Extend Base):基地址寄存器,DS(数据段)中的数据指针。 ECX (Extend Count):计数器,CPU自动使用ECX作为循环计数器,在自妇产和循环操作中常用,在循环指令(LOOP)或串操-作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。 EDX (Extend Data):数据寄存器。 以上的寄存器常用来保存各种需要计算的值。 EBP (Extend Base Pointer):基地址指针寄存器,SS(堆栈段)中数据指针。EZBP有高级语言用来引用参数和局部变量,通常称为堆栈基地址寄存器。 ESP (Extend Stack Pointer):堆栈指针寄存器,SS(堆栈段)中堆栈指针,ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。 ESI (Extend Source Improve):源变址寄存器,字符串操作源指针。 EDI (Extend

深入理解计算机系统(3.5)---特殊的算术操作指令详解

南楼画角 提交于 2020-01-10 03:50:23
引言   上一章我们讨论了常见的算术与逻辑运算指令,其中比较有特点的是leal指令,本章我们再来看几个比较特殊的操作指令,这些指令可以让只有32位的寄存器存储64位的数据,是不是十分霸气侧漏呢。 初识   我们先来看看这些指令的大致介绍,如果各位看过上一章的话,会发现这里的指令有的会有些眼熟,但是它们的作用却截然不同。以下是书中的一张概图。   第一个指令有些眼熟吧,它就是我们上一章当中的imul乘法指令的双字形式。不过可以看出,这里的imull指令已经完全变了味道,它将结果存入两个寄存器。接下来,我们来仔细看看这些指令。 imull、mull指令   这两个指令一看就是双胞胎,它们一个负责有符号全64位乘法,一个负责无符号全64位乘法。细心的猿友会发现,imull这个指令好像是负责乘法的指令,而且在之前的乘法并没有区分有符号和无符号,现在怎么又成双胞胎指令了。   我们上一章当中出现的指令是imul指令,当它操作双字的时候,也就是imull指令。不过不同的是,它的一般形式是imull S D,这里有两个操作数,它将计算S和D的乘积并截断为双字,然后存储在D当中。由于在截断时,无符号以及有符号的二进制序列是一样的,因此此处的乘法指令并不区分有符号和无符号。   本次我们讨论的imull指令,则与上面的普通乘法指令稍有不同,它只有一个操作数,也就是说,它的一般形式为imull S

深入理解计算机系统(3.4)------算术和逻辑操作

拟墨画扇 提交于 2020-01-10 01:50:15
  上一篇博客 我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算指令,算术无非就是加减乘除,而逻辑运算也就是与或非,移位等操作。下面这张图是汇编里面的算术和逻辑操作:      上面除了 leal(加载有效地址)指令通常用来执行简单的算术操作,其余的指令都是标准的一元或者二元操作,下面我们分别来介绍这几个指令操作。 1、leal 指令   leal 指令也称为加载有效地址(load effective address)指令,它实际上是 movl 指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本没有引用存储器。   它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读取数据,而是将有效地址写入到目的操作数,类似于 C 语言的取地址操作符“&”。另外就是作普通的算术运算。   leal 立即数,寄存器   这类指令就是将立即数装载至寄存器,比如 leal $0x01,%eax 这种情况下 和 movl $0x01,%eax 的效果是等价的    leal 地址,寄存器   leal指令的作用是将地址加载到寄存器,对于leal S,D而言,就是实现了 &S –> D 的功能    leal S, D 结果是&S -> D   movl S,D 结果是S -> D

深入理解计算机系统(3.4)---算数与逻辑运算指令详解

耗尽温柔 提交于 2020-01-10 01:49:14
引言   上一章我们已经着重讨论了数据传送(或者说复制)指令,相信各位猿友现在都已经对此有一些了解了。说真的,LZ在看第三章的过程中,不断的被汇编的魅力深深的震撼,这些看似简单的汇编指令,却可以将复杂的程序井然有序的执行完毕,实在是让人惊叹。时至今日, 这本看似枯燥无比却实则魅力十足的书,已经深深的将LZ吸引了。   希望各位猿友也有这样的感觉,这是一种非常好的感觉,接下来,各位就一起和LZ来认识认识新的指令吧。 算术与逻辑运算指令   算术与逻辑运算包括很多种,估计各位猿友也能很快的想出来,比如最常见的加减乘除、与或非、左移右移等等。这里可能还有一个各位猿友不太容易想到的,就是取地址运算符,不过这个运算指令却是LZ看过这一部分之后,觉得最精妙的一个指令。   接下来LZ将书中的一个表格贴上来,各位猿友可以先大致浏览下里面的指令。   这里面比较特别的指令就是leal(取地址指令),其余的指令都是比较常规的算术和逻辑运算,相比之下还比较好理解,因此LZ这里重点介绍leal指令,对于其余的指令LZ不会一一介绍,接下来我们就认识一下这个特别的leal指令吧。 leal指令   leal指令是非常神奇的一个指令,它可以取一个存储器操作数的地址,并且将其赋给目的操作数。如果用C语言当中来对应的话,它就相当于&运算。   比如对于leal 4(%edx,%edx,4),%eax这条指令来讲

汇编语言第七、八章总结

无人久伴 提交于 2020-01-10 01:45:29
and和or指令 1. and指令——逻辑与指令,按位进行与运算,通过该指令可将操作对象的相应位设为0,其他位不变 2. or指令——逻辑或指令,按位进行或运算,通过该指令可将操作对象的相应位设为1,其他位不变 以字符形式给出的数据 1. 以“...”的方式指明数据是以字符的形式给出的,编译器把它们转化为相应的ASCII码 大小写转换的问题 1. 大写字母+20H=小写字母;小写字母-20H=大写字母 2. and al,11011111B 可将小写字母变为大写字母;or al,00100000B 可将大写字母变为小写字母 [bx+idata] 1. 表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata) si和di 1. 是和bx功能相近的寄存器,但是si和di不能够分成两个8位寄存器来使用 [bx+si]和[bx+di] 1. [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值) [bx+si+idata]和[bx+di+idata] 1. [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再加上idata) ( 一般来说,在需要暂存数据的时候,我们都应该使用栈 ) bx、si、di和bp 1. 只有这四个寄存器可以用在[...

计算机原理简述-处理器和汇编

吃可爱长大的小学妹 提交于 2020-01-10 01:44:49
  构成计算机的硬件系统通常有“五大件”组成:输入设备、输出设备、存储器、运算器和控制器。   简单来说,对于计算机,核心的组成就是CPU。从计算机产生到现在,其核心的作用一直都是计算、计算、计算。进行各种的数据运算。   CPU属于计算机的硬件部分,这里就涉及到了电子的东西,也就是数字电路,简单来说就是把电路给数据话。这里又区分有电,没电两种状态。这就是通常所说的高电阻、低电阻。在计算机中,把有电设为1,没电设为0。因此可以说,硬件只会识别0和1。个人猜测这大概就是二进制的由来。   举个栗子,一个简单的CPU,对输入的数据进行++运算的一个CPU,假设它四条电路,两条作为输入,两条作为输出。则根据上文提到的有无电对应1和0,可做出以下推测,当我输入00(输入口两电路均无电)则输出01,输入01则输出10,同理输入10输出11。   同时,1和0,可组成00 01 10 11,即可表示4种状态,当然一个CPU不可能只有4个角。通常我们说的CPU32位或者64位,说的就是这个CPU的输入范围的宽度,在CPU四周,有各种角,这一个角就叫做CPU的一位,bit。通常我们把8个一位称之为一个字节,也就是byte。   还是上面那个例子,两个输入口,都是用来输入数据的,这个在计算机中的术语叫做Databus,数据总线。当CPU变的再为复杂点的时候,比如不仅仅是加1操作,我还想做减1操作

在复杂模型机上编写机器指令与微程序计算海伦公式——计算机组成原理课程设计

元气小坏坏 提交于 2020-01-09 03:59:26
文章目录 一、实验内容 1. 实验目的 2. 实验目标 3.实验设备 二、实验原理 1)数据格式 2)指令设计 3)指令格式 4)指令系统 三、总体设计 四、实验步骤 1. 按图6连接实验线路,仔细检查连线后打开实验箱电源。 2. 写入实验程序,并进行校验。 3. 运行程序 五、实验结果 六、实验中遇到的问题与分析 一、实验内容 1. 实验目的 综合运用所学计算机组成原理知识,设计并实现较为完整的计算机。 2. 实验目标 在充分理解复杂模型机原理的基础上,自行编写机器指令及其对应的微程序,达到使用复杂模型机计算海伦公式的目标。 3.实验设备 PC机一台,TD-CMA实验系统一套。 二、实验原理 1)数据格式 此次使用的模型机规定采用定点补码表示法表示数据,字长为8位,8位全用来表示数据(最高位不表示符号),数值表示范围是:0≤X≤2 8 -1。 2)指令设计 根据海伦公式计算中所需要的指令,设计三大类模型机指令共十五条,其中包括运算类指令、控制转移类指令、数据传送类指令。 运算类指令包含三种运算,算术运算、逻辑运算和移位运算,设计有 6 条运算类指令,分别为:ADD、AND、DEC、SUB、OR、SAR,所有运算类指令都为单字节,寻址方式采用寄存器直接寻址。 控制转移类指令有三条 HLT、JMP、BZC,用以控制程序的分支和转移,其中HLT 为单字节指令,JMP和BZC为双字节指令