操作数

程序的机器级表示

有些话、适合烂在心里 提交于 2019-12-01 07:28:24
机器级代码 在计算机中最终执行的都是机器代码,汇编代码、C 语言代码和高级语言的代码都需要转换成机器代码来执行。文章涉及的机器语言主要指 Intel IA32。 如下一段 C 语言代码: 1 int accum = 0; 2 3 int sum(int x, int y) 4 { 5 int t = x +y; 6 accum += t; 7 return ; 8 } 通过 gcc -m32 -O1 -o code.o -c code.c 生成二进制格式的目标代码文件 code.o,通过 hexdump 查看文件内容,在计算机中最终执行的字节指令是: 通过 objdump -d code.o 反汇编查看这段二进制对应的汇编内容: 这里的指令 55 对应了汇编代码 push %ebp,汇编代码非常接近于机器代码,它用可读性更好的文本表示处理器执行的指令。 除了像上面那样通过反汇编目标文件查看对应的汇编代码,还可以通过 gcc 查看 C 编译器产生的汇编代码,如下命令会产生一个汇编文件 code.s 。 # -m32 表示用 32 位模式编译 gcc -O1 -m32 -S code.c 数据格式 虽然 C 语言可以在存储器中声明和分配各种数据类型的对象,但是机器代码只是简单地将存储器看成是一个很大的、按字节寻址的数组。C 语言中的聚合数据类型,例如数组和结构

2019-2020-1 20175320 《信息安全系统设计基础》第五周学习总结

倾然丶 夕夏残阳落幕 提交于 2019-12-01 07:23:15
2019-2020-1 20175320 《信息安全系统设计基础》第五周学习总结 一、教材学习内容总结 本周我们了解了在计算机系统中程序的机器级表示。通过反汇编器可以将机器码转化为类似汇编代码的格式,而该章节内容的主要介绍了在x86-64中的汇编指令以及汇编指令与c代码之间的转化。虽然同样是汇编,但与我们上学期学习的8086中的汇编语句有着一定的区别,以下是本章节需要注意的内容: objdump命令:通过 objdump -d 文件名+后缀 可以将机器码转化为汇编代码,这是进行分析的重要前提条件。 寄存器的前缀不同,对应的存储长度不同。%r是64位、%e是32位、%是16位及以下的寄存器,在进行算术和逻辑操作时,必须通过前缀选择正确长度的寄存器。 操作数有多种寻址方式,我们需要熟悉各种虚拟地址的寻址方式。 x86-64中的数据传送指令以及各种算术和逻辑操作指令的两个操作数的关系相较于8086是相反的,这是与8086最大的区别。 各种操作指令可以通过后缀来指定数据的位数,或者进行数据长度之间的转换,但操作指令规定的长度一定要与寄存器长度相匹配,比如movq、movabsq、movswl等指令。 在使用mov指令时,不可以两个操作数同为存储器,且立即数不能作为目的地址。 在x86-64中,栈操作指令总是以四字作为出以及入栈的单位。 在移位操作中,左移与右移的效果有所区别

Java运算符及优先级(全)

為{幸葍}努か 提交于 2019-12-01 06:16:18
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 Java运算符分为以下几种: • 算术运算符:+,-,*,/,%,++,-- • 赋值运算符:= • 扩展后的赋值运算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>= • 位运算符:&,|,~,^,<<,>>,>>> • 比较运算符:>,>=,<,<=,== • 逻辑运算符:&&,&,||,|,!,^ • 三目 运算符:? : 1、算术运算符 1)+:加法运算符 例如如下代码: int a = 1; int b = 2; int sum = a+b; System.out.println(sum); //sum的值为3 另外,+还可以作为字符串的连接运算符。 2)-:减法运算符 例如如下代码: int a = 3; int b = 2; int sub = a-b; System.out.println(sub); //sub的值为1 3)*:乘法运算符 例如如下代码: int a = 5; int b = 6; int multiply = a*b; System.out.println(multiply ); //multiply 的值为30 4)/:除法运算符 例如如下代码: int a = 10; int b = 5; int div = a/b; System.out.println

【C#教程09】C# 运算符

柔情痞子 提交于 2019-12-01 04:37:34
C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本教程将逐一讲解算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符。 算术运算符 下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则: 运算符描述实例 +把两个操作数相加 A + B 将得.. C# 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本教程将逐一讲解算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符。 算术运算符 下表显示了 C# 支持的所有算术运算符。假设变量 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 实例

2.1.5 指令级并行【译】

僤鯓⒐⒋嵵緔 提交于 2019-12-01 02:05:25
计算机设计师致力于提升他们设计的机器的性能。提升时钟速度是让运行芯片更快的一种方法,但是任何新的设计都不得不受限于当时的历史环境。因此,大部分计算机体系结构在给定时钟速度的情况下,依靠并行(同时处理两件或以上的事务)来获得更多性能。 并行分为指令级并行和处理器级并行两种。前者的并行指的是运用内部独立指令来获取更多的指令输出。后者的并行指的是多个CPU同时运行来解决相同的问题。两种方案各有优势。在本节我们将研究指令级并行;下一节我们研究处理器级并行。 流水线 众所周知,从内存中读取指令这一过程是影响指令执行速度的一大瓶颈。为了缓和这个问题,老古董IBM Stretch(1959)能提前从内存中读取指令,这样当用到这些指令时,它们已经被读取过了。这些指令被存在一组特殊的寄存器中,它就是预取缓冲器。这样,当需要一个指令时,通常从缓冲器中取出而不是等待内存读取完成。 实际上,预取指令的执行可以分为两部分:读取和实际执行。流水线得概念更加深入的执行了这个策略。相比于仅仅被分成两部分,指令的执行通常被分为许多部分(十几个或更多),每个部分由专门的一块硬件处理,所有部分可以并行执行。 图2-4(a)表示一个五单元流水线。第一步从内存读取指令,然后把它放入缓冲区直到被取出。第二步对指令解码,获取指令类型和它需要的操作子。第三步定位并获取操作子,每个操作子都是从内存或寄存器中读取

