计算机指令

CLR 调试概述

▼魔方 西西 提交于 2019-12-04 15:10:20
利用公共语言运行时 (CLR) 调试 API,工具供应商可以编写调试器来调试运行于 CLR 环境中的应用程序。 要调试的代码可为 CLR 支持的任何代码种类。CLR 调试 API 主要是使用非托管代码实现的。 因此,调试 API 呈现为一组组件对象模型 (COM) 接口。 API 由以下各项组成: CLR 实现的 COM 对象和接口的集合。 必须由调试器实现的 COM 回调接口的集合。 CLR 调试方案 以下各部分介绍公共语言运行时调试 API 如何处理典型的调试方案。 请注意,该运行时直接支持某些方案,并且可与当前方法进行互操作来支持其他方案。 进程外调试 在进程外调试中,调试器不在所调试的进程中,而在另一个进程中(即在调试对象外部)。 此方案减少了调试器与调试对象之间的交互。 因此,它可以更准确地描述进程。 CLR 调试 API 直接支持进程外调试。 API 将处理调试器与调试对象托管部分之间的所有通信以支持托管代码调试。 虽然 CLR 调试 API 用于进程外,但某些调试逻辑(例如线程同步)却与调试对象在同一进程内。 大多数情况下,这是应该对调试器保持透明的实现详细信息。 有关线程同步的更多信息,请参见 CLR 调试体系结构。 调试 API 的缺点是在进程外使用时无法用它来检查崩溃转储。 进程内调试 在 .NET Framework 1.0 和 1.1 版本中,CLR 调试

汇编基础知识

帅比萌擦擦* 提交于 2019-12-04 11:26:14
1: 数据的表示 微型计算机的字长与微处理器的寄存器位数有关。 以 Intel 80X86 系列微处理器为例,CPU 是 8086/8088、80286 的字长是 16 位(二进制位 bit),那么它们的寄存器的位数一定是 16 位的; 32 位字长的微机 CPU 是 80386/80486 或者 Pentium 系列,它们的寄存器的位数则是 32 位的。 学习汇编语言我们会用到十六进制(H)的数据形式,要使自己尽快习惯用十六进制来思维。在汇编语言中,数值后面分别用字母 B 、 H 、 D 代表二进制(Binary)、十六进制(Hexadecimal)、十进制数(Decimal)(十进制数可以省略 D )。 在计算机中还规定采用字节、字、双字等单位来表示数据。 字节(Byte):8 位二进制数。如 00000101B 或表示成 05H ; 10000101B 或表示成 85H 。 字(Word):16 位二进制数,等于 2 字节。如 1100010111010110B 或表示成 C5D6H 。 双字(Double Word):32 位二进制数,又称为双精度数,等于 4 字节。如 23456789H 。 2: 寄存器的分类 8086 寄存器都是 16 位的寄存器,根据用途可分为 4 种类型。分别是数据寄存器、地址寄存器、段寄存器和控制寄存器 (1)数据寄存器

51单片机 知识总结

喜你入骨 提交于 2019-12-04 09:32:57
  目前单片机种类繁多,而51 单片机作为最基础的一款8位单片机,其资源最少,同时也是最容易学习的一款单片机。学习51单片机的工作原理及其存储结构是十分有必要的。   单片机执行程序的过程,其实就是在执行我们编写的程序的过程( 逐条执行指令 ),该执行过程可以看成是: 取指令--------分析指令-------执行指令。    取指令:根据 PC(程序计数器)的值从程序存储器中取出指令(编写的程序即为指令),送到指令寄存器。( 送到哪里去??? )   分析指令:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质,分析完成便找出操作数的地址。   执行指令:即对分析完成后得到操作数的地址,对该地址的数据进行更新。   计算机执行程序的过程实际上是逐条指令重复以上三个过程,直到遇到停机或循环等待指令。 举例:   开机后,PC 计数器 初始值为 0000H,接着单片机在时序电路下自动进入执行程序过程,循环对程序区进行取指令,执行指令操作。   对于汇编语句: MOV A , #0E0H 该语句的功能表示将操作数 E0H 送到 累加器 A 上。(74H 表示 的指令是将一个数送到 A 累加器去)此时 程序计数器 0000H 位置上存放了 74H , 0001H 上存放了 E0H 。 执行该语句的次序为: 1、取指阶段:PC 上 地址 0000H 上的内容送到地址寄存器去

Docker教程:镜像构建和自动镜像构建dockerfile

