操作数

M0+体系结构与指令系统简介

老子叫甜甜 提交于 2020-01-09 16:56:11
M0+体系结构与指令系统简介 ARM Cortex-M0+出现的背景 存储器映像 ARM Cortex-M0+指令集 数据传送类指令 取数指令 存数指令 寄存器间数据传送指令 堆栈操作指令 数据操作类指令 算术运算类指令 逻辑运算类指令 移位运算类指令 跳转指令 其他指令 ARM Cortex-M0+ 寻址方式 立即数寻址 寄存器寻址 偏移寻址及寄存器间接寻址 直接寻址 ARM Cortex-M0+出现的背景 32位的M0+系列处理器是ARM公司2012年推出的,主要的目的是替代原有的8位/16位微控制器,具有性价比高,功耗低等特点,其内核性能接近8位或16位竞争产品的2倍。 这些功能模块提高了M0+处理器的性能及其编程优势,降低了系统的移植难度。 存储器映像 把这4GB空间当作存储器来看待,分成若干区间,都可安排一些实际的物理资源。 用于标志ALU的状态:负标志N 零标志Z 进位标志C 溢出标志V 异常号 中断屏蔽寄存器,只有D0位有意义,当该位被置位时,除不可屏蔽中断和硬件错误以外的所有中断都被屏蔽。 ARM Cortex-M0+指令集 数据传送类指令 取数指令 存数指令 寄存器间数据传送指令 堆栈操作指令 数据操作类指令 算术运算类指令 逻辑运算类指令 移位运算类指令 跳转指令 控制程序的执行流程 其他指令 ARM Cortex-M0+ 寻址方式 立即数寻址

汇编命令笔记

安稳与你 提交于 2020-01-06 14:36:36
汇编命令笔记 JL(jl) 汇编语言中条件转移语句:JL/JNGE, 用于有符号数的条件转移指令,小于\不大于且不等于转移;ZF=0,且SF⊕OF=1。 汇编程序设计中jl是一个条件跳转指令,全名jump less,意为小于跳转,有符号数比较类似的还有还有jg、ja、jb等jg jump great 大于跳转,有符号数比较ja above 大于,无符号数比较jb below 小于,无符号数比较条件跳转根据的是标志位,条件跳转语句前面一般都有一些对标志位有影响的语句,如cmp ,test ,sub等 笔记来源 JZ(jz) ZF汇编语言中的PSW标志寄存器中的一位,而JZ则是根据ZF决定是否跳转。若ZF=1(表示本次运算结果为0,不为0则ZF=0),则跳转,否则,不跳转ZF的状态根据其他指令的执行结果设置。 jz=jump if zero,即零标志为1就跳转,一般与cmp连用,用以判断两数是否相等 jz的另一种写法就是je,je=jump if equal,jz和je的作用是完全一样的 JZ是累加器A判零条件转移指令. JZ rel ;若A=0,则PC+2+rel—>PC;否则,PC+2—>PC(rel : 以补码形式表示的8位地址偏移量,其值为-128~+127) 笔记来源 TEST(test) TEST 指令在两个操作数的对应位之间进行 AND 操作,并根据运算结果设置符号标志位

C++ Primer 有感(重载操作符)

这一生的挚爱 提交于 2020-01-05 10:21:37
1.用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。(重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义) 2.重载操作符,操作符的优先级、结合性或操作数数目不能改变。 注意:重载操作符时使用默认实参是非法的 。 3.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性。 4.作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。( 重载一元操作符如果作为成员函数就没有(显式)形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时有一个形参,定义为非成员函数时有两个形参 ) 5.重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法。这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义。 6. 将要用作关联容器键类型的类定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。如果类定义了相等操作符,它也应该定义不等操作符!=。 7.为类设计存在操作符的时候,是将操作符设置为类成员还是普通黑成员函数。下面是一些指导原则

C++ Primer 有感(重载操作符)

这一生的挚爱 提交于 2020-01-05 10:21:17
1.用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。(重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义) 2.重载操作符,操作符的优先级、结合性或操作数数目不能改变。 注意:重载操作符时使用默认实参是非法的 。 3.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性。 4.作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。( 重载一元操作符如果作为成员函数就没有(显式)形参,如果作为非成员函数就有一个形参。类似的,重载二元操作符定义为成员时有一个形参,定义为非成员函数时有两个形参 ) 5.重载逗号、取地址、逻辑与、逻辑或等操作符通常不是好做法。这些操作符具有有用的内置含义,如果我们定义了自己的版本,就不能再使用这些内置含义。 6. 将要用作关联容器键类型的类定义<操作符。关联容器默认使用键类型的<操作符。即使该类型将只存储在顺序容器中,类通常也应该定义相等(==)操作符和小于(<)操作符,理由是许多算法假定这些操作符存在。如果类定义了相等操作符,它也应该定义不等操作符!=。 7.为类设计存在操作符的时候,是将操作符设置为类成员还是普通黑成员函数。下面是一些指导原则

汇编语言---GCC内联汇编

