标题内部可能会包含对FX3U子程序结束指令的概述、功能、使用方法等相关信息。 (标题内部可能写什么)

深入了解FX3U PLC中的子程序结束指令:概述、功能及应用 标题内部可能写什么

一、引言

在现代工业自动化领域,PLC(可编程逻辑控制器)扮演着至关重要的角色。
其中,三菱PLC以其卓越的性能和广泛的应用领域而受到工程师们的青睐。
在FX系列PLC中,子程序作为一种重要的编程结构,为工业自动化提供了强大的支持。
本文将重点介绍FX3U PLC中的子程序结束指令,包括其概述、功能以及使用方法等相关信息。

二、子程序结束指令概述

在PLC编程中,子程序是一种特殊的程序段,用于执行特定的任务或功能。
子程序可以被主程序或其他子程序调用执行。
子程序结束指令是子程序的最后一部分,用于标识子程序的结束。
当PLC执行到子程序结束指令时,意味着该子程序的执行已经完成,PLC将返回到调用子程序的位置继续执行后续指令。

三、子程序结束指令的功能

子程序结束指令在PLC中发挥着重要作用,其主要有以下几个功能:

1. 标识子程序的结束:通过子程序结束指令,PLC能够明确地知道子程序的执行已经结束,从而进行下一步操作。
2. 控制程序的流程:子程序结束指令可以帮助PLC控制程序的流程,确保程序的逻辑正确执行。
3. 提高程序的模块化:通过合理地使用子程序,可以将复杂的程序划分为多个独立的模块,使程序结构更加清晰,便于维护和修改。

四、子程序结束指令的使用方法

在FX3U PLC中,使用子程序结束指令的步骤如下:

1. 编写子程序:根据实际需求编写子程序的逻辑。子程序可以包含各种指令和逻辑操作。
2. 插入子程序结束指令:在子程序的最后,插入子程序结束指令。这个指令应该位于子程序所有操作的最后一条指令之后。
3. 调用子程序:在主程序或其他子程序中,使用相应的指令调用子程序。当PLC执行到调用子程序的指令时,将跳转到子程序开始执行。
4. 子程序执行与返回:PLC执行完子程序中的所有指令后,遇到子程序结束指令时,将返回到调用子程序的位置继续执行后续指令。

五、注意事项

在使用子程序结束指令时,需要注意以下几点:

1. 子程序的嵌套:FX3U PLC支持子程序的嵌套调用,但要避免过深的嵌套,以免导致程序结构复杂,难以调试和维护。
2. 子程序的参数传递:在调用子程序时,可能需要传递参数给子程序。确保正确地传递参数,并在子程序中正确地使用这些参数。
3. 子程序的返回值:在某些情况下,子程序可能需要返回结果给主程序。确保在子程序中设置合适的返回值,并在主程序中正确地接收这些返回值。
4. 子程序的优化:编写子程序时,要尽可能优化代码,提高程序的执行效率。避免在子程序中包含过多的无用操作或冗余代码。

六、结论

子程序结束指令在FX3U PLC中扮演着重要的角色。
通过正确使用子程序结束指令,可以确保PLC程序的正确执行,提高程序的模块化,便于维护和修改。
在实际应用中,需要根据实际需求编写子程序,并合理使用子程序结束指令来控制程序的流程。
同时,还需要注意一些使用注意事项,以确保程序的稳定性和可靠性。


step7如何检查程序错误

1、找到我们注册表里的一个文件删除就可以,按win+R打开运行,输入regedit。

2、打开注册表编辑器。

3、找到HEEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET\ CONTROL \SESSION MANAGE \下的PendingFileRemameOpeaations键。

4、删除它就可以,这是每次重启电脑都会自动生成的,所以删除不会有影响。

微机题,编制完成EAX*5/8的程序段。要求:1.用乘法指令实现。2.用移位和加法指令。