£可爱£侵袭症+ 提交于 2019-12-04 07:46:56
http:// blog.csdn.net/pipisorry/article/details/50805379 Docker透过Dockerfile来记录建立Container映象文件的每一个步骤,可以将建立应用程序执行环境的过程和配置参数,完整地记录下来。开发人员和维运人员之间可以利用Dockerfile来沟通对执行环境的讨论。甚至结合版本控制服务如GitHub,可以让Dockerfile具备版本控制功能,能将基础架构程序化(Infrastructure as code)来管理。 构建自定义的镜像 Docker能自动创建镜像,构建自定义的镜像,有两种方法: 1、使用docker commit 命令 关于commit命令,其实就是使用docker run -i -t XXX /bin/bash 进入容器的交互界面,进行各种操作后,再将这个容器通过提交命令提交上去来达到目的。 $ docker ps -l 命令获得安装完命令之后容器的id如698*** $ docker commit 698 pika/py_ubuntu #把这个容器保存为镜像py_ubuntu 2、使用Dockerfile 这里介绍dockerfile方法,因为使用Dockerfile构建拥有比提交命令更高的灵活性和可维护性。 易于自动化的命令: Dockerfile包含创建镜像所需要的全部指令

Java内存模型相关原则详解

假如想象 提交于 2019-12-03 17:13:30
在《 Java内存模型(JMM)详解 》一文中我们已经讲到了Java内存模型的基本结构以及相关操作和规则。而Java内存模型又是围绕着在并发过程中如何处理原子性、可见性以及有序性这三个特征来构建的。本篇文章就带大家了解一下相关概念、原则等内容。 原子性 原子性即一个操作或一系列是不可中断的。即使是在多个线程的情况下,操作一旦开始,就不会被其他线程干扰。 比如,对于一个静态变量int x两条线程同时对其赋值,线程A赋值为1,而线程B赋值为2,不管线程如何运行,最终x的值要么是1,要么是2,线程A和线程B间的操作是没有干扰的,这就是原子性操作,不可被中断的。 Java内存模型对以下操作保证其原子性:read,load,assign,use,store,write。我们可以大致认为基本数据类型的访问读写是具备原子性的(前面也提到了long和double类型的“半个变量”情况,不过几乎不会发生)。 从Java内存模型底层来看有上面的原子性操作,但针对用户来说,也就是我们编写Java的程序,如果需要更大范围的原子性保障,就需要同步关键字——synchronized来保障了。也就是说synchronized中的操作也具有原子性。 可见性 可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。 Java内存模型是通过变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值

Python历史「解密」Python底层逻辑 及Python 字节码介绍(转帖)

て烟熏妆下的殇ゞ 提交于 2019-12-03 15:24:26
帖子来源:https://www.ituring.com.cn/article/507878 一次纯粹的hacking Python的作者,Guido von Rossum,荷兰人。1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。尽管,他算得上是一位数学家,但他更加享受计算机带来的乐趣,热衷于做任何和编程相关的活儿。 80年代,掀起了个人电脑浪潮,但受限于个人电脑配置低,所有的编译器的核心是做优化,以便让程序能够运行。在那个时代,程序员恨不得用手榨取计算机每一寸的能力。 有人甚至认为C语言的指针是在浪费内存,至于动态类型,内存自动管理,面向对象…… 别想了,那会让你的电脑陷入瘫痪。 而这种编程方式让Guido感到苦恼。Guido知道如何用C语言写出一个功能,但整个编写过程需要耗费大量的时间。 不过,他还有另一个选择shell。shell可以像胶水一样,将UNIX下的许多功能连接在一起。UNIX的管理员们常常用shell去写一些简单的脚本,以进行一些系统维护的工作,比如定期备份、文件系统管理等等。 然而,shell的本质是调用命令,并不能全面的调动计算机的功能。 Guido希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样轻松的编程。 **ABC语言让Guido看到希望。**ABC是由荷兰的数学和计算机研究所开发的

基础知识

痞子三分冷 提交于 2019-12-03 14:06:36
机器语言: 展开来讲就是一台机器可以正确执行的命令,机器语言是机器指令的集合。 例如: 指令: 01010000 (PUSH AX) 电平脉冲: 但是机器语言也有弊端,全是二进制组成,难免会看错等等。 汇编语言的产生:正好是为了解决上面的问题 1、汇编语言的主体是汇编指令。 2、汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。 3、汇编指令是机器指令的助记符。 例如: 机器指令: 1000100111011000 汇编指令:MOV AX,BX 上面两步的操作的结果一样,将寄存器 BX的内容送到AX中 由此可见,汇编语言这样的写法与人类语言接近,便于阅读和记忆。 寄存器: 简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器,比如上面的AX,BX就是其中的一个寄存器的代号。 问题: 计算机只能识别机器语言,那要如何才能识别程序员用汇编语言写出来的东西呢? 答案: 通过相应的编译器来进行转换操作。 来源: https://www.cnblogs.com/zpchcbd/p/11798296.html

Python算法系列(一):衡量算法好坏的标准

