小锋abc

小锋abc的笔记

来自第二章 寄存器(CPU工作原理)05(1)

8086CPU有4个段寄存器:CS:代码段 DS:数据段 SS:堆栈段 ES:附加段 CS和IP是8086CPU中最关键的寄存器, 它们指示了CPU当前要读取指令的地址。 CS为代码段寄存器 IP为指令指针寄存器 8086CPU工作的简要描述: 1.从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器; 2.IP=IP+所读取指令的长度,从而指向下一条指令。 3.执行指令。转到步骤1.重复这个过程。 在8086CPU加电启动或复位后,(即CPU刚开始i工作时)CS和IP被设CS=FFFFH,IP=OOOOH。 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令。 FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。在CPU中,程序员能够用指令读写的不见只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制CPU从何处执行指令是由CS。IP中的内容决定的,程序员可以通过改变CS。IP中的内容来控制CPU执行目标指令MOV指令不能用于设置CS,IP的值。修改可以用:同时修改CS。IP:jmp 段地址:偏移地址例如:jmp 2AE3:3 单纯修改IP:(段地址不变)jmp 某一合法寄存器 jmp axjmp bx CPU只认被CS。IP指向的内存单元中的内容为指令。所以要将CS.IP指向所定义的代码段中的第一条指令的首地址。CS存放指令的段地址,IP存放指令的偏移地址。8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。8086CPU的工作过程:1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器。2.IP指向下一条指令;3.执行指令。(转到步骤1.重复这个过程)8086CPU提供转移指令修改CS.IP的内容

来自第一章 基础知识03(0)

64位运行速度:64位CPU。64位操作系统。64位软件一个CPU有N跟地址总线,则可以说这个CPU的地址总线的宽度为N这样的CPU最多可以寻址2的N次方个内存单元、一跟总线=可以索引一个内存单元=一个字节(Byte)=8位(bit)   一位就是一个数据所以64位CPU可以走8个字节数据,所以一个字节就可以存2的8次方的数据 数据总线的宽度决定了CPU和外界的数据传送速度8086数据总线上传送的是16位的,8088是8位的 有多少跟控制总线,就意味着CPU提供了对外部器件的多少种控制,所以控制总线的宽度决定了CPU对外部器件的控制能力

来自第一章 基础知识04(0)

汇编指令是机器指令的助记符,同机器指令一一对应。每一种CPU都有自己的汇编指令集 CPU可以直接使用的信息在存储器中存放 在存储器中指令和数据没有任何区别,都是二进制信息 存储单元从零开始顺序编号一个存储单元可以存储8个bit(用作单位写成“b”),即8位二进制数。1B=8b 1KB=2024B每一个CPU芯片都有许多管脚,这些管脚和总线相连,也可以说,这些管脚引出总线。一个CPU可以引出三中总线的宽度标志了这个CPU的不同方面的性能:地址总线的宽度决定了CPU的寻址能力数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量 ;控制总线宽度决定了CPU对系统中其他器件的控制能力

来自第一章 基础知识05(0)

随机存储器(RAM)断电后数据不在只读存储器(ROM)断电后还在

来自第二章 寄存器(CPU工作原理)01(0)

一个字=2个字节CPU由运算器,控制器,寄存器组成,这些器件靠内部总线相连区别:内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其他器件的联系。8086CPU有14个寄存器,8个通用寄存器8086CPU所有的寄存器都是16位,可以存放两个字节。AX.BX.CX.DX为通用寄存器一个16位寄存器所能存储的数据的最大值为2 的16次方-1

来自第二章 寄存器(CPU工作原理)02(0)

由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放N个8位数据。也就是说,计算机中的数据大多是由1-N个8位数据构成的。汇编指令不区分大小写!两个十六进制的数代表一个字节,所以0000H代表两个字节=一个字

来自第二章 寄存器(CPU工作原理)03(0)

CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。我们把这个唯一的地址称为物理地址。16位结构的CPU主要由三方面来判断是几位:1.运算器一次最多可以处理16位的数据2.寄存器的最大宽度为16位3.寄存器和运算器之间的通路是16位。 8086COU的外部:有20位地址总线,可传送20位20位地址,寻址能力为1M8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64KB2的20次方=1MB  2的16次方=64KB8086CPU采用内部两个16位地址合并为一个20位物理地址=段地址*16+偏移地址