第1章 作业 答 案1.1微处理器、微型计算机和微型计算机系统三者之间有什么不同?解:把CPU(运算器和控制器)用大规模集成电路技术做在一个芯片上,即为微处理器。 微处理器加上一定数量的存储器和外部设备(或外部设备的接口)构成了微型计算机。 微型计算机与管理、维护计算机硬件以及支持应用的软件相结合就形成了微型计算机系统。 1.2CPU在内部结构上由哪几部分组成?CPU应该具备哪些主要功能?解:CPU主要由起运算器作用的算术逻辑单元、起控制器作用的指令寄存器、指令译码器、可编程逻辑阵列和标志寄存器等一些寄存器组成。 其主要功能是进行算术和逻辑运算以及控制计算机按照程序的规定自动运行。 1.3 微型计算机采用总线结构有什么优点?解:采用总线结构,扩大了数据传送的灵活性、减少了连线。 而且总线可以标准化,易于兼容和工业化生产。 1.4 数据总线和地址总线在结构上有什么不同之处?如果一个系统的数据和地址合用一套总线或者合用部分总线,那么要靠什么来区分地址和数据?解:数据总线是双向的(数据既可以读也可以写),而地址总线是单向的。 8086CPU为了减少芯片的引脚数量,采用数据与地址线复用,既作数据总线也作为地址总线。 它们主要靠信号的时序来区分。 通常在读写数据时,总是先输出地址(指定要读或写数据的单元),过一段时间再读或写数据。 1.8在给定的模型中,写出用累加器的办法实现15×15的程序。 解:LD A,0 LD H,15 LOOP:ADDA,15 DECH JP NZ, LOOP HALT第 2 章 作 业 答 案2.1IA-32结构微处理器直至Pentillm4,有哪几种?解、、Pentium、PentiumPro、Peruium II 、PentiumIII、Pentium4。 2.6 IA-32结构微处理器有哪几种操作模式?解:IA一32结构支持3种操作模式:保护模式、实地址模式和系统管理模式。 操作模式确定哪些指令和结构特性是可以访问的。 2.8 IA-32结构微处理器的地址空间如何形成?解: 由段寄存器确定的段基地址与各种寻址方式确定的有效地址相加形成了线性地址。 若末启用分页机制,线性地址即为物理地址;若启用分页机制,则它把线性地址转为物理地址。 2.微处理器的总线接口部件由哪几部分组成?解:8086微处理器中的总线接口单元(BIU)负责CPU与存储器之间的信息传送。 具体地说,BIU既负责从内存的指定部分取出指令,送至指令队列中排队(8086的指令队列有6个字节,而8088的指令队列只有4个字节);也负责传送执行指令时所需的操作数。 执行单元(EU)负责执行指令规定的操作。 2.16 段寄存器CS=120OH,指令指针寄存器IP=FFOOH,此时,指令的物理地址为多少?解:指令的物理地址=H FFOOH=21FOOH第 3 章 作业 答 案3.1分别指出下列指令中的源操作数和目的操作数的寻址方式。 (1)MOVSI, 30O(2)MOVCX, DATA[DI](3)ADDAX, [BX][SI](4)AND AX,CX(5)MOV [BP],AX (6)PUSHF解:(l)源操作数为立即寻址,目的操作数为寄存器寻址。 (2)源操作数为变址寄存器加位移量寻址,目的操作数为寄存器寻址。 (3)源操作数为基址加变址寻址,目的操作数为寄存器寻址。 (4)源操作数和目的操作数都为寄存器寻址。 (5)源操作数为寄存器寻址,目的操作数为寄存器间接寻址。 (6)为堆栈操作。 3.2 试述指令MOV AX,2000H和MOV AX,DSz[2000H]的区别。 解:前一条指令是立即寻址,即把立即数2000H传送至寄存器AX。 后一条指令是直接寻址,是把数据(DS)段中的地址为200OH单元的内容传送至寄存器AX。 3.3 写出以下指令中内存操作数的所在地址。 (1)MOVAL,[BX 10](2)MOV[BP 10],AX(3)INCBYTE PTR[SI十5](4)MOVDL,ES:[BX SI](5)MOVBX , [BP DI 2]解:(1)数据段BX 10单元。 (2)堆栈段BP 10单元。 (3)数据段SI 5字节单元。 (4)附加段(ES段)BX SI单元。 (5)堆栈段BP DI 2单元。 3.4 判断下列指令书写是否正确。 (1)MOV AL,BX(2)MOV AL,CL(3)INC [BX](4)MOV 5, AL(5)MOV [BX], [SI](6)M0V BL, OF5H(7)MOV DX, 2000H(8)POP CS(9)PUSHCS解: (l)不正确,AL与BX数据宽度不同。 (2)正确。 (3)不正确,因为不明确是增量字节还是字。 (4)不正确,立即数不能作为目的操作数。 (5)不正确,因为不明确要传送的是字节还是字。 (6)正确。 (7)正确。 (8)不正确,CS不能作为:pop指令的操作数。 (9)不正确,CS不能作为PUSH指令的操作数。 3.5 设堆钱指针SP的初值为1000H,AX=2000H, BX=3000H,试问:(1)执行指令PUSH AX后SP的值是多少?(2)再执行PUSH BX及POP AX后,SP、AX和BX的值各是多少?解:(1) SP=OFFEH。 (2) SP=OFFEH; AX=3000H, BX=3000H。 3.6要想完成把[3000H]送[2000H]中,用指令:MOM [200OH], [300OH]是否正确?如果不正确,应该用什么方法实现?解: 不正确。 正确的方法是:MOV AL, [300OH]MOV[2000H], AL3.7 假如想从200中减去AL中的内容,用SUB 200,AL是否正确?如果不正确,应该用什么方法?解:不正确。 正确的方法是:MOV BL,200SUB BL, AL3.8 试用两种方法写出从8OH端口读入信息的指令。 再用两种方法写出从4OH口输出10OH的指令。 解:(1)IN AL,80H (2)MOVDX, 8OHIN AL,DX(3)MOV, AL, lOOHOUT 40H, AL 4)MOVAL, 10OHMOVDX,4OHOUTDX, AL3.9假如:AL=20H,BL=1OH,当执行CMP AL,BL后,问:(1)AL、BL中的内容是两个无符号数,比较结果如何?影响哪儿个标志位?(2)AL、BL中的内容是两个有符号数,结果又如何,影响哪几个标志位?解:(l)AL=2OH,BL=1OH,O=0,S=0,Z=0,A=0,P=0,C=0。 (2)因为两个都是符号正数,其结果与(l)相同。 3.10 若要使AL×10,有哪几种方法,试编写出各自的程序段?解: (1)使用乘法指令:MOV BL,10MUL BI,(2)使用移位指令:SHL AL,1MOV BL,ALSHL AL, 2ADD AL,BL(3)使用加法指令:ADD AL,ALMOV BL, AL ADD AL, ALADD AL, AL ADD AL, BL 3.11 8086汇编语言指令的寻址方式有哪几类?哪种寻址方式的指令执行速度最快?解:寻址方式分为:立即数寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式。 其中,寄存器操作数寻址方式的指令执行速度最快。 3.12 在直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定?如果要用某个段寄存器指出段地址,指令中应该如何表示?解:默认的数据访问,操作数在DS段;堆栈操作在SS段;串操作源操作数(SI)在DS段,目的操作数(DI)在ES段;用BP作为指针在SS段。 如果要显式地指定段地址,则在操作数中规定段寄存器。 例如: MOV AX, ES:(BX 10H)3.13 在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,那么如何确定段地址?解:在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,段地址是隐含约定的,也就是隐含地选择段寄存器。 如操作类型为指令,则指定代码段寄存器CS,如操作类型为堆栈操作,则指定堆找段寄存器SS,…,如表3-1中所示。 当需要超越约定时,通常用段替代前缀加冒号:来表示段超越,它允许程序设计者偏离任何约定的段。 例如:MOV ES:〔BX],AX这时数据将从寄存器EAX传送至附加段中由EBX寻址的存储单元,而不是传送到数据段中。 3.14 采用寄存器间接寻址方式时,BX、BP、SI、DI分别针对什么情况来使用?这4个寄存器组合间接寻址时,地址是怎样计算的?请举例说明。 解:在寄存器间接寻址方式下,BX和BP作为间址寄存器使用,而SI、DI作为变址寄存器使用。 除BP间址默认的段为堆栈段,其他的都默认为数据段。 它们都可以单独使用,或加上偏移量或组合使用。 如:[BXn]LBPn][SIn][DIn][BXSIn][BXDIn][BPSIn][BPDIn]3.15 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作:MOV BYTE PTR[BP],200MOV WORD PTR[BX],2000解:前一条指令是把立即数(应是字节)200,传送至堆栈段(BP的默认段〉偏移量由BP规定的字节单元,地址为H 620OH=H第二条指令是把立即数.2000,传送至数据段(BX的默认段)偏移量由BX规定的字单元,地址为H 1400H = H。 3.16 使用堆钱操作指令时要注意什么问题?传送指令和交换指令在涉及内存操作数时应该分别要注意什么问题?解:使用堆栈指令可以把内存单元作为一个操作数(从内存到内存)。 但堆栈固定在堆栈段且只能由SP指向。 且堆栈操作要修改堆核指针。 MOV指令不能实现内存单元间的数据传送。 XCHG指令是交换,有一个操作数必须是寄存器。 3.17下面这些指令中哪些是正确的?哪些是错误的?若是错误的,请说明原因。 (1)XCHGCS, AX(2)MOV [BX],[1000](3)XCHG BX, IP(4)PUSH CS(5)POPCS(6)IN BX, DX(7)MOV BYTE[BX], 100O (8)MOV CS, [1000]解:(l)错误,CS不能交换。 (2)错误,MOV指令不能在内存间传送。 (3)错误,IP不能交换。 (4)错误,CS可以作为PUSH指令的操作数。 (5)错误,CS可以作为POP指令的操作数。 (6)错误,IN指令的目的操作数是累加器。 (7)错误,目的操作数是字节单元。 (8〉错误,CS不能作为MOV指令的目的操作数。 3.18以下是格雷码的编码表,O请用换码指令和其他指令设计一个程序段,以实现由格雷码向ASCII码的转换。 解:MOV BX,TABLE MOV SI,ASCII_TABMOV AL,0MOV CX,10TRAN: XLAT TABLEMOV DL,AL ADD DL,30H MOV [SI],DLINC AL LOOP TRAN3.19 使用乘法指令时,特别要注意先判断是用有符号数乘法指令还是用无符号数乘法指令,这是为什么?解:因为有符号数和无符号数,其数的乘法是一样的。 但结果的符号取决于两个操作数的符号。 3.20 字节扩展指令和字扩展指令一般用在什么场合?举例说明。 解:主要用于字节相除和字相除之前,把被除数扩展为两倍宽度的操作数。 3.21什么叫BCD码?什么叫组合的BCD码?什么叫非组合的BCD码?8086汇编语言在对BCD码进行加、减、乘、除运算时,采用什么方法?解:BCD码为十进制编码的二进制数。 组合的BCD数是把两位BCD加在一个字节中,高位的在高4位。 非组合的BCD码是把一位BCD数放在一个字节的低4位,高4位为0。 8086在BCD加、减和乘法运算以后用BCD调整指令把结果调整为正确的BCD数。 在BCD除法之前先用BCD调整指令再做除法.3.22 用普通运算指令执行BCD码运算时,为什么要进行十进制调整?具体地讲,在进行BCD码的加、减、乘、除运算时,程序段的什么位置必须加上十进制调整指令?解:因为8086指令把操作数作为二进制数进行二进制运算,要得到正确的BCD结果,需要进行调整。 在加、减、乘法指令之后加上BCD调整指令,而在除法指令之前先用BCD调整指令再用除法指令。 第4章作业答案4.1 在下列程序运行后,给相应的寄存器及存储单元填入运行的结果:MOVAL, 1OHMOVCX, 100OHMOVBX ,2000HMOV[CX],ALXCHG CX,BXMOVDH, [BX]MOVDL, 01HXCHG CX, BXMOV[BX],DLHLT解:寄存器及存储单元的内容如下:AL = 1OHBL = OOHBH = 2OHCL = OOHCH = 1OHDH = 1OH(10O0H) = lOH(200OH) = 0lH2.要求同题4.1,程序如下:MOVAL,50HMOVBP,100OHMOVBX,200OHMOV [BP], ALMOVDH,20HMOV [BX], DHMOVDL,OlHMOVDL,[BX]MOVCX,300OHHLT解:寄存器及存储单元的内容如下:AL = 5OHBL = OOHBH = 20H CL = OOHCH = 30HDL = 20HDH = 2OHBP = 100OH(10OOH) = 5OH(20OOH) = 20H4.3 自1000H单元开始有一个100个数的数据块,若要把它传送到自200OH开始的存储区中去,可以采用以下3种方法实现,试分别编制程序以实现数据块的传送。 (l)不用数据块传送指令(2)用单个传送的数据块传送指令(3)用数据块成组传送指令。 解:(1)LEASI,1OOOHLEADI,200OHMOVCX,100L1: MOVAX,[SI]MOV [DI], AXLOOP LlHLT (2)LEA SI, 100OHLEA DI, 2000HMOV CX, 100CLDL1: MOVSBLOOPL1HLT(3)LEA SI,100OHLEA DI,200OHMOV CX,100CLDREPMOVSBHLT4.4利用变址寄存器,编写一个程序,把自1000H单元开始的100个数传送到自1070H开始的存储区中去。 解:LEA SI, 100OHLEA DI, 1070HMOV CX, 100CLDREPMOVSBHLT4.5 要求同题4.4,源地址为2050H,目的地址为2000H,数据块长度为50.解:LEA SI, 205OHLEA DI, 200OHMOV CX, 50CLDREP MOVSBHLT4.6 编写一个程序,把自100OH单元开始的100个数传送至105OH开始的存储区中(注意:数据区有重叠)。 解:LEA SI,100OHLEA DI , 1050HADD SI,63HADD DI,63HMOV CX,100STDREP MOVSBHLT4.7 在自0500H单元开始,存有100个数。 要求把它传送到1000H开始的存储区中,但在传送过程中要检查数的值,遇到第一个零就停止传送。 解:LEASI,050OHLEADI,10OOHMOVCX,100N1:MOVAL,[SI]CMPAL,0JZ N2MOV [DI], ALINCSIINCDI LOOP N1N2:HLT4.14若在0500H单元中有一个数(1)利用加法指令把它乘2,且送回原存储单元(假定X×2后仍为一个字节);(2)X×4;(3)X×10(假定X×l0≤255).解:(1)LEABX,050OHMOVAL,[BX]ADDAL,ALMOV [BX], AL(2)LEABX,0500HMOVAL,[BX]ADDAL,ALADDAL,AL MOV [BX], AL(3) LEA BX,050OHMOV AL,[BX]ADD AL,ALMOV DL,AL ADD AL,ALADDAL, ALADD AL,DLMOV [BX], AL 第 5 章 作业答案5.1总线周期的含义是什么?8086/8088CPU的基本总线周期由几个时钟组成?如果一个CPU的时钟频率为8MHz,那么,它的一个时钟周期是多少?一个基本总线周期是多少?如果主频为5MHz呢?解: CPLI访问总线(从内存储器或I/0端口读/写字节或字)所需的时间称为总线周期。 8086/8088CPU的基本总线周期由4个时钟组成。 若CPU的时钟频率为8(5)MHz,时钟周期为1/8MHz=125(1/5MHz=2O)ns,基本总线周期为4×125(200)ns=500(800)ns5.2 在总线周期的TI、T2、T3、T4状态,CPU分别执行什么动作?什么情况下需要插入等待状态Tw? Tw在哪儿插入? 怎样插入?解:下面以存储器读为例进行说明。 在Tl周期:输出地址信号、地址锁存允许信号、内存或I/O端口访问控制信号;在T2周期:CPIJ开始执行数据传送操作,此时,8086CPU内部的多路开关进行切换,将地址/数据线AD15~AD0上的地址撤销,切换为数据总线,为读写数据作准备。 8288总线控制器发出数据总线允许信号和数据发送/接收控制信号DT/R允许数据收发器工作,使数据总线与8086CPU的数据线接通,并控制数据传送的方向。 同样,把地址/状态线A19/S6~A16/S3切换成与总线周期有关的状态信息,指示若干与周期有关的情况。 在T3周期:开始的时钟下降沿上,8086CPU采样READY线。 如果READY信号有效(高电平),则在T3状态结束后进人TA状态。 在T4状态开始的时钟下降沿,把数据总线上的数据读入CPU或写到地址选中的单元。 在T4状态:结束总线周期。 如果访问的是慢速存储器或是外设接口,则应该在Tl状态输出的地址,经过译码选中某个单元或设备后,立即驱动READY信号到低电平。 8086CPU在T3状态采样到READY信号无效,就会插入等待周期Tw,在Tw状态CPU继续采样READY信号;直至其变为有效后再进人T4状态,完成数据传送,结束总线周期。 在T4状态,8086CPU完成数据传送,状态信号 。 变为无操作的过渡状态。 在此期间,8086CPU结束总线周期,恢复各信号线的初态,准备执行下一个总线周期。 第 6 章 作业答案6.1若有一单板机,具有用8片2114构成的4KBRAM,连线如图创所示。 若以每1KB RAM作为一组,则此4组RAM的基本地址是什么?地址有没有重叠区?每一组的地址范围为多少?解:RAM的基本地址为:第一组 OOOOH ~ 03FFH第二组 4000H ~ 43FFH第三组 8000H ~ 83FFH第四组 COOOH ~ C3FFH地址有重叠区。 每一组的地址范围为OOOH ~ 3FFH(1024个字节)。 6.4 若要扩充1KB RAM(用2114片子),规定地址为8000H~83FFH,地址线应该如何连接?解: 扩充lKB RAM至规定地址8000H ~ 83FFH,其地址线的低10位接芯片,高6位地址(Al5 ~A10 = )产生组选择信号。 第 7 章作业答案7.1外部设备为什么要通过接口电路和主机系统相连?解:因为外部设备种类繁多,输入信息可能是数字量、模拟量或开关量,而且输入速度、电平、功率与CPU差距很大。 所以,通常要通过接口电路与主机系统相连。 7.4CPU和输入输出设备之间传送的信息有哪几类?解:CPU和输入输出设备之间传送的信息主要有3类。 (l)数据在微型计算机中,数据通常为8位、16位或32位。 (2)状态信息在输入时,有输入设备的信息是否准备好;在输出时有输出设备是否有空,若输出设备正在输出信息,则以忙指示等。 (3)控制信息例如,控制输入输出设备启动或停止等。 7.9 设一个接口的输入端口地址为0100H,状态端口地址为0104H,状态端口中第5位为1表示输入缓冲区中有一个字节准备好,可以输入。 设计具体程序以实现查询式输入。 解:查询输入的程序段为:POLl :INAL,0104H AND AL, 20HJZPOLlINAL,0100H第8章作业答案8.1 在中断响应过程中,8086CPU向8259A发出的两个RT互信号分别起什么作用?解: CPU发出的第一个 脉冲告诉外部电路,其提出的中断请求已被响应,应准备将类型号发给CPU,8259A接到了这个 脉冲时,把中断的最高优先级请求置入中断状态寄存器(ISR)中,同时把IRR(中断请求寄存器)中的相应位复位。 CPU发出的第二个 脉冲告诉外部电路将中断的类型号放在数据总线上。 8.2 8086CPU最多可以有多少个中断类型?按照产生中断的方法分为哪两大类?解:8086CPU最多可以有256个中断类型。 按照产生中断的方法,可以分为内部中断(软件中断)和外部(硬件中断)中断两大类。 8.9在编写中断处理子程序时,为什么要在子程序中保护许多寄存器?解: 因为在用户程序运行时,会在寄存器中有中间结果,当在中断服务程序中要使用这些寄存器前要把这些寄存器的内容推至堆栈保存(称为保护现场)。 在从中断服务程序返回至用户程序时把这些内容从堆找恢复至寄存器中(称为恢复现场)。 8.12 若在一个系统中有5个中断源,其优先权排列为:1、2、3、4、5,它们的中断服务程序的入口地址分别为:3000H、302OH、3050H、3080H、30AOH。 编写一个程序,当有中断请求CPU响应时,能用查询方式转至申请中断的优先权最高的源的中断服务程序。 解:若5个中断源的中断请求放在一中断状态寄存器中,按优先权分别放在状态的7位(优先权最高)至位3中。 查询方法的程序段为:INAL, STATUSCMP AL, 80HJNE N1JMP 3000HN1:INAL,STATUSCMP AL,40HJNE N2JMP 3020HN2:INAL,STATUSCMP AL,20H JNEN3 JMP3050HN3: IN AL,STATUS CMPAL,10H JNEN4 JMP3080HN4: IN AL,STATUS CMPAL,08H JNEN5 JMP30A0HN5: RET第9章作业答 案9.3 在某一应用系统中,计数器/定时器8253地址为340H~343H,定时用作分频器(N为分频系数),定时器2用作外部事件计数器,如何编制初始化程序?解:定时器0用作分频器,工作方式2,其初始化程序为:MOVAL, 34HOUT343H,ALMOVAL,N1OUT342H,ALMOVAL,N2OUT342H, AL定时器2用作外部事件计数器,工作在方式0,其初始程序:MOVAL,0B0HOUT 343H,ALMOVAL,N1OUT 342H,ALMOVAL,N2OUT 342H,AL9.4 若已有一频率发生器,其频率为1MHZ,若要示求通过计数器/定时器8253,着重产生每秒一次的信号,8253应如何连接?编写出初始化程序。 解: 1MHZ的信号要变为每秒一次,则需经过106分频。 一个通道的计数为16 位最大为。 故需要需两个通道级连,则每个通道计数为1000。 用通道0和通道1级连,都工作在方式2,初始化程序为: MOV AL, 34H OUT 343H,AL MOV AL, 0E8H OUT 342H, AL MOV AL,03 OUT 342H, AL MOV AL,74H OUT 343H, AL MOV AL, 0E8H OUT 342H, AL MOV AL,03 OUT 342H, AL9.9 编程将计数器/定时器8253计数器0设置为模式1,计数初值3000H;计数器1设置为模式2初值为2010H;计数器2设置为模式4初值为4030H;解: 若端口地址为:0F8H~0FBH,初始化程序为: MOV AL, 32H OUT 0FBH,AL MOV AL, 00H OUT 0F8H, AL MOV AL, 30H OUT 0F8H, AL MOV AL, 74H OUT0FBH,AL MOV AL,10H OUT0F9H, AL MOVAL, 20H OUT0F9H, AL MOVAL,0B8H OUT0FBH, AL MOVAL,30H OUT0FAH, AL MOVAL,40H OUT0FAH, AL第 10 章作业答 案10.4 可编程并行接口芯片8255A的3个端口在使用时有什么差别?解:通常端口A或B作为输入输出的数据端口(端口A还可以作为双向数据端口),而端口C作为控制或状态信息的端口,它在方式字的控制下,可以分成两个4位的端口。 每个端口包含一个4位锁存器。 它们分别与端口A和B配合使用,可用以作为控制信号输出,或作为状态信号输入。 10.A有哪几种基本工作方式?对这些工作方式有什么规定?解:8255A有3种基本的工作方式:方式0-----基本输入输出:方式1-----选通输入输出;方式2-----双向传送。 10.8 设置8255A工作方式,8255A的控制口地址为OOC6H。 要求端口A工作在方式1,输入;端口B工作在方式0,输出;端口C的高4位配合端口A工作;低4位为输入。 解:按要求的方式控制字为B。 编程语句为:MOV AL, 0B9HOUT OOC6H,AL ;10.9 设可编程并行接口芯片8255A的4个端口地址为OOCOH、00C2H、00C4H、OOC6H,要求用置0/置1方式对PC6置1,对PC4置0。 解:对端口C的PC6置1的控制字为: B,对PC4置O的控制字为OB。 程序段为:MOV AL, DHOUT OOC6H,ALMOV AL, 00C6H,AL

最近电脑特别慢啊,而且老显示0X026B6C3D指令引用的"0X00000000"内存不能为read要终止程序请单击确定

0X该内存不能为read的解决方法出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。 一:先说说硬件: 一般来说,电脑硬件是很不容易坏的。 内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是:1。 内存条坏了(二手内存情况居多)、2。 使用了有质量问题的内存,3。 内存插在主板上的金手指部分灰尘太多。 4。 使用不同品牌不同容量的内存,从而出现不兼容的情况。 5。 超频带来的散热问题。 你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。 二、如果都没有,那就从软件方面排除故障了。 先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。 这就是“动态内存分配”,内存地址也就是编程中的“光标”。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。 当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。 作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。 若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用光标,继续在之后的执行中使用这块内存。 真正的0地址内存区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。 在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。 这时候,就会出现上述的内存不能为“read”错误,并指出被引用的内存地址为“0x“。 内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。 因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统档案之后。 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的光标已经失效了。 有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。 注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止执行,回收全部资源。 计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。 无效光标不一定总是0,因此错误提示中的内存地址也不一定为“0x”,而是其它随机数字。 首先建议: 1、 检查系统中是否有木马或病毒。 这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。 平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2、 更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。 有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。 3、 尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。 4、 删除然后重新创建 Winnt\System32\Wbem\Repository 文件夹中的文件:在桌面上右击我的电脑,然后单击管理。 在服务和应用程序下,单击服务,然后关闭并停止 Windows Management Instrumentation 服务。 删除 Winnt\System32\Wbem\Repository 文件夹中的所有文件。 (在删除前请创建这些文件的备份副本。 ) 打开服务和应用程序,单击服务,然后打开并启动 Windows Management Instrumentation 服务。 当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs 下面搜集几个例子给大家分析: 例一:IE浏览器出现“0x0a8ba9ef”指令引用的“0x” 内存,或者“0x70dcf39f”指令引用的“0x”内存。 该内存不能为“read”。 要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。 解决方法: 1、 开始-运行窗口,输入“regsvr32 ”回车,接着会出现一个信息对话 框“DllRegisterServer in succeeded”,确定。 再依次运行以下命令。 (这个方法有人说没必要,但重新注册一下那些对系统也没有坏处,反正多方下手,能解决问题就行。 ) regsvr32 regsvr32 regsvr32 regsvr32 regsvr32 regsvr32 regsvr32 2、 修复或升级IE浏览器,同时打上系统补丁。 看过其中一个修复方法是,把系统还原到系统初始的状态下。 建议将IE升级到了6.0。 例二:有些应用程序错误: “0x7cd” 指令参考的 “0x14c” 内存。 该内存不能为 “read”。 解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到Windows\Prefetch文件夹。 一旦建立了映像,应用软件的装入速度大大提高。 XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。 建议将虚拟内存撤换,删除Windows\Prefetch目录下所有*文件,让windows重新收集程序的物理地址。 例三:在XP下双击光盘里面的“”文件,显示“0x77f745cc”指令引用的“0x”内存。 该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。 win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\。 右键,属性,也会出现兼容性的选项。 例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。 该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。 例五:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0xf6”(每次变化)指令引用的“0xff”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。 还不行,只好换就用别的播放器试试了。 例六:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示程序错误。 解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 例七:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x”内存,该内存不能为“written”,然后自动下线,而再打开,发现了他发过来的十几条的信息。 解决方法:这是对方利用的BUG,发送特殊的代码,做出错,只要打上补丁或升级到最新版本,就没事了。 该内存不能为read或written的解决方案关键词: 该内存不能为read 该内存不能为written 从网上搜索来的几篇相关文章. 【文章一】 使用Windows操作系统的人有时会遇到这样的错误信息: 「“0X????????”指令引用的“0x”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。 如果去请教一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。 其实,这个错误并不一定是Windows不稳定造成的。 本文就来简单分析这种错误的一般原因。 一、应用程序没有检查内存分配失败 程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。 这就是「动态内存分配」,内存地址也就是编程中的「光标」。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。 当分配失败时系统函数会返回一个0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的一个通知,告知出现了错误。 作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的「健壮性」。 若应用程序没有检查这个错误,它就会按照「思维惯性」认为这个值是给它分配的可用游标,继续在之后的执行中使用这块内存。 真正的0地址内存区储存的是计算机系统中最重要的「中断描述符表」,绝对不允许应用程序使用。 在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。 这时候,就会出现上述的「写内存」错误,并指出被引用的内存地址为「0x」。 内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。 因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中「安装」的病毒程序),更改了大量的系统参数和系统档案之后。 二、应用程序由于自身BUG引用了不正常的内存光标 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试突读写一块「应该可用」的内存,但不知为什么,这个预料中可用的光标已经失效了。 有可能是「忘记了」向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而「没有留意」等等。 注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图「违法」的程序唯一的下场就是被操作终止执行,回收全部资源。 计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。 无效光标不一定总是0,因此错误提示中的内存地址也不一定为「0x」,而是其它随机数字。 如果系统经常有所提到的错误提示,下面的建议可能会有说明 : 1.检视系统中是否有木马或病毒。 这类程序为了控制系统往往不负责任地修改系统, 从而导致操作系统异常。 平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2.更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。 有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。 3.试用新版本的应用程序。 Mode: 将虚拟内存撤换 答案: 目前为止是肯定的,也就是如在下次冷天到来时亦没再发生,就代表这是主因 追加: 如果你用 Ghost 恢复 OS 后建议 删除WINDOWS\PREFETCH目录下所有*文件因为需让windows重新收集程序的物理地址 有些应用程序错误 0x7cd 指令参考的 0x14c 内存。 该内存不能为 read推论是此原因 源由: Win XP的「预读取」技术 这种最佳化技术也被用到了应用软件上,系统对每一个应用软件的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟「内存映像」,并把这些信息储存到WINDOWSPREFETCH数据夹。 一旦建立了映像,应用软件的装入速度大大提高。 XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。 后叙: 目前此方法亦是独步网络的(其码自己针对此问题查了许久),也是常见问题,原本几乎每天睡前关闭软件时一些程序都会发生... 现在就没发生了。 【文章二】 运行某些程序的时候,有时会出现内存错误的提示(0x后面内容有可能不一样),然后该程序就关闭。 “0x????????”指令引用的“0x????????”内存。 该内存不能为“read”。 “0x????????”指令引用的“0x????????”内存,该内存不能为“written”。 不知你出现过类似这样的故障吗? 一般出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。 下面先说说硬件: 一般来说,内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题,还有就是2个不同牌子不同容量的内存混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。 你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。 假如你是双内存,而且是不同品牌的内存条混插或者买了二手内存时,出现这个问题,这时,你就要检查是不是内存出问题了或者和其它硬件不兼容。 如果都没有,那就从软件方面排除故障了。 先简单说说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间,就会发生溢出现象。 举个例子:一个桶子只能将一斤的水,当你放入两斤的水进入时,就会溢出来。 而系统则是在屏幕上表现出来。 这个问题,经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作,系统为保持稳定,就会出现上述情况。 另外也可能是硬件设备之间的兼容性不好造成的。 下面我从几个例子给大家分析: 例一:打开IE浏览器或者没过几分钟就会出现0x70dcf39f指令引用的0x内存。 该内存不能为“read”。 要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。 解决方法:修复或升级IE浏览器,同时打上补丁。 看过其中一个修复方法是,Win2000自升级,也就是Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下。 比如你的IE升级到了6.0,自升级后,会被IE5.0代替。 例二:在windows xp下双击光盘里面的“”文件,显示“0x77f745cc”指令引用的“0x”内存。 该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。 win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\。 右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。 该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。 例四:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0xf6”(每次变化)指令引用的“0xff”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。 还不行,只好换就用别的播放器试试了。 例五:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示程序错误。 解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 例六:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x”内存,该内存不能为“written”,然后自动下线,而再打开,发现了他发过来的十几条的信息。 解决方法:这是对方利用的BUG,发送特殊的代码,做出错,只要打上补丁或升级到最新版本,就没事了。 【原因 解决方法】 1 内存条坏了 更换内存条 2 双内存不兼容 使用同品牌的内存或只要一条内存 3 内存质量问题 更换内存条 4 散热问题 加强机箱内部的散热 5 内存和主板没插好或其他硬件不兼容 重插内存或换个插槽 6 硬件有问题 更换硬盘 7 驱动问题 重装驱动,如果是新系统,应先安装主板驱动 8 软件损坏 重装软件 9 软件有BUG 打补丁或更新到最新版本 10 软件和系统不兼容 给软件打上补丁或是试试系统的兼容模式 11 软件和软件之间有冲突 如果最近安装了什么新软件,卸载了试试 12 软件要使用其他相关的软件有问题 重装相关软件,比如播放某一格式的文件时出错,可能是这个文件的解码器有问题 13 病毒问题 杀毒 14 杀毒软件与系统或软件相冲突 由于杀毒软件是进入底层监控系统的,可能与一些软件相冲突,卸载试试 15 系统本身有问题 有时候操作系统本身也会有BUG,要注意安装官方发行的更新程序,象SP的补丁,最好打上.如果还不行,重装系统,或更换其他版本的系统。 〔又一说〕 在控制面板的添加/删除程序中看看你是否安装了微软,如果已经安装了,可以考虑卸载它,当然如果你以后在其它程序需要时候,可以再重新安装。 另外,如果你用的是ATI显卡并且你用的是SP2的补丁(一些ATI的显卡驱动需要在正常工作的环境下)。 这种情况你可以找一款不需要支持的ATI显卡驱动。 如果以上两种方法并不能完全解决问题,你试着用一下“IE修复”软件,并可以查查是否有病毒之类的。 〔微软升级到1.1版应该没问题了〕 〔还有一说〕 方法一: 微软新闻组的朋友指点:开始--运行:regsvr32 开始--运行:regsvr32 不过没解决---但提供了路子-----一次运行注册所有dll 搜索查找到方法如下: 运行 输入cmd 回车在命令提示符下输入 for %1 in (%windir%\system32\*) do /s %1 这个命令老兄你慢慢输 输入正确的话会看到飞快地滚屏 否则……否则失败就是没这效果。 回车后慢慢等(需要点时间1-2分钟) 都运行完再打开看 方法二: 这是个典型问题~~~~~引起这个问题的原因很多。 一般来讲就是给系统打上补丁和更换内存、给内存换个插槽这3种方法来解决。 [系统补丁只要到Microsoft Update网站在线更新就可以了] 造成这种问题的原因很多,不能单纯的下结论,尽量做到以下几点可能对你有帮助: 1。 确保使用的是未修改过的软件(非汉化、破解版) 2。 使用改软件时尽量不要运行其他软件。 (这是个临时文件,可能某些软件也在使用临时文件夹,所以产生干扰) 3。 把那些什么桌面工具,内存整理工具通通关掉(你至少有2个类似的工具在运行)” 处理方法: 运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks下,应该只有一个正常的键值{AEB6717E-7E19-11d0-97EE-00C04FD}, 将其他的删除。 〔我个人的最后解决和看法〕 我今天尝试了多种办法,最后我发现问题出在微软的上面。 我升级了这个软件,并打齐了补丁,短暂平安后,有出现“内存不能为read”的情况。 后来我受上面文章的启发,卸载了微软的1.0和1.1,世界太平了。 另外:如果是打开“我的电脑”、“我的文档”等的时候出现上述情况,还有一种可能,就是你的右键菜单太臃肿了,此时只要清理右键菜单问题就解决了。 -------------------------------------------------------------------------------- 〔试验的结果〕 上面的方法,最管用、最彻底的方法是这个: 运行 输入cmd 回车在命令提示符下输入 for %1 in (%windir%\system32\*) do /s %1 【技巧】如果怕输入错误的话,可以复制这条指令,然后在命令提示框点击左上角的c:\,使用下面的“编辑-粘贴”功能就不容易输错了。 在飞速滚屏完全静止之后,别着急启动其他程序,先耐心等一会儿,因为此时dll们还在找位置。 直到你的指示灯不闪了再做别的。

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论