计算机指令

该内存不能为“read”或“written”

落花浮王杯 提交于 2020-02-15 10:38:00
最近电脑老出现这样的提示,于是在网上找了很多解决办法,找了找觉得这篇文章最全面 于是分享一下~~~~ 使用Windows操作系统的人有时会遇到这样的错误信息: 「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。 如果去请教一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是Windows不稳定造成的。本文就来简单分析这种错误的一般原因。 一、应用程序没有检查内存分配失败 程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是「动态内存分配」,内存地址也就是编程中的「光标」。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的「健壮性」。若应用程序没有检查这个错误,它就会按照「思维惯性」认为这个值是给它分配的可用游标,继续在之后的执行中使用这块内存

RAM在单片机里究竟有什么用?

允我心安 提交于 2020-02-14 21:48:17
单片机就是个小计算机,大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,更加显得小巧灵活。 直到90年代初,国内容易得到的单片机就是8031:不带存储器的芯片,要想工作,还必须外加RAM和ROM,单片机成了3片机...... 现在不同了,大的小的又是51,又是AVR又是STC,还有什么430,PIC等等,都各说各的好,可是谁也不敢说“我不要存储器”。 单片机的数据存储手段 01 程序存储器ROM 程序存储器里面存放的是单片机的灵魂: 工作程序 。 小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。 业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。 它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。 一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来

单片机的时钟

十年热恋 提交于 2020-02-14 11:01:57
http://www.easy-key.com/home/article/news_details/aid/5718 我们先来理解几个比较重要的概念:时间周期、指令周期、机器周期,以及系统时钟的工作原理。 时钟周期: 时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如12MHZ=12×10的6次方,即每秒发出12000000个脉冲信号,那么发出一个脉冲的时间就是时钟周期,也就是1/12微秒。通常也叫做系统时钟周期。是计算机中最基本的、最小的时间单位。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。 机器周期: 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。 在标准的51单片机中,一般情况下,一个机器周期等于12个时钟周期,也就是机器周期=12

计算机CPU是怎么认识代码的?

夙愿已清 提交于 2020-02-11 14:41:45
先说一下半导体,啥叫半导体?就是介于导体和绝缘体中间的一种东西,比如二极管。 电流可以从A端流向C端,但反过来则不行。你可以把它理解成一种防止电流逆流的东西。 当C端10V,A端0V,二极管可以视为断开。 当C端0V,A端10V,二极管可以视为导线,结果就是A端的电流源源不断的流向C端,导致最后的结果就是A端=C端=10V 等等,不是说好的C端0V,A端10V么?咋就变成结果是A端=C端=10V了?你可以把这个理解成初始状态,当最后稳定下来之后就会变成A端=C端=10V。 文科的童鞋们对不住了,实在不懂问高中物理老师吧。反正你不能理解的话就记住这种情况下它相当于导线就行了。 利用半导体,我们可以制作一些有趣的电路,比如【与门】 此时A端B端只要有一个是0V,那Y端就会和0V地方直接导通,导致Y端也变成0V。只有AB两端都是10V,Y和AB之间才没有电流流动,Y端也才是10V。 我们把这个装置成为【与门】,把有电压的地方计为1,0电压的地方计为0。至于具体几V电压,那不重要。 也就是AB必须同时输入1,输出端Y才是1;AB有一个是0,输出端Y就是0。 其他还有【或门】【非门】和【异或门】,跟这个都差不多,或门就是输入有一个是1输出就是1,输入00则输入0。 非门也好理解,就是输入1输出0,输入0输出1。 异或门难理解一些,不过也就那么回事,输入01或者10则输出1

计算机是怎么跑起来的?