只谈情不闲聊 提交于 2019-12-03 13:35:57
Python以它特有的优雅、简洁,深深的吸引着我,对我而言用Python写算法是一件无比快乐的事情,我乐在其中 算法的开销 我眼中的好算法,首先要能正确的解决问题,这是基础,如果100次的实验有20次的较大偏差,即使代码写得再漂亮也是徒劳;其次,要有良好的可读性,并且考虑到后期维护的可能,一个好算法还要有足够好的可维护性;最后也是本文、本系列介绍的重点,就是算法的时间性能 一个算法的运行,会产生两种开销: 1)处理时间 2)空间或内存 当选择算法的时候,必须解决时间和空间的平衡问题 衡量算法的运行时间 衡量算法的运行时间有三种方法:基准评价、统计指令,以及复杂度分析 基准评价(Benchmarking) 操作 衡量算法时间代价的一种方法是,使用计算机的时钟来获取一个实际的运行时间,这个过程叫基准评价(benchamrking)或探查(profiling) 其方法是首先确定几个具有相同大小的不同数据集合的时间,然后计算出平均的时间;接下来针对越来越大的数据集合,收集相似的数据,在进行几次这样的测试后,就有了足够的数据能够预测算法对任何大小的一个数据集合的表现了 缺陷 1)不同的硬件平台的处理速度不同,因此一个算法的运行时间在不同机器上是不同的,此外程序的运行时间在不同类型的操作系统和硬件上也是不同的,最后不同的编程语言和编译器也会得到性能不同的代码 2)对于很大的数据集合

2.5-MIPS体系结构

左心房为你撑大大i 提交于 2019-12-03 11:53:27
  MIPS是精简指令系统的代表,采用了与X86相反的设计理念,并引领了精简指令系统的潮流, 那就让我们一起来看一看这究竟是怎么一回事。R ISC是精简指令系统计算机的简称,与之相对,之前的计算机上的指令系统就被称为 复杂指令系统,X86就是其中的代表。 现在MIPS处理器已经不再应用在计算机产品中了, 但是在广义的计算设备包括数字电视,游戏机,网络设备 等领域仍然有广泛的应用。   第一代的MIPS是32位的,在1985年推出了对应的处理器,R2000,90年, R3000处理器对应着第二代的MIPS,92年,MIPS扩展到了64位,94年,64位的MIPS又 进一步升级,96年的MIPS5并没有对应的处理器, 然后在99年,MIPS指令系统进行了较大的调整,形成了MIPS32,到了99年,以MIPS5为基础, 推出了MIPS64指令系统,MIPS的设计指导思想非常的简单, 从它的名字就可以看出来。MIPS全称的含义是一个流水线不会互锁的微处理器,流水线是 现代微处理器为提高性能而采用的一项技术,而流水线中的互锁 则是导致流水线性能降低的一个非常重要的因素。从这个名称也可以看出,MIPS的 指导思想是希望其指令的设计能让微处理器运行的更快,性能更好。 所以它主要的关注点是减少指令的类型,并且降低指令的复杂度,所以在MIPS指令系统当中, 指令的总数是很少的。

2.4-复杂的x86指令举例

天大地大妈咪最大 提交于 2019-12-03 11:51:57
  x86作为复杂指令系统的代表,自然会有不少相当复杂的指令。 在这一节我们将会看到其中有代表性的一些例子。   串操作指令是将存储器中的数据串进行每次一个元素的操作。 所谓一个元素可以是字节或者是字。 这个串可以很长,能够达到64KB,x86提供了5种不同的串操作指令, 并且还有3种重复前缀,可以与串操作指令配合使用。 这张表就展示了这5种串操作指令和3种重复前缀。 我们来选择其中一组进行介绍。这个指令的格式非常简单,没有任何的操作数, 它的功能就是在存储器中将指定位置的一个字节单元传送到存储器的另一个指定的位置。 与它配合的经常是这个重复前缀REP, x86的体系结构中有很多种的前缀,这个前缀的 涵义是当CX寄存器的值不等于0时,就重复执行这个串操作指令。 那么很奇怪的是这个指令没有任何操作数。其实大家要注意x86当中有很多 这样的没有操作数的指令,但这并不意味着它们比那些有操作数的指令要简单。 因为它们不写操作数,不是因为没有操作数,很可能是因为操作数太多了,实在在指令中写不下, 因此它们实际上是有一些隐含的操作数。 对于这这条串传送指令,它要传送的数据串称为源串。 源串的地址默认放在DS:SI这组寄存器指向的位置。 而要传送的目的,我们称为目的串地址,默认放在 ES:DI这组寄存器指向的位置, 而要传送的串的长度则放在CX寄存器当中。 我们可以看到,虽然没有写操作数