操作数

LEA指令的目的是什么?

江枫思渺然 提交于 2019-12-30 18:54:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对我来说,这就像一部时髦的MOV。 它的目的是什么?何时使用? #1楼 8086具有大量的指令集,它们接受寄存器操作数和有效地址,执行一些计算以计算该有效地址的偏移量部分,并执行一些涉及寄存器和所计算地址所指向的存储器的操作。 让该系列中的指令之一按上述方式操作非常简单,只是跳过了实际的内存操作。 这个,说明: mov ax,[bx+si+5] lea ax,[bx+si+5] 在内部几乎完全相同。 区别是跳过的步骤。 两种指令的工作方式如下: temp = fetched immediate operand (5) temp += bx temp += si address_out = temp (skipped for LEA) trigger 16-bit read (skipped for LEA) temp = data_in (skipped for LEA) ax = temp 至于为什么英特尔认为该指令值得包括在内,我不确定,但是实施起来便宜的事实将是一个很大的因素。 另一个因素可能是英特尔的汇编器允许相对于BP寄存器定义符号的事实。 如果将 fnord 定义为BP相对符号(例如BP + 8),则可以说: mov ax,fnord ; Equivalent to "mov ax,[BP+8]"

JS--我发现,原来你是这样的JS(三)(基础概念--灵魂篇)

£可爱£侵袭症+ 提交于 2019-12-30 05:28:33
一、介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第三篇(灵魂篇介绍),有着剩下的第三章的知识内容。 红宝书这本书可以说是难啃的,要看完不容易,挺厚的,要看懂更不容易,要熟练js更是难,中间需要不断的积累与重温。 本书不是读一两遍就能把这书吃透,需要多读,可谓温故而知新,可以为师矣。 很多人看这些厚的书都是三天打鱼两天晒网,很少能看下去,能记住的东西往往前3章的内容,所以我写博客就是为了能和大家一起来读这本书,一起学JS。 二、基本概念(灵魂篇) 上一篇是躯壳篇讲的是一些了解性的东西,而接下来便说内涵(数据类型和操作符),换作中文来看就如同让你理解词和含义,语句的含义,就像将这些字和语句注入灵魂。 同系列: 第一篇:JavaScript--我发现,原来你是这样的JS(初识) 第二篇:JavaScript--我发现,原来你是这样的JS(基础概念--躯壳篇) 三、数据类型 js的数据结构有6种,5种基本类型和一种复杂类型。js中不支持任何自定义的数据类型,所以说就这6种就够了。 5种基本数据类型: Undefined Null Boolean Number String 1种复杂类型: Object类型 1.1 typeof操作符 该操作符可以检测某变量是什么数据类型。 typeof返回的值: "undefined" -- 表示这个值没有被定义 "string"

c# $、@ 、??用法

六眼飞鱼酱① 提交于 2019-12-27 14:03:43
c# $用法 https://blog.csdn.net/kebi007/article/details/52612610 @ 在 C# 中的用法 https://www.cnblogs.com/Jinglecat/archive/2007/05/26/760270.html ??用法: 1.可空类型修饰符(?): 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。 例如:string str=null; 是正确的,int i=null; 编译器就会报错。 为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?“来表示,表现形式为"T?” 例如:int? 表示可空的整形,DateTime? 表示可为空的时间。 T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时编译器编译 时会把T?编译成System.Nullable的形式。 例如:int?,编译后便是System.Nullable的形式。 2.三元(运算符)表达式(??: 例如:x?y:z 表示如果表达式x为true,则返回y;如果x为false,则返回z,是省略if{}else{}的简单形式。 3.空合并运算符(??): 用于定义可空类型和引用类型的默认值。如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。 例如:a??b

黑马程序员---ios学习日志8