筅森魡賤 提交于 2020-02-10 17:28:36
01 在学习工作中,经常会遇到些让我脑子短路无法回血的问题? 你去评估下这项目需要几台机器能维持稳定性,CPU要几核,内存要多大? X模块偶发出现内存飙升的情况,你追查下原因顺便想想如何优化? 瞬间,鸦雀无声甚至气氛一度及其尴尬。作为一个CURD男孩,写代码就是一把梭复制粘贴,那能管那么宽?仔细一想,我也是学过计算机组成原理、操作系统原理的男孩,岂能说怂就怂? 这时,冯·诺依曼、寄存器、内存、二进制、补码这些词忽隐忽现的飘过,就像一堆杂乱无章的思绪挤地铁一样挤入我的脑海。然而,我发现这跟上面的问题并没有丝毫联系,放佛我有一把方天画戟却切不动一盘菜的感觉,并没有什么用。 我相信,大多数同学在熟练编写业务代码后,会在出现一些复杂问题后被委以重任,这就非常考验大家的基本功了。 于是,我趁疫情在家时间充裕,花了一些时间阅读书籍和思考,尝试再去总结下计算机的基础知识。 02 首先,我先从计算机的三大原则开始说起。 1. 是什么?计算机是执行输入、运算、输出的机器 计算机本质上就是一台机器,机器的工作模式:接收指令(输入)、理解指令(运算)、做出动作(输出)。 工作模式很简单,关键是计算机如何理解指令的呢? 举个例子:在一个阳光明媚的早上,你对你对象说:不去上班行不行?你对象娇滴滴的回答:不去上班你养我啊? 针对这桥段,你仔细想想你对象脑子里是怎么流转的? 输入:声音(汉语) 理解:

[转译][马基 · 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 零 - 序

此生再无相见时 提交于 2020-02-10 11:13:28
__注意:__本文经过原作者授权转译,转载请标明出处 近来沉迷学习,网上翻到大佬Markey Jester 的关于 摩托罗拉68K (Motorola 68000,以下皆简称m68k) 这个cpu 的汇编教程,心血来潮边译边学,附带些个人笔记(以 斜体 标识) 正如我们熟知的Intel 8086 一样,m68k 也是一款经典cpu,大量用于街机游戏如Capcom 的街头霸王系列,Igs 的三国战纪系列等等 原作者说明本教程并不完整,但足够作为学习m68k 的一个非常好的开始,翻译完整后我会视情况有可能的情况下做一些补充章节 (当然也可能会鸽hhhhhh 原定于把系列发于简书 ( 地址 ),不过简书的markdown 功能不全,而且SEO 很糟糕,现在从简书搬运过来,简书那边就暂不更新了 原文地址: http://mrjester.hapisan.com/04_MC68/ 条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉 翻译若有不足之处欢迎批评指正 译文: 大家好,我是马基杰斯特,这些年来我都在编写m68k 汇编程序,并且做了一些《刺猬索尼克》(Sonic the Hedge) 系列的 ROM 修改 (即hack),也做了一些自己的游戏原型,如今我正在从头开始做一款运行在世嘉Mega Drive 上的完整的游戏 一开始的时候我在学习m68k 汇编语言的时候也不顺利

《编码》读书笔记:从无到有构建计算机系统

人走茶凉 提交于 2020-02-10 07:49:47
1 简单的电报系统: 按键、发声装置,电池和一些导线即可构成: 当电报机的键按下时,发生器的电磁铁将可动棒拖下发出“滴”的声音;当键放开时,棒弹回初始位置,发出“嗒”的声音。快速的“嘀嗒”为点,慢速的则为划。 2 继电器 电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。 长距离导线会有很大的电阻,会导致电流越来越小。下图中的继电器系统就是为了增大电流。 上述通信系统中的继电器的简单实现: 3 逻辑代数与电路 逻辑代数是分析和设计逻辑电路的数学基础。逻辑代数是由英国科学家乔治·布尔(George·Boole)创立的,故又称布尔代数。 4 逻辑门 (logic gates) 逻辑门和通常让水和人通过的门十分相似。逻辑门通过阻挡或允许电流通过在逻辑中执行简单的任务。 (1)与门

设计模式的征途—23.解释器(Interpreter)模式

泄露秘密 提交于 2020-02-10 05:43:15
虽然目前计算机编程语言有好几百种,但有时人们还是希望用一些简单的语言来实现特定的操作,只需要向计算机输入一个句子或文件,就能按照预定的文法规则来对句子或文件进行解释。例如,我们想要只输入一个加法/减法表达式,它就能够计算出表达式结果。例如输入“1+2+3-4+1”时,将输出计算结果为3。像C++,Java或C#都无法直接解释类似这样的字符串,因此用户必须自定义一套文法规则来实现对这些语句的解释,即设计一个自定义语言。如果所基于的编程语言是面向对象语言,此时可以使用解释器模式实现自定义语言。 解释器模式(Interpreter) 学习难度:★★★★★ 使用频率:★☆☆☆☆ 一、格式化指令的需求背景 Background :M公司开发了一套简单的基于字符界面的格式化指令,可以根据输入的指令在字符界面输出一些格式化内容,例如输入“LOOP 2 PRINT 杨过 SPACE SPACE PRINT 小龙女 BREAK END PRINT 郭靖 SPACE SPACE PRINT 黄蓉”,将输出以下结果: 其中,关键词LOOP表示循环,后面的数字表示循环次数;PRINT表示打印,后面的字符串表示打印的内容;SPACE表示空格;BREAK表示换行;END表示循环结束。每一个关键词对应一条指令,计算机程序将根据关键词执行相应的处理操作。   M公司的开发人员分析之后,根据格式化指令中句子的组成

计算机方面的缩写大全

只愿长相守 提交于 2020-02-09 18:50:41
计算机必懂的53个英文单词和缩写 ·PC:个人计算机Personal Computer ·CPU:中央处理器Central Processing Unit ·CPU Fan:中央处理器的“散热器”(Fan) ·MB:主机板MotherBoard ·RAM:内存Random Access Memory,以PC-代号划分规格,如PC-133,PC-1066,PC-2700 ·HDD:硬盘Hard Disk Drive ·FDD:软盘Floopy Disk Drive ·CD-ROM:光驱Compact Disk Read Only Memory ·DVD-ROM:DVD光驱Digital Versatile Disk Read Only Memory ·CD-RW:刻录机Compact Disk ReWriter ·VGA:显示卡(显示卡正式用语应为Display Card) ·AUD:声卡(声卡正式用语应为Sound Card) ·LAN:网卡(网卡正式用语应为Network Card) ·MODM:数据卡或调制解调器Modem ·HUB:集线器 ·WebCam:网络摄影机 ·Capture:影音采集卡 ·Case:机箱 ·Power:电源 ·Moniter:屏幕,CRT为显像管屏幕,LCD为液晶屏幕 ·USB:通用串行总线Universal Serial Bus,用来连接外围装置

Java第三章练习

谁说胖子不能爱 提交于 2020-02-09 18:14:05
3.1解一元二次方程 /* 数据:a,b,c,判别式Δ=b^2-4ac,实根r1和r2 指令:输入 计算判别式 判别实根个数 计算实根 输出结果 步骤: 1.提示用户输入a、b和c的值。 2.根据b^2-4ac的判别式来计算一元二次方程的实根个数,并将实根个数输出。 3.通过一元二次方程的求根公式计算一元二次方程的实根的值,并将其输出。 */ import java.util.Scanner; class Demo03_01{ public static void main(String[] args){ //1. System.out.print("Enter a, b, c: "); Scanner input = new Scanner(System.in); double a = input.nextDouble(); double b = input.nextDouble(); double c = input.nextDouble(); //2. double delta = b * b - 4 * a * c; //3. if (delta > 0){ double r1 = ( - b + Math.pow(delta, 0.5)) / (2 * a); double r2 = ( - b - Math.pow(delta, 0.5)) / (2 * a);