汇编指令

python day1

六月ゝ 毕业季﹏ 提交于 2020-01-14 00:14:18
第一章 什么是python 使用python的公司 Google ,dropbox(美国版百度网盘,py的创始人Guido van Rossum目前就在dropbox),YouTuBe(全球最大的视频网站),UBER,Quora(美国版的知乎),instagran(美国版的朋友圈,被facebook收购9亿美金,整个公司才13个人);yelp(世界杯大众点评),豆瓣,知乎; 初创公司比较喜欢使用python。 就业前景 Pythone未来十年发展预测 未来十年,python在中国的发展会怎样?使用python的企业会不会越来越多?python主要被运用的领域有哪些?使用Python的程序员会越来越多还是越来越少? Life is short,you need python! 计算机语言 计算机只能识别的语言为二进制,0和1, 编程语言种类 汇编语言 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作。例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的

read time stamp counter

萝らか妹 提交于 2020-01-13 04:23:33
  在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样: inline unsigned __int64 GetCycleCount() { __asm RDTSC } 但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下: inline unsigned __int64 GetCycleCount() { __asm _emit 0x0F __asm _emit 0x31 } 来源: https://www.cnblogs.com/gaoqichao/archive/2012/12/10/2812050.html

计算机原理扫盲

孤人 提交于 2020-01-13 01:15:51
1 计算机系统 CPU(运算器+控制器),存储器,总线,输入输出。 2 运算器与运算方法 2.1计算机中数据表示 进制转换 定点数 浮点数 非数值数据表示(ASCII码等) 2.2定点浮点加减乘除,移位运算 运算器:(Arithmetic Logic Unit),二进制数据进行算术运算(加、减、乘、除)和逻辑运算(与、或、非、移位) 3 控制器与指令系统 协调各部件工作,功能包括顺序控制,操作控制和时间控制 3.1顺序控制 保证程序指令执行完后正确读取下一条指令 3.2操作控制 执行指令产生指令所需的控制信号 3.3时间控制 将控制信号按照一定的时间顺序发送给相应部件,控制各个部件完成相应动作,实现指令功能 接口与输入输出 3.4 指令系统 3.4.1 定义 计算机所能执行的全部指令的合集 3.4.2 机器指令 机器指令形式上是一串二进制码,指令需要表示1操作,2对谁操作,3操作结果的去向(指令的操作对象) 3.4.3 机器指令组成 1操作码(OP),2地址码(A) 3.4.4 机器指令的几种形式 1零地址指令 OP 两种情况 1不需要操作对象,如停机指令,空操作指令 2需要一个对象,操作对象可以隐含,指令地址也隐含,如堆栈,累加器的操作指令(对应汇编中的隐式操作如RET等) 2单地址指令 OP|A 两种情况 1一个操作对象,操作对象不隐含,必须用一个地址码,如加加1指令,减1指令

Python基础