来自第二章 寄存器(CPU工作原理)04(0)

错误的认识:内存被划分成了一个一个的段,每个段有一个段地址.其实:内存并没有分段,段的划分来自于CPU,由于8086CPU用(段地址乘以16)+偏移地址=物理地址的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。2的16次方=64KBCPU访问内存单元时,必须向内存提供内存单元的物理地址。 COU可以用不同的段地址和偏移地址形成同一个物理地址。偏移地址16位,变化范围: 0-FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围:10000H-1FFFFH“数据在21F60H内存单元中”对于8086PC机的两种描述:1.数据存在内存的2000:1F60单元中,2.数据存在内存的2000段中的1F60H单元中 

来自第二章 寄存器(CPU工作原理)06-实验1(0)

R命令,查看。改变CPU寄存器的内容D命令查看内存中的内容E命令改写内存中的内容U命令将内存中的机器指令翻译成汇编指令T命令执行一条机器指令A命令以汇编指令的格式在内存中写入一条机器指令

来自第三章 寄存器(内存访问)01(0)

任何两个地址连续的内存单元,N号单元和N+1号单元,可以将他们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和地位字节单元。 8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。例如:我们要读取10000H单元的内容可以用如下程序段进行:mov bx.1000Hmov ds,bxmov al,[0]上面三条指令将10000H(1000:0)中的数据读到al中。 已知的MOV指令可完成的两种传送功能:1.将数据直接送入寄存器;mov ax,2;2.将一个寄存器中的内容送入另一个寄存器中mov bx,ax;除此之外,mov指令还可以将一个内存单元中的内容送入一个寄存器10000H表示为1000:0(段地址:偏移地址)将段地址1000H放入ds用mov al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中) 8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器 mov al,[0] 偏移地址为0的数据的一个字节 执行指令时,8086CPU自动取DS中的数据为内存单元的段地址10000H表示为1000:0(段地址:偏移地址)将段地址1000H放入ds用mov al,[0]完成传送(mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在ds中) 8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器(硬件设计的问题)mov ds,1000H是非法的!数据----通用寄存器---段寄存器 将数据从寄存器送入内存单元:mov bx,1000Hmov ds,bxmov [0],al    

来自JAVA视频04-04 while语句(0)

1.注意do-while语句最后有一个分号。2.do-while语句至少运行一次循环体,而while语句可以为0次。

来自第三章 寄存器(内存访问)03(0)

MOV指令的几种形式:MOV 寄存器,数据MOV AX,6MOV寄存器,寄存器MOV BX,AXMOV 寄存器,内存单元MOV AX,[0]MOV 内存单元,寄存器MOV [0],AXMOV段寄存器,寄存器MOV DS,AXMOV 寄存器,段寄存器 也是对的!ADD 和SUB指令都能符合MOV指令的前四种。试一试后面两种!MOV,ADD,SUB是具有两个操作对象的指令,JMP是具有一个操作对象的指令

来自第三章 寄存器(内存访问)04(0)

栈有两个基本的操作:入栈和出栈现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间这意味着,我们在基于8086CPU编程的时候,可以将一段内存当做栈来使用。8086CPU提供入栈和出栈的指令:PUSH(入栈)POP(出栈)PUSH AX;将寄存器AX中的数据送入栈中POP AX;从栈顶出去数据送入AX 8086CPU中,有两个寄存器:段寄存器SS 存放栈顶的段地址寄存器SP 存放栈顶的偏移地址任意时刻,SS:SP指向栈顶元素。PUSH指令的执行过程:PUSH AX;1.SP=SP-2;2.将AX中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。 将10000H--1000FH当做事栈空间栈空,SS:SP指向栈空间最高地址单元的下一个单元。指向PUSH AX后,SS:SP指向栈中的第一个元素 当在栈中执行了PUSH指令后,再进行POP指令后,该位置的数据还是存在的,当再一次进行PUSH指令后才能覆盖掉!(硬盘删除格式化后还可以恢复,因为这种删除只是删除了索引而已,需要多次覆盖才能彻底删除)我们将10000H-1000FH这段空间当做栈段,SS=1000H。栈空间大小为16字节,栈最底部的字单元地址为1000:000E。任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=000EH栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2,SP原来为000EH,加2后SP=10H所以,当栈为空的时候,SS=1000H,SP=10H 换个角度:任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中过没有元素。也就不存在栈顶元素所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2栈最底部字单元的地址为1000:000E,所以栈为空时,SP=0010H。