我怕爱的太早我们不能终老 提交于 2020-01-05 09:57:48
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂, 格式如下 : __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__ : 它是GCC定义的关键字 asm 的宏定义(#define __asm__ asm),它用来声明一个内联汇编表达式,所以,任何一个内联汇编表达式都以它开头,它是必不可少的;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__asm__; 2.__volatile__ : 它是GCC关键字 volatile 的宏定义;这个选项是可选的;它向GCC声明"不要动我所写的instruction list,我需要原封不动地保留每一条指令";如果不使用__volatile__,则当你使用了优化选项-O进行优化编译时,GCC将会根据自己的判断来决定是否将这个内联汇编表达式中的指令优化掉;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__volatile__; 3.instruction list : 它是汇编指令列表;它可以是空列表,比如:__asm__ __volatile__("");或__asm__("");都是合法的内联汇编表达式

【转贴】GCC 内联汇编

坚强是说给别人听的谎言 提交于 2020-01-05 09:56:10
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?

计算机组成原理——第七章

五迷三道 提交于 2020-01-02 16:28:43
1.指令系统中采用不同的寻址方式的目的是: 缩短指令字长,扩大寻址空间,提高编程灵活性 2.一地址指令中,除地址译码指明的一个操作数外,另一个数用( 隐含寻址 )的方式 4.操作数在寄存器中的寻址方式是(寄存器直接寻址) 5.寄存器间接寻址 方式中,操作数存于( 主存单元 )( 寄存器指明操作数在主存中的地址 ) 7.基址寄存器寻址方式中,操作数的有效地址是( 基址寄存器BR内的值加上形式地址 ) 8.采用基址寻址,基址寄存器内容有 操作系统 确定,在 程序中不能改变 9.采用变址寻址,变址寄存器( IX )内容有用户确定,在程序执行过程中 可以改变 10.堆栈的出栈和入栈操作是相反的,入栈是先 (A)到Msp然后sp-1到sp (注意, 栈顶的地址要比下面的地址都要小 ), 出栈是sp+1到sp,然后再(A)到Msp 13.寻址方式中,立即寻址快于直接寻址快于间接寻址 14.扩展操作码的目的是: 增加指令数(特征位) 16.子程序 调用 指令完整的功能是:( 改变程序计数器的值和堆栈指针sp的值 ) 17.子程序返回指令完整的功能是:( 从堆栈中恢复程序技术器的值 ) 二.填空题 1.在直接寻址中,操作数的有效地址是X,间接寻址中:(X)相对寻址中( PC)+ X ,基址寻址中 (BR)+ X,变址寻址中(IX)+ X 2.条件转移,无条件转移,子程序调用都属于( 程序控制或跳转

段寄存器的引用

筅森魡賤 提交于 2020-01-02 06:27:07
段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。 段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。 段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。 段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。 通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器 一般情况下,段寄存器及其指针寄存器的引用关系如下表所示。表中的“可选用的段寄存器”即是可以用强置说明这些段寄存器的值来作为其操作数地址的段地址。 由上表可以看出16位CPU在段寄存器的引用方面有如下规定:   取指令所用的段寄存器和偏移量一定是用CS和IP;   堆栈操作所用的段寄存器和偏移量一定是SS和SP;  

C#异步编程学习笔记之-async和await

谁都会走 提交于 2020-01-02 04:50:58
一、异步方法介绍(async和await): 如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能。 1、标记的异步方法可以使用await来指定暂停点。await运算符通知编译器异步方法:在等待的异步过程完成后才能继续通过该点。 同时,控制返回至异步方法的调用方。 异步方法在await表达式执行时暂停并不构成方法退出,只会导致 finally 代码块不运行。 2、标记的异步方法本身可以通过调用它的方法等待。 注意: ★ 异步方法通常包含await运算符的一个或多个实例,但缺少await表达式也不会导致生成编译器错误(编译器将为此类方法发布一个警告),如: ★ 如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,即使有async修饰符,也不例外。 二、异步方法示例: 使用async关键字定义的异步方法简称为“异步方法”,如: async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); //耗时处理,需要异步执行 Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); //这里是不需要异步执行的内容 DoIndependentWork(); /

[书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT

為{幸葍}努か 提交于 2020-01-01 22:26:23
进入保护模式;初始化全局描述符表,通过GDT进入代码段、数据段、堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码 ; 设置堆栈段和栈指针 ; 0x07c00以此为界限,mbr代码段cs:ip向上,mbr堆栈段ss:sp向下 mov ax, cs mov ss, ax mov sp, 0x7c00 ; 计算gdt所在的逻辑段地址 ; 32位忽略高位0,折算为20位,即ds:bx形式(ds*16 + bx) mov ax, [cs:gdt_base + 0x7c00] ; 低16位 mov dx, [cs:gdt_base + 0x7c00 + 2] ; 高16位 mov bx, 16 div bx mov ds, ax ; 商为逻辑段地址 mov bx, dx ; 余数为偏移地址 ; 创建gdt第#0号描述符 ; 处理器规定,gdt中第一个描述符必须是空描述符 mov dword [bx], 0x00000000 mov dword [bx+0x04], 0 ; 创建gdt第#1号描述符,保护模式下的代码段描述符 ; 该段:线性基地址为0x0000 7c00,段界限为0x0 01FF(即段长512字节),粒度为字节(G=0) ; 属于存储器的段(S=1),是32位的段(D=1),目前位于内存中(P=1)