混江龙づ霸主 提交于 2020-01-12 08:53:30
阅读目录 编程语言介绍 python介绍 python安装 第一个python程序 变量 常量 程序交互 基本数据类型 格式化输出 基本运算符 流程控制之if...else 流程控制之while循环 开发工具介绍 回到顶部 编程语言介绍 什么是编程?为什么要编程? 编 程 是个动词,编程==写代码,写代码为了什么? 为了让计算机干你想要干的事情,比如,马化腾想跟别人聊天,于是写了个聊天软件,这个软件就是一堆代码的集合,这些代码是什么?这些代码是计算机能理解的语言。 例子:你是公司老板,你有一个员工是中国人,你让他干活,就得说中文,还有一个员工是美国人,让他干活,就得说英文,你还有一条狗,让他听话,你就得汪汪汪。。。,那现在你有台电脑,让它干活,就得用它能理解的语言。 那计算能理解的语言是什么呢? 之前,我们已经了解到,它只能理解2进制,0101010...,你总不能人肉输一堆二进制给计算机(虽然最原始的计算机就是这么干的)让它工作吧,这样开发速度太慢了。所以最好的办法就是人输入简单的指令,计算机能把指令转成二进制进行执行,举例如下: 假如 程序员想让计算机 播放一首 歌曲 , 只需要输入指令 , open "老男孩.mp3" play 计算机的CPU接收到这样的指令后,会把它转成一堆 只有cpu可以理解的指令,然后再将指令变成各种对应的如下类似二进制 [op | rs | rt |

浅尝java内存模型(JMM)

大憨熊 提交于 2020-01-12 00:18:02
本文参考《深入理解虚拟机》一书 一.JMM中的主内存和工作内存 主内存:主要是存储线程要读取的数据,如实例字段、静态字段和数组元素,局部变量和形参不存储在主存。 工作内存:每一个线程都有自己的工作内存,工作内存存储从主存中copy的一份副本,线程只能操作工作内存中的数据,不能直接操作主存中的数据。不同线程之间也无法访问其它线程的工作内存变量线程间变量值传递需要通过主存来进。 内存间进行交互操作: 由上面的交互关系可知,关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成: lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。 unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。 read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。 use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。 assign(赋值):作用于工作内存的变量

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

微笑、不失礼 提交于 2020-01-11 23:48:03
上一篇博客 我们介绍了几种数据传送指令,包括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   

C++多线程——原子操作atomic

半世苍凉 提交于 2020-01-11 22:36:37
1. 原子操作 1.1 示例 原子操作 是个不可分割的操作。 在系统的所有线程中,你是不可能观察到原子操作完成了一半这种情况的; 它要么就是做了,要么就是没做,只有这两种可能。 不使用原子操作: # include <iostream> # include <thread> # include <atomic> using namespace std ; long num = 0 ; void addnum ( ) { for ( int i = 0 ; i < 100000 ; i ++ ) num ++ ; //不对全局变量进行互斥访问 } int main ( ) { int nthreads = 2 ; thread t [ nthreads ] ; for ( int i = 0 ; i < nthreads ; i ++ ) t [ i ] = thread ( addnum ) ; for ( auto & th : t ) th . join ( ) ; cout << num << endl ; return 0 ; } 输出结果: 最终结果为 109515 ,这个结果小于 200000 ,说明在对全局变量进行写的时候出现了下面的情况: 明明加了两次,但是因为访问不是互斥的,从而导致实际的值小。 使用原子操作可以避免这种情况的发生

Linux系统中cmake的使用

血红的双手。 提交于 2020-01-11 15:59:54
前言   在Linux系统如Ubuntu下做C语言编程常见的操作是:写好代码,然后使用gcc指令对程序预处理-编译-汇编-链接(其实只用一条指令:gcc -o)。这样的方法只适合单文件无文件组织的简单工程。当工程中代码文件增加且拥有组织结构之后,无可避免就需要去写makefile。本人之前写makefile,头皮发麻,如今赶紧转正,投向Cmake。   Cmake可以根据工程中CMakeLists.txt的指令自动生成makefile,相对方便易于上手。 准备工作   在Ubuntu下安装cmake: sudo apt install cmake   安装完毕后查看cmake的版本: cmake -- version   可见当前版本是3.5.1,安装完毕。 单文件工程中使用cmake   新建一个文件夹存放工程,新建一个main.c。内部代码如下: # include <stdio.h> int main ( ) { printf ( "hello world!\n" ) ; return 0 ; }   显然是个hello world,程序不重要,接下来在同目录下新建一个CMakeLists.txt。内容如下: cmake_minimum_required ( VERSION 2.8 ) #cmake最低版本为 2.8 project ( demo ) #工程名 add

GPU 优化总结

陌路散爱 提交于 2020-01-11 03:59:06
转自:http://www.cnblogs.com/ghl_carmack/p/4107042.html   前面说了对我这一年多的工作进行一个总结,由于工作比较紧,加上本人比较懒,一直没能抽出时间来写,最近稍微闲下来了。先写一篇GPU优化的,后续的文章希望能慢慢补齐。这些基本都是我个人优化的实际经验,也参考了一些文章,我都放在后面引用 部分了,感兴趣的可以深入研究。个人理解可能有问题,如有不正确的还请指正,下面进入正题。 由于图形引擎的复杂性,瓶颈可能发生在CPU、GPU、,也可能发生在CPU与GPU的传输数据与交互之中。这里我们只假设瓶颈在GPU上,讨论GPU的优化方法。 Premature optimization is the root of all evil. -- Donald Knuth 这告诉我们过早优化程序是不可取的,我觉得有两方面的意思,1、在没有找到高效的算法前就开始优化。2、在没有找到真正的瓶颈关就开始优化。正确的流程大概是这样的   1、使功能能工作,程序能跑起来。   2、功能正确的工作。   3、让整个程序能工作。   4、让整个程序能正确工作。   5、使用这个程序并找到性能瓶颈。   6、使用性能分析工具找到瓶颈所在。   7、使程序高效正确的运行。[1]   还有一个原则就是80~20原则,即只有百分之二十的代码是常用的,所以要集中优化这些代码

GPU 优化总结

巧了我就是萌 提交于 2020-01-11 03:58:15
  前面说了对我这一年多的工作进行一个总结,由于工作比较紧,加上本人比较懒,一直没能抽出时间来写,最近稍微闲下来了。先写一篇GPU优化的,后续的文章希望能慢慢补齐。这些基本都是我个人优化的实际经验,也参考了一些文章,我都放在后面引用 部分了,感兴趣的可以深入研究。个人理解可能有问题,如有不正确的还请指正,下面进入正题。 由于图形引擎的复杂性,瓶颈可能发生在 CPU 、 GPU 、,也可能发生在 CPU 与 GPU 的传输数据与交互之中。这里我们只假设瓶颈在 GPU 上,讨论 GPU 的优化方法。 Premature optimization is the root of all evil. -- Donald Knuth 这告诉我们过早优化程序是不可取的,我觉得有两方面的意思, 1 、在没有找到高效的算法前就开始优化。 2 、在没有找到真正的瓶颈关就开始优化。正确的流程大概是这样的   1、使功能能工作,程序能跑起来。   2、功能正确的工作。   3、让整个程序能工作。   4、让整个程序能正确工作。   5、使用这个程序并找到性能瓶颈。   6、使用性能分析工具找到瓶颈所在。   7、使程序高效正确的运行。[1]   还有一个原则就是 80~20 原则,即只有百分之二十的代码是常用的,所以要集中优化这些代码,而不是一些很少执行的代码上花些时间。 既然直接谈 GPU 优化