好久不见. 提交于 2019-12-26 15:21:51
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- sizeof运算符 sizeof运算符是c语言的一种单目操作符。sizeof操作符已字节形式给出其操作数的储存大小。操作数可以是一个表达式或者括在括号里的类型名。操作是的储存大小由操作数的类型决定。 sizeof的使用方法 sizeof(type) 数据类型必须用括号括住 #include <stdio.h> int main(int argc ,const char*argv[]){ // sizeof 在内中在内存中占得字节数   int result=0; result=sizeof(1); printf(“result=%d\n”,result);      //sizeof计算变量在内存中暂用的字节数   int a=10; result1=sizeof(a); printf(“result=%d\n”,result1); return 0; } 来源: https://www.cnblogs.com/luxuezhu/p/4653703.html

未定义的行为和顺序点

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-26 10:41:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 什么是“序列点”? 未定义行为与序列点之间有什么关系? 我经常使用有趣和复杂的表达式,例如 a[++i] = i; ,让自己感觉好些。 为什么我应该停止使用它们? 如果您已阅读此书,请务必访问后续问题 未定义行为和重载序列点 。 (注意:这本来是 Stack Overflow的C ++ FAQ 的条目。如果您想批评以这种形式提供FAQ的想法,那么 在所有这些 都 开始的meta上的张贴 将是这样做的地方。该问题在 C ++聊天室 中进行监控,该问题最初是从FAQ想法开始的,所以提出这个想法的人很可能会读懂您的答案。) #1楼 C ++ 98和C ++ 03 此答案适用于C ++标准的较旧版本。 该标准的C ++ 11和C ++ 14版本没有正式包含“序列点”。 操作是“先于”或“未排序”或“不确定地排序”。 最终效果基本相同,但是术语不同。 免责声明 :好的。 这个答案有点长。 因此阅读时要有耐心。 如果您已经知道这些事情,那么再次阅读它们不会使您发疯。 先决条件 : C ++标准 的基础知识 什么是序列点? 标准说 在执行序列中某些特定的点(称为 顺序点)上 ,以前评估的所有 副作用 都应完整,并且以后评估的 副作用 都不应发生。 (第1.9 / 7节) 副作用? 有什么副作用? 对表达式的求值会产生某些结果

8086CPU指令系统--汇编语言数据转送指令(MOV,PUSH/POP,LEA)

人盡茶涼 提交于 2019-12-25 22:50:07
通用的数据转送指令MOV: 指令格式: MOV dest,src ;dest←src 功能:将源操作数的内容送至目的操作数。MOV指令对各标志位无影响。在MOV指令中,两个操作数可以是字,也可以是字节,但两者必须登长。 注意: 段寄存器CS只能做源操作数,不能做目的操作数 源操作数和目的操作数不能同时为存储单元操作数 立即数不能直接传送给段寄存器,且不同段寄存器之间不能进行传送 MOV AX,BX ;将寄存器BX的数据传送给AX MOV [3000H],DX ;将DX中的数据传送到存储器3000H单元 MOV [SI],DS ;将DS内容传送到SI所指示的单元 堆栈操作指令PUSH/POP 指令格式: PUSH src ;SP←(SP)-2,(SP)+1:(SP)←(src) POP dest ;dest←[(SP)+1:(SP)],SP←(SP)+2 功能:对堆栈的信息进行存取,不影响标志位,常用于子程序的调用和返回过程中保存程序中的某些信息 注意: 堆栈的使用要遵循LIFO的准则 堆栈中的操作数均为自操作数,不能为字节操作数 PUSH指令可以使用CS寄存器,但POP指令不允许使用CS寄存器 8086/8088CPU堆栈操作可以使用除立即寻址以外的任何寻址方式 PUSH AX ;若给定(SP)=00F8H,(SS)=2500H, ;执行之后(SP)=00F6H,(250F6H)

SIMD指令集