来自JAVA视频05-04 三维和多维数组(0)

int等表示数字数组最后实体的默认是0char 默认值 没意思布尔类型默认是flase

来自第三章 寄存器(内存访问)05(0)

POP AX1.将SS:SP指向的内存单元处的数据送入AX中;2.SP=Sp+2, SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。注意:指针往下指了,当数据还是在那个字单元里面的,只是复制到AX寄存器里而已。 栈顶越界的问题:SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈的找到栈顶。可是,如何能够保证在入栈。出栈时,栈顶不会超出栈空间呢?当栈满的时候再使用PUSH指令入栈,栈空的时候再使用POP指令出栈,都将发生栈顶超界的问题。栈顶超界是危险的:因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其他用途的数据,代码等。这些数据,代码可能是我们自己的程序中的,也可能是别的程序中的。(毕竟一个计算机系统并不是只有我们自己的程序在运行) 8086CPU的工作原理:只考虑当前的情况:1.当前栈顶在何处2.当前要执行的指令是哪一条结论:我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。PUSH和POP指令是可以在寄存器和内存之间传送数据的栈与内存:栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。(1)就是前面的PUSH和POP与通用寄存器进行交互(2)PUSH和POP与段寄存器进行交互PUSH 段寄存器:将一个段寄存器中的数据入栈。POP段寄存器:出栈,用一个段寄存器接受出栈的数据(3)PUSH和POP与内存单元进行交互PUSH内存单元:将一个内存单元处的字入栈(栈操作的都是以字为单位)POP内存单元:出栈,用一个内存字单元接受出栈的数据例如:PUSH [0] POP [2]指令执行时,CPU要知道内存单元的地址,可以在PUSH.POP指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从DS中取得

来自第三章 寄存器(内存访问)06(0)

数据不能直接跟段寄存器进行交互的,要经过通用寄存器。题目:将10000H-1000FH这段空间当做栈,初始状态是空的,将AX。BX.DS中的数据入栈。解答:MOV AX,1000HMOV SS,AXMOV SP,0010H:因为栈不空,所以SP=0010H。指针指向栈顶加1PUSH AXPUSH BXPUSH DS 我们要十分清楚的是:PUSH和POP指令同MOV指令不同,CPU执行MOV指令只需要一步操作,就是传送,而执行PUSH和POP指令却需要两步操作。执行PUSH时:先改变SP,后向SS:SP处传送。执行POP时:先读取SS:SP处的数据,后改变SP PUSH。POP等栈操作指令,修改的只是SP,也就是说,栈顶的变化范围最大为:0-FFFFH,也就是64KB的范围。(偏移地址16位的CPU) 8086CPU只记录栈顶,栈空间的大小我们要自己管理。 用栈来暂存以后要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。 PUSH和POP实质上时一种内存传送指令;

来自第三章 寄存器(内存访问)07(0)

我们可以将长度为N(N《=64KB)的一组地址连续,起始地址为16的倍数的内存单元,当作栈来使用,从而定义了一个栈段。将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行PUSH,POP等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问。将SS:SP指向我们定义的栈段。在之前有一道例子:在1000H--1000FH这段空间当作栈段,初始状态是空的,此时,SS=1000H,SP=0010.现在,如果我们将10000H-1FFFFH这段空间当作栈段,初始状态是空的,SS=1000H,则SP=?分析:我们将10000H-1FFFFH这段空间当作栈段,SS=1000H,栈空间大小为64KB,栈最底部的字单元地址为1000:FFFE。任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=FFFE。栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。SP原来为FFFE,加2后SP=0,所以,当栈为空的时候,SS=1000H,SP=0. 一个栈段最大可以设为多少?2的16次方=64KB利用PUSH和POP都是利用SP操作的,SS是不变的,所以栈顶的变化范围是0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0,如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。 一段内存,可以既是代码的存储空间,又是数据的存数空间,还可以是栈的空间,也可以什么都不是关键在于CPU中寄存器的设置,即CS.IP.SS.SP.DS的指向