P1044 栈

我的梦境 提交于 2019-12-01 01:21:09
题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作,即 pop p o p(从栈顶弹出一个元素)和 push p u s h(将一个元素进栈)。 栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。 题目描述 宁宁考虑的是这样一个问题:一个操作数序列, 1,2,...,n 1 , 2 , . . . , n(图示为1到3的情况),栈 A A的深度大于 n n。 现在可以进行两种操作, 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push p u s h操作) 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop p o p操作) 使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 1 2 3生成序列 2 3 1 2 3 1的过程。 (原始状态如上图所示) 你的程序将对给定的 n n,计算并输出由操作数序列 1,2,…,n 1 , 2 , … , n经过操作可能得到的输出序列的总数。 输入格式 输入文件只含一个整数 n(1≤n≤18) n ( 1 ≤ n ≤ 1 8 ) 输出格式 输出文件只有 1 1行,即可能输出序列的总数目 输入输出样例 输入 #1 复制 3

JS中 [] == ![]结果为true,而 {} == !{}却为false

只谈情不闲聊 提交于 2019-11-30 21:03:27
为什么? 先转换再比较 (==) 仅比较而不转换 (===) ==转换规则?     ==比较运算符会先 转换操作数 (强制转换),然后再进行比较 ①如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1; ②如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值; 在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则 [ ] == ![ ] 解题思路? ![] 会变成 false,false会变成0;也就是==右侧 是 0; ==在进行比较前,如果有一侧是数字,会将另一侧也转化为数字类型,才会进行比较。 Number([]) // 0; 先在等号左侧也是0 两侧都是0 所以是true。 [] == ![] -> [] == false -> [] == 0; ==右侧的转换 因为右侧是数字,所以左侧也要转换为数字类型,才会进行比较 Number([]) == 0 -> 0 == 0 //true [] == [] // false 在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则 对于对象(数组也是对象)只看双方地址,地址一样则返回true,所以[]===[]地址不一样,返回fasle。   {}=={} // false 同理,等号两侧类型相同,采用三等号判定,比的是地址

C++位运算符

ぃ、小莉子 提交于 2019-11-30 19:07:11
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。 C 语言提供的位运算符列表: 运算符 作用 示例 & 按位与 两个操作数同时为1结果为1 | 按位或 两个操作数只要有一个为1,结果就为1 ~ 按位非 操作数为1,结果为0;操作数为0,结果为1 ^ 按位异或 两个操作数相同,结果为0;不相同结果为1 << 左移 右侧空位补0 >> 右移 左侧空位补符号位 1 、“按位与”运算符(&) -- 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B= true。 例如: 3&5 3 的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2

CF734E Anton and Tree

泪湿孤枕 提交于 2019-11-30 18:54:02
\(\mathtt{CF734E}\) \(\mathcal{Description}\) 给一棵 \(n(n\leq200000)\) 个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块变成另一种颜色,求使整棵树变成一种颜色的最少操作数。 \(\mathcal{Solution}\) 这棵树中每个点为黑点或白点,然后最后也只要求出最小操作数,对于一个联通块,我们选择其中任何一个节点进行染色的效果是一样的(都会把这个联通块变成同一个颜色),于是我们自然而然的可以想到缩点。然后样例中的树就可以是 (贺个图 \(qwq\) ) 可以看出我们把这个树从原先的树变成了一棵异层颜色相异(也就是黑白相间)的树,如果当前是一条链,我们要是最后操作数是最小的,我们一定会选择从中间开始染色,所以对于一棵树,我们只需要选择他的直径进行染色,最后的答案就是 \((直径+1)/ 2\) 。 \(\mathcal{Code}\) #include<bits/stdc++.h> using namespace std; const int N = 2e5 + 10; int n, color[N]; vector<int> a[N]; inline int read() { int x = 0, k = 1; char c = getchar(); for (; c < 48 || c >

【计算机组成原理】指令系统

人盡茶涼 提交于 2019-11-30 14:27:46
一、指令格式 指令:操作码字段 地址码字段 指令字(简称指令):表示一条指令的机器字。 指令格式:是指令自用二进制代码表示的结构形式,由操作码字段和地址码字段组成。 操作码字段:表征指令的操作特性与功能 ( 指令的唯一标识 ) 不同的指令操作码不能相同 地址码字段:指定参与操作的操作数的地址码 二、操作码分类 操作码可以分为固定长度的代码和可变长度的代码 1、固定长度的代码 多有指令操作码的长度相等 例如:某计算机共有64条指令,采用固定长度操作码,需要6位编码,从000000~111111 2的6次方为64 优点:编码方法简单,便于指令的译码 确定:不方便指令系统中增加新的指令(扩展不方便) 2、可变长度的代码 不等长的指令操作码可以减小操作码的平均长度,提高指令编码的效率,从指令的扩展性来看,也希望操作码长度可变。 例如:设某台计算机有100条指令,要求: 1)采用固定长度操作码编码,请设计其操作码编码 2)假设这100条指令中有10条指令的使用改了达到90%。其余90条指令的使用概率达到10%,请采用不定长编码设计一种操作码编码的方案,并求出操作码的平均长度 (常用指令用短编码 不常用指令用长编码) 答、1)采用固定长度操作码编码,需要7位操作码,取其中100个代码作为操作码 0000000~1100011之间的代码代表100条指令(长度为7) 其余的1100100