汇编指令

第二章总结

余生长醉 提交于 2020-03-24 02:27:59
第二章总结 1 、 8086CPU 概述 8086 是 Intel 系列中 16 位微处理器,地址总线 20 位。 8086 有 14 个 16 位寄存器: AX, BX, CX, DX( 通用寄存器) SI, DI, BP, SP (基址和变址寄存器) CS, SS, DS, ES (段寄存器) IP,PSW (指令指针和标志寄存器) ( 汇编语言中不区分大小写 ) 2 、通用寄存器(用于存放一般性数据,每个寄存器均为 16 位) 通用寄存器 AX,BX,CX,DX 均可拆成两个 8 位寄存器(以 AX 为例,低 8 位寄存器为 AL ,高 8 位为 AH )单独使用。 3 、字在寄存器中的存放 字节:内存划分的基本单位( Byte ),一个字节由 8 个 bit 位组成。 字 : 两个字节组成,分别为字的高位字节和低位字节 任何数据到了计算机里都是由二进制数存放的。以 AX 为例可以存 16 位二进制数,每四位二进制数对应一个十六位进制数 十进制数据: 20000 → AX 对应的二进制: 100 1110 0010 0000 B 对应的十六进制: 4E20 H (其中 AL=4EH,AL=20H) 4 、汇编指令 Mov 指令中有两个操作数,作用是将后面的操作数赋给前面的操作数。 Add 指令中有两个操作数,作用是将前后的操作数相加,赋给前面的操作数。 ** 注:( 1 )在

汇编语言第二章

