指令寄存器

汇编语言王爽第六部分(数据传输指令)

本小妞迷上赌 提交于 2020-02-11 19:38:38
数据传输指令 实现寄存器和内存,寄存器和寄存器之间的单个数据传送。 mov (1)MOV 寄存器 , 寄存器/内存单元/段寄存器/立即数 (2)MOV 内存单元 , 寄存器/段寄存器/立即数 (3)MOV 段寄存器, 寄存器/内存单元 非法指令 (1)操作数类型不一致,例如mov ax,bl ax是十六位寄存器,bl是8位寄存器 (2)不能修改cs段寄存器内容 (3)不能在内存之间直接传输数据 (4)不能用立即数修改DS push push ax表示将ax数据入栈,入栈以字单位进行。 push ax执行过程 (1)SP=SP-2 (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶 pop pop ax表示从栈顶取出数据送入ax,出栈以字单位进行 pop ax执行过程 (1)将SS:SP指向的内存单元处的数据送入ax (2)SP=SP+2,以当前栈顶下面的单元为新的栈顶 pushf和popf (1)pushf是将标志寄存器的值压栈 (2)popf是从栈中弹出数据 (3)原理与push和pop类似 来源: CSDN 作者: 无名至尊 链接: https://blog.csdn.net/qq_41955402/article/details/104267260

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

MOV & LEA

两盒软妹~` 提交于 2020-02-09 06:29:41
MOV & LEA 周银辉 注:下面的代码采用GAS风格, movl 与 leal 中的l是GAS后缀,表示操作数数“双字”类型的,你可以简单地理解成int。我将mov翻译成“加载”,接近“拷贝”的韵味,而不是直译的“移动” 1, movl 立即数 寄存器 将立即数加载到指定的寄存器,比如 movl $0x1234, %eax 则是将十六进制的0x1234加载到eax 2, movl 寄存器 寄存器 将寄存器的内容加载到另外一个寄存器中,比如 movl %ebx, %eax 则是将寄存器ebx中的内容拷贝一份到eax中 3, movl 内存 寄存器 将内存中的内容加载到寄存器中,比如 movl (%ebx), %eax 其先去ebx读取一个值,然后用这个值作为内存地址,到内存中加载实际内容到eax 4, movl 立即数 内存 将立即数加载到内存中去,比如 movl $0x1234, (%ebx) 其先去ebx读取一个值,然后用这个值作为内存地址, 然后将十六进制数0x1234加载进去 5, movl 寄存器 内存 将寄存器中内容加载到内存中去,比如 movl %ebx, (%eax) 其先去eax读取一个值,并将这个值作为内存地址,然后将ebx中的值加载到内存地址中去 注意到了吗?我没有列举 “movl 内存 内存”, 因为这是不合法的,如想将内存中内容加载到另一段内存

MOV与LEA

偶尔善良 提交于 2020-02-09 06:26:40
MOV 格式: MOV dest, src 作用:赋值,且不改变标记位的值 特点:可以从寄存器到寄存器、从立即数到寄存器、从存储单元到寄存器、从立即数到储存单元、从寄存器到存储单元、从寄存器或存储单元到段寄存器(除CS寄存器); 立即数不能值接送段寄存器 [ ] 作用: 对于变量:有无 [ ] 都表示取值 对于寄存器:有 [ ] 表示取地址,无 [ ] 表示取值 LEA (Load Effective Address) 格式: LEA dest, src 作用:将源操作数的偏移地址给目的操作数,即返回的是src的地址;另外,LEA指令具有单时钟周期,执行效率很高。 [ ] 作用: 对于变量:有无 [ ] 都表示取地址 对于寄存器:有 [ ] 表示取值,无 [ ] 表示取地址( 正好与MOV相反 ) 举例 对于计算EAX*4+EBX+3,结果放入EDX MOV MOV EDX, EAX SHL EDX, 4 ADD EDX, EBX ADD EDX, 3 LEA LEA EDX, [EBX + EAX * 4 + 3] 参考: https://blog.csdn.net/fengyuanye/article/details/85715565 来源: https://www.cnblogs.com/libbin/p/11625690.html

转:汇编常见错误

ⅰ亾dé卋堺 提交于 2020-02-09 05:21:47
1、test.asm(54): error A2000: Block nesting error 说明:此错误信息通常见于一个段定义起始段名和末尾段名不一致。 修改:检查段定义,使段名前后保持一致。 2、test.asm(5): error A2005: Symbol is multidefined: DATA 说明:此错误信息提示DATA符号重复定义了。 修改:将其中一个符号DATA重新设置。 3、test.asm(7): error A2009: Symbol not defined: B9H 说明:此错误信息为test.asm中第7行指令出错,查看该指令,源操作数为十六进制数B9H。按规定以字母开始的十六进制数,应在其前面加上数字0以便汇编程序区分常数和符号。另一种出错的可能原因是程序中使用的符号变量没有定义。 修改:以0B9H取代B9H;使用伪指令定义变量。 4、test.asm(11): error A2009: Symbol not defined: NO 说明:test.asm中第11行指令JLE no-count,符号中使用了中折线,中折线在汇编中是作为减号,因此,汇编提示标号NO没有定义。注意,汇编语言规定符号中可以使用下划线。 修改:将no-count改为no_count。 5、test.asm(28): error A2010: Syntax error 说明

计算机是这样工作的

本秂侑毒 提交于 2020-02-09 03:12:12
陈民禾,原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ,我的博客中有一部分是出自MOOC课程中视频,再加上一些我自己的理解。 一、首先在理解计算机是如何工作之前,我们先来理解一下现代计算机的模型。 现代计算机是存储程序计算机,依据冯诺依曼体系结构构造。从硬件的层面,也就是我们从计算机的主板。冯诺依曼体系结构我们可以大概抽象成一个cpu。还有一块可以抽象成内存,cpu和内存有一个连接,我们称之为总线,然后就是cpu内部,cpu里面有个很重要的寄存器,叫做ip,它总是指向内存的某一块区域,比如说它指向代码段,此时cpu就从IP指向的那个内存地址取过来一条指令执行,执行完之后Ip自加一,这样像贪吃蛇一样一步步向下面走,这就是从硬件方面解释的冯诺依曼体系。 二、计算机依靠机器语言进行工作,我们可以通过汇编语言来“指挥”计算机完成一些工作,下面就是一些汇编基础知识,总结如下: X86计算机的寄存器:32位的X86计算机的寄存器,它的低16位作为16位的寄存器,16位的寄存器,它还有8位的寄存器。8位的寄存器包含AH,BH,CH,DH,AL,BL,CL,DL。16位的寄存器包含AX,BX,CX,DX,BP,SI,DI,SP。所有开头为E的寄存器一般来讲是32位的。譬如EAX:累加器

用户态与内核态的切换

ぃ、小莉子 提交于 2020-02-07 13:54:23
内核态与用户态的理解: 2)特权级 熟悉Unix/Linux系统的人都知道,fork的工作实际上是以系统调用的方式完成相应功能的,具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux,对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。 特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intel x86架构的CPU来说一共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。 3)用户态和内核态

Virtualbox源码分析16 APIC虚拟化1 APIC概念和初始化

♀尐吖头ヾ 提交于 2020-02-06 18:08:57
说明: APIC我其实也理解的不是特别明白,只是从网上找些资料和阅读源码理解,如果有错误,麻烦在下面评论里指出。 虚拟化有个重要的功能: APIC虚拟化,本章重点介绍这个功能 中断是什么 一般来说,中断主要是由一些硬件设备产生的,表示这些硬件有一些重要的事件需要通知处理器,比如某些从外部设备请求的数据准备好了,需要通知处理器对其进行读取等。当然这里所谓的“一般来说”是指也可以通过软件的方式来触发中断,比如调用 INT n 指令,当然这种方式产生的中断和通过意见产生的中断最终的处理方式会有很大的不同。 因此从种类来分,可以将中断分为通过硬件产生的外部中断(External interrupt)和通过软件产生的软件中断(Software interrupt)。不管是外部中断还是软件中断,每个中断都有一个中断号与之对应,对于外部中断来说,可使用的中断号范围从16到255(0到15)为系统预留的中断号,而对于软件中断来说,可使用的中断号为0到255。除此之外,16到255范围内的中断是可以通过EFLAGS中的 IF flag 进行disable的,如果EFLAGS中的 IF flag 被清零,则表示当前CPU不接受这个范围内的中断,如果其被置为1,则表示当前CPU可以正常处理这个范围内的中断。 中断是如何被发送给CPU的? 中断在进入CPU之前,首先会进入一个被称为Advanced

nasm帮助

自古美人都是妖i 提交于 2020-02-05 01:25:37
3.1 NASM源程序行的组成。 就像很多其他的汇编器,每一行NASM源代码包含(除非它是一个宏,一个预处理操作 符,或一个汇编器操作符,参况第4,5章)下面四个部分的全部或某几个部分: label: instruction operands ; comment 通常,这些域的大部分是可选的;label,instruction,comment存在或不存在都是允 许的。当然,operands域会因为instruction域的要求而必需存或必须不存在。 NASM使用反斜线()作为续行符;如果一个以一个反斜线结束,那第二行会被认为 是前面一行的一部分。 NASM对于一行中的空格符并没有严格的限制:labels可以在它们的前面有空格,或 其他任何东西。label后面的冒号同样也是可选的。(注意到,这意味着如果你想 要写一行’lodsb’,但却错误地写成了’lodab’,这仍将是有效的一行,但这一行不做 任何事情,只是定义了一个label。运行NASM时带上命令行选项’-w orphan-labels’ 会让NASM在你定义了一个不以冒号结尾的label时警告你。 labels中的有效的字符是字母,数字,’-’,’ KaTeX parse error: Expected 'EOF', got '#' at position 4: ','#̲','@','~','.'和'… ‘前缀