▼魔方 西西 提交于 2019-12-25 05:50:11
概述 SIMD,即Single Instruction, Multiple Data,一条指令操作多个数据。是CPU基本指令集的扩展。主要用于提供fine grain parallelism,即小碎数据的并行操作。如说图像处理,图像的数据常用的数据类型是RGB565, RGBA8888, YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的。如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据确只能用于他们的低8位,似乎有点浪费。如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍.SIMD指令的初衷就是这样的,只不过后来慢慢cover的功能越来越多. 好多处理器都有SIMD指令,我们先仅关注Intel的SIMD。Intel的初代SIMD指令集是MMX,Multi-Media Extension, 即多媒体扩展,因为它的首要目标是为了支持MPEG视频解码.MMX将64位寄存当作2X32或8X8来用,只能处理整形计算.这样的64位寄存器有8组,分别命名为MM0~MM7.这些寄存器不是为MMX单独设置的,而是借用的FPU的寄存器,也就是说MMX指令执行的时候,FPU就没有办法工作。后来Intel进一步实现了SSE, SSE2~SSE4指令集,给了他们单独的寄存器,之后MMX就被停掉了。

JVM之虚拟机栈

帅比萌擦擦* 提交于 2019-12-24 16:39:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> java虚拟机栈描述的是java方法执行的是内存模型,它也是 线程私有 的。虚拟机栈是用于存放java方法信息的一块内存区域,因为方法的执行是线程级别的,所以虚拟机栈的生命周期与线程的生命周期相同。在每个方法在执行的时候都会创建一个栈帧。在栈帧中包含了 局部变量表,操作数栈,动态链接,returnAddress (方法返回值),和一些额外的 附加信息 。 在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法的code(方法表:java代码编译成的字节指令)中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决与具体的虚拟机实现。一个线程中的方法调用链可能会很长,很多方法都同时处于执行状态。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为:当前栈帧,,与这个栈帧关联的方法成为:当前方法。执行引擎运行的所有字节码指令都只对当前栈帧进行操作。 在Java虚拟机规范中对这块区域定义了 两种异常状况 : 第一种 :如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常; 第二种 :如果虚拟机栈申请动态扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。 关于栈帧中的信息如下图: 1

吃可爱长大的小学妹 提交于 2019-12-24 04:21:05
栈可以理解为一个有底的瓶子, 先进后出,后进先出,这是栈的特点 。在栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入、删除数据。当然,也不能简单将其定性为“局限性”。因为特定的数据结构是为了对应特定场景,数组、链表暴露了很多操作接口显得比较灵活,但是使用起来可控性上不强,容易出问题。 当某个数据集合只涉及在一端插入和删除数据、且满足先进先出、后进后出的特点时,首选栈。 实现 栈可以使用数组、链表来实现,数组实现的栈叫做顺序栈,链表实现的栈叫做链式栈。 基于数组实现: public class ArrayStack { private String [ ] items ; //数组 private int count ; //栈中元素个数 private int n ; //栈大小 //构造中初始化数组,申请大小为n的数组空间 public ArrayStack ( int n ) { this . n = n ; this . items = new String [ n ] ; this . count = 0 ; } //入栈操作 public boolean push ( String item ) { //数组空间不足,入栈失败 if ( count == n ) return false ; //将item放在下标为count的位置 items [

运算符

允我心安 提交于 2019-12-24 04:00:28
目录 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 运算符优先级 算数运算符 假设 A = 10,B = 20。 算符 描述 实例 + 把两个操作数相加 A + B 将得到 30 - 从第一个操作数中减去第二个操作数 A - B 将得到 -10 * 把两个操作数相乘 A * B 将得到 200 / 分子除以分母 B / A 将得到 2 % 取模运算符,整除后的余数 B % A 将得到 0 ++ 自增运算符,整数值增加 1 A++ 将得到 11 -- 自减运算符,整数值减少 1 A-- 将得到 9 #include <stdio.h> int main() { int a = 21; int b = 10; int c ; c = a + b; printf("Line 1 - c 的值是 %d\n", c ); c = a - b; printf("Line 2 - c 的值是 %d\n", c ); c = a * b; printf("Line 3 - c 的值是 %d\n", c ); c = a / b; printf("Line 4 - c 的值是 %d\n", c ); c = a % b; printf("Line 5 - c 的值是 %d\n", c ); c = a++; // 赋值后再加 1 ,c 为 21,a 为 22 printf(