。_饼干妹妹 提交于 2020-03-24 02:27:40
基本框架: 寄存器: 寄存器是cpu的主要部件,是程序员可以用指令读写的部件。 8086cpu有14个寄存器:AX,BX,CX,DX(通用寄存器)SI,DI,SP,BP(基址和变址寄存器)IP,(指令指针和标志寄存器)CS,SS,ES,DS(段寄存器) 通用寄存器:AX,BX,CX,DX。这4个寄存器可以分为两个可独立使用的8位寄存器(最大可以存放值为255的数据)来使用。其中0~7位为低位字节(L),8~15位为高位字节(H),如AH、AL。 一般用16进制来表示一个数据。 字在寄存器中的存储:8086cpu可以一次性处理字节和字两种尺寸的数据 字节:内存划分的基本单位:由8个bit位组成,可以放在8位寄存器中。 字:由两个字节组成,可以放在16位寄存器中。 双字:四个字节。 四字:八个字节。 汇编指令:mov、add: 进位导致的最高位的丢失。(这里的丢失不是cpu真的丢弃这个进位制,存放在别的地方,后面会学) 低位与高位寄存器是两个不同的寄存器,相互是独立的。 在进行数据传送或运算时要注意指令的两个操作对象的位数是一致的。 8086cpu给出物理地址(所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间都有唯一的地址)的方法:8086cpu有20位地址总线,但其又是16位结构。所以解决方案:物理地址=段地址*16+偏移地址。 段地址*16:左移4位(2进制

汇编语言第二章总结

情到浓时终转凉″ 提交于 2020-03-24 02:26:48
  在 CPU 中 主要部件是 寄存器 ,负责信息的存储功能,而这正是第二章的重点。   下面将知识点总结如下: 一、 不同CPU寄存器个数,结构都不同。8086CPU有14个寄存器分别为: AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW 这些寄存器都是16位,即可存放两个字节。 其中AX、BX、CX、DX为通用寄存器,都可分为两个可独立使用的8位寄存器来用。(前八位为H,后八位为L,例如AX可分为AH,AL) 二、 几条汇编指令 1.move xx,num   将num送入寄存器xx; 2.add xx,num   将寄存器xx的数值加上num; 3.move xx,yy   将寄存器yy的数值送入寄存器xx; 4.add xx,yy   将寄存器xx,yy的值相加并存在xx中; (其中英文大小写无影响mov ax,18和MOV AX,18含义相同) (其中num如62627为十进制数字,计算时应化为16进制F4A3H计算(H为16进制标识)) Tips:错误指令如下: mov ax,bl  不能在8和16位寄存器中传送数据 mov bh,ax  不能在16和8位寄存器中传送数据 mov al,20000  在8位寄存器中存放值超过极限255 add al,100H  不能将高于8位数据加到一个8位寄存器中 三、

《汇编语言》第二章总结

守給你的承諾、 提交于 2020-03-24 02:24:50
汇编语言(面向机器的程序设计语言) 第二章 信息的大本营——寄存器 CPU概述 一个典型的CPU由运算器、控制器、寄存器等器件组成。运算器进行信息处理,寄存器进行信息存储,控制器控制各种器件进行工作。 内部总线连接各种器件,在它们之间进行数据的传送,实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。这个章节所介绍的寄存器是CPU中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对CPU的控制。 不同的CPU,寄存器的个数和结构都是不同的。8086CPU有14个寄存器,每个寄存器都有对应的名称分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 2.1 通用寄存器 8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。以AX为例,16位寄存器的逻辑结构如下图: 16位寄存器的逻辑结构, 其存放的无符号数据范围:0 ~ 2^16 -1 为了与早期CPU操作兼容,这4个寄存器均可拆分成两个8位寄存器单独使用,分别为AX分为AH和AL,BX分为BH和BL,CX分为CH和CL,DX分为DH和DL,下面以AX为例: AH和AL存放的无符号数据范围:0 ~ 2^8 -1 一个字由两个字节组成,可以存在一个16位寄存器中

《汇编语言(第二章)》课后小结

ε祈祈猫儿з 提交于 2020-03-24 02:22:34
通过本章的学习:了解通用寄存器,掌握字数据在寄存器中的存储,理解段的概念,了解段寄存器,掌握汇编指令mov, add和jmp的基本用法。 一个典型的CPU由运算器、控制器、寄存器等器件组成。内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。本课程内容介绍基于8086CPU, 8086是Intel系列中16位微处理器,地址总线20位。 CPU字长是指CPU在单位时间内能一次处理的二进制位数。该指标反映出CPU内部运算处理的速度。而位宽是指CPU通过外部数据总线与内存之间一次能够传送的数据位。 关于ISA,一个处理器支持的指令和指令的字节级编码称为它的ISA。不同处理器“家族”系列,有不同的ISA。同一系列里也有不同类型的处理器。虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同的类型在ISA级别上都保持着兼容。 指令使用注意事项,(1) 在mov和add指令中,两个操作对象的位数应一致。(2)运算时超出寄存器表示的位数的情形,例如:设(AX) = 8226H, (BX) = 8226H,执行ADD AX, BX后, (AX) =044CH,本来8226H+8226H=1044CH,舍弃高位的1,最后取044CH。 8086结构表示物理地址的障碍,8086内部的寄存器都是16位的,而外部地址总线宽度为20位

[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 柒 - 条件指令及其他 | 4. 无符号比较设置 (SCC, SHI, SLS, SCS)

泪湿孤枕 提交于 2020-03-23 16:53:51
**注意:**本文经过原作者授权转译,转载请标明出处 原文地址: http://mrjester.hapisan.com/04_MC68/Sect07Part04/Index.html 条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉 翻译若有不足之处欢迎批评指正 译文: "真正的艺术家总是紧紧盯着神明,然后悄悄地偷走她的智慧结晶" ---- 托马斯 伊肯斯 (Thomas Eakins, 1844-1916),美国学院派现实主义画家、美术教育家 简介 这四个 S** 指令会根据 无符号的运算结果 设置或是擦除 目标操作数 ,有点类似 BCC, BHI, BLS 和 BCS 指令 SCC 指令 SCC (Set on Carry Clear) - 大于等于 (≥) 时置 1 如果 C 的内容是 0 的话, 目的操作数 会被置为 1 (% 11111111 ),否则, 目的操作数 会被置 0 (% 00000000 ) 例子 这条指令通过 C 状态标志是否是 0 来检测计算结果是不是大于等于 (≥),有趣的是当 C 的内容是 0 的时候,计算结果总是"大于等于": cmpi .b #$20 , d0 scc .b d1 我们假定 d0 的内容是 00000098 , CMP 指令使用的长度是 字节 ,所以会在 20 与 98 之间比较 98 大于 20 , C

20145205 《信息安全系统设计基础》第5周学习总结

喜你入骨 提交于 2020-03-23 03:17:00
教材学习内容总结 程序编码 GCC将源代码转化为可执行代码的步骤: C预处理器——扩展源代码-生成.i文件 编译器——产生两个源代码的汇编代码-——生成.s文件 汇编器——将汇编代码转化成二进制目标代码——生成.o文件 链接器——产生可执行代码文件 机器级代码 1.机器级编程的两种抽象 (1)指令集结构ISA 是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。 (2)机器级程序使用的存储器地址是虚拟地址 看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。 2.几个处理器: 程序计数器(CS:IP) 整数寄存器(AX,BX,CX,DX) 条件码寄存器(OF,SF,ZF,AF,PF,CF) 浮点寄存器 一条机器指令只执行一个非常基本的操作。 程序编码 书上107页的代码,需要用到反汇编器。在Linux系统中,带‘d’命令行标志的程序OBJDUMP可以充当这个角色。 数据格式 数据传送指令的三个变种: movb 传送字节 movw 传送字 movl 传送双字 访问信息 一个IA32中央处理单元(CPU)包含8个存储32位置的寄存器 操作数指示符 立即数 寄存器 存储器 寻址方式 (1)立即数寻址方式 格式:$后加用标准c表示法表示的整数,如 $0xAFF (2)寄存器寻址方式 如%eax,与汇编中学过的AX寄存器类比。 (3

【华为云技术分享】如何将90%的代码自动迁移到鲲鹏平台上

荒凉一梦 提交于 2020-03-19 13:25:05
主讲人:华为云云享专家 张老师 大家好,今天要讲的主题是关于软件迁移,这是一个久远的话题,因为但凡牵扯到切换平台、CPU架构的变化,甚至一些语言版本的升级,都可能会面临到软件迁移的问题。今天我们就探讨一下软件移植过程的原理,以及如何进行软件迁移。 在软件移植的过程当中,如何帮助开发者提升效率,如何把华为沉淀下来的软件开发以及移植的经验反馈给开发者,帮助开发者加速软件开发的进度,降低成本,这是我们一直关注的问题,为此,我们还推出了鲲鹏的开发套件,帮助用户做软件的移植,以及做基于鲲鹏平台的性能加速。 其实一提到软件移植,如果是做了比较底层软件的话,大家可能会用到一些 汇编这样的底层语言 。 它和机器的硬件架构强相关 ,当你在从一个平台切换到另外一个平台的时候,这些强相关的语言势必要 进行一次代码移植, 跟我们所采用的编程语言以及移植的平台环境强相关。当我们用汇编代码或者是用这种编译型语言的时候,就会面临着一些移植的问题和挑战,有些问题通过编译器能解决, 有些问题特别是一些低阶的代码或者比较底层的代码, 就要手工去查手册 , 然后去把它相应的转换成新平台所使用的机器码。 上图列出了鲲鹏处理器和x86处理器的指令差异,列了一个简单的两个数相加,两个int型相加的这样一个简单程序。通过GCC编译完之后,通过OMGD,就能看到指令的具体的格式形式以及相应的对应的汇编代码。可以看出

C程序的编译过程

末鹿安然 提交于 2020-03-17 10:42:59
某厂面试归来,发现自己落伍了!>>> 转自: http://blog.csdn.net/lw1a2/archive/2006/12/10/1437402.aspx 编译 , 编译程序读取源程序(字符流) , 对 之进行词法和语法的分析 , 将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对 可执行文件格式的要求链接生成可执行程序。 C源程序头文件-->预编译处理(cpp)-->编译程序本身 -->优化程序-->汇编程序-->链接程序-->可执行文件 1.编译预处理 读取c 源程序,对其中的伪指令(以 # 开头的指令)和特殊符号进行处理 [析] 伪指令主要包括以下四个方面 (1) 宏定义指令,如 #define Name TokenString,#undef 等。对于前一个伪指令,预编译所要做的是将程序中的所有 Name 用 TokenString 替换,但作为字符串常量的 Name 则不被替换。对于后者,则将取 消对某个宏的定义,使以后该串的出现不再被替换。 ( 2 )条件编译指令,如 #ifdef,#ifndef,#else,#elif,#endif, 等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件, 将那些不必要的代码过滤掉 ( 3 )头文件包含指令,如 #include

走进 Java Volatile 关键字

核能气质少年 提交于 2020-03-17 07:50:43
Java Volatile 关键字是一种轻量级的数据一致性保障机制,之所以说是轻量级的是因为 volatile 不具备原子性,它对数据一致性的保障体现在对修改过的数据进行读取的场景下(也就是数据的可见性)。比起对读操作使用互斥锁, volatile 是一种很高效的方式。因为 volatile 不会涉及到线程的上下文切换,以及操作系统对线程执行的调度运算。同时 volidate 关键字的另一个功能是解决“指令重排序问题”。 Volatile 可见性承诺 Java volatile关键字保证了跨线程更改线程间共享变量的可见性。这可能听起来有点抽象,让我们详细说明一下。 在多线程应用程序中,线程对 non-volatile 变量进行操作,出于性能原因,每个线程在处理变量时,可以将它们从主内存复制到CPU缓存中。如果你的计算机包含一个以上的CPU,每个线程可以在不同的CPU上运行。这意味着,每个线程可以将同一个变量复制到不同CPU的CPU缓存中。这就和计算机的组成和工作原理息息相关了,之所以在每一个 CPU 中都含有缓存模块是因为出于性能考虑。因为 CPU 的执行速度要比内存(这里的内存指的是 Main Memory)快很多,因为 CPU 要对数据进行读、写的操作,如果每次都和内存进行交互那么 CPU 在等待 I/O 这个过程中就消耗了大量时间