数据寄存器

MMU内存管理单元

女生的网名这么多〃 提交于 2020-03-03 20:52:13
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责 虚拟地址映射为物理地址 ,以及提供硬件机制的内存访问授权、多任务多进程操作系统。(来自百度百科, 对其几个点不熟悉,因此可以只考虑加粗部分 ) 发展历史 注意:学习一个知识点,很重要的一步是了解其 为什么而存在?它的存在是为了解决什么问题? 然后,在学习的过程中带着这些问题去理解、去思考。 在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个 覆盖块 ,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个 虚拟存储器(virtual memory) 的方法。虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码

Linux

对着背影说爱祢 提交于 2020-03-02 07:40:02
在linux内核的源代码中,以汇编语言编写的程序或程序段,有两种不同的形式。 第一种事完全的汇编代码,这样的代码采用.s作为文件的后缀。事实上,尽管是完全的汇编代码,现代的汇编工具也吸收了C语言的长处,也在汇编之前加上了一趟预处理,而预处理之前的文件则以.s为后缀。此类(.s)文件也和C程序一样,可以使用#include、#ifdef等等成分,而数据结构也一样可以在.h的文件中加以定义。 第二种是嵌在C程序中的汇编语言片断。虽然在ANSI的C语言标准中并没有关于汇编片段的规定,事实上各种实际使用的C编译中都作了这方面的扩充,而 GNU的C编译gcc也在这方面作了很强的扩充。 在DOS/windows领域中,386汇编语言都采用Intel定义的语句格式。可是,在Unix领域中,采用的却是由AT&T定义的格式。 AT&T的汇编与Intel的汇编主要有以下的区别: 在Intel格式中大多使用大写字母,而在AT&T格式中都使用小写字母。 在AT&T格式中,寄存器名要加上“%”作为前缀 ,而在Intel格式中不带前缀。 在AT&T的386汇编语言中,指令的源操作数的顺序与在Intel的386汇编语言中正好相反。 在AT&T格式中,访问指令的操作数的宽度有操作码名称的最后一个字母(操作码的后缀决定)。用作操作码后缀的字母有b(8位)。 w(16位)和1(32位)。 而在Intel格式中

汇编语言-寄存器

☆樱花仙子☆ 提交于 2020-03-01 09:36:35
3.1 字和数据段 1. 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。 2. 用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。 3. [address]表示一个偏移地址位address的内存单元。 4. 在内存和寄存器之间传送字行数据时,高地址单元和高8位寄存器,低地址单元和低8位寄存器相对。 5. mov, add, sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。 3.2 栈 1. 在SS,SP中存放栈顶的段地址和偏移地址;提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。 2. push指令的执行步骤:SP = SP - 2;向SS:SP指向的字单元中送入数据。 3. pop指令的执行步骤:从SS:SP指向的字单元中读取数据;SP = SP + 2。 4. 任意时刻,SS:SP指向栈顶元素。 5. 8086CPU只记录栈顶,栈空间,的大小我们要自己管理。 6. 用栈来暂存以后需要恢复的寄存器的内容,寄存器出栈的顺序要和入栈的顺序相反。 7. push,pop实质上是一种内存传送指令,注意他们的灵活应用。 3.3 栈段 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义位一个段。我们可以将长度为N(N ≤

嵌入式C语言编程小知识总结

試著忘記壹切 提交于 2020-03-01 08:38:58
嵌入式C语言编程小知识总结 1. 流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率,解决发案就是尽量使用指令的“条件执行”功能。 2. 在LPC2200系列中: 可以通过过下面的程序延迟10毫秒: for(i=0;i<200;i++) { for(j=0;j<200;j++); } 3. 通过下面语句将一个16位的变量放在两个8位的变量中。 //IP数据报总长度高字节 IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8; //IP数据报总长度低字节 IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff; 4. 在对全部数组元素赋初值时,可以不指定数组长度。 eg;inta[]={1,2,3,4,5}; 但如果当输出第a[5]以上的元素时,系统回输出随机数值,所以使用此方法时,不能使用超过初始值元素以上的元素。 5. 由于ADS先天性的对printf不支持;因此不便于我们调试,可以利用串口输出来代替printf来调试。 6. 用或运算,可使某位置为1,其它位不变 eg: PINSEL0 |= 0x00000005; //设置串口引脚 使第0位和第二位置一,其他位不变。 7

浅析VS2010反汇编

China☆狼群 提交于 2020-02-29 07:04:36
第一篇 1. 怎样进行反汇编 在调试的环境下,我们能够很方便地通过反汇编窗体查看程序生成的反汇编信息。 例如以下图所看到的。 记得中断程序的运行,不然看不到反汇编的指令 看一个简单的程序及其生成的汇编指令 #include<stdio.h> #include<windows.h> const long Lenth=5060000/5; int main(){ while(true){ for(long i=0;i<Lenth;i++){ ; } Sleep(10); } } 汇编窗体 2. 预备知识 : 函数调用大家都不陌生,调用者向被调用者传递一些參数,然后运行被调用者的代码,最后被调用者向调用者返回结果,还有大家比較熟悉的一句话。就是函数调用是在栈上发生的,那么在计算机内部究竟是怎样实现的呢? 对于程序,编译器会对其分配一段内存。在逻辑上能够分为代码段。数据段,堆,栈 代码段:保存程序文本。指令指针EIP就是指向代码段。可读可运行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可运行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长。可读可写可运行 栈(Stack):存放局部变量。函数參数,当前状态。函数调用信息等, 向地址减小的方向增长 。很很重要,可读可写可运行 如图所看到的 寄存器 EAX :累加(Accumulator

51单片机串口通信

主宰稳场 提交于 2020-02-27 15:34:17
这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1) 。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。 该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2

CSAPP学习笔记 —— 运行hello程序解析

孤街浪徒 提交于 2020-02-27 14:06:57
Date : 2020 - 02 - 09 Author : Soler HO Book : Computer System : a Programer's perspective 初始时,shell程序执行它的指令,等待输入一个命令。当键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中。 利用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。步骤如下: 一旦目标文件hello中的代码和书就被加载到主存中,处理器就开始执行hello程序的main程序中的机器语言指令。 这些指令将“hello,world\n”字符串中的字节从主存复制寄存器文件,再从寄存器文件中复制到显示设备,最终显示屏幕上。 来源: oschina 链接: https://my.oschina.net/u/2404777/blog/3164636

做一个FSK的收发试验 之四

*爱你&永不变心* 提交于 2020-02-26 20:59:18
正如上述几个BLOG所描述的,我们这个FSK的基本思路就是传递数据0时候一个频率,传递1时候是另外一个频率。我们通过DDS合成不同的频率,而通过过零检测实现对接收到基带频率统计周期的计算,从而判断是在那个频率点上,以解调出来0或者1。 我们这里做一个接口,查看一下在不同的频率设置点上,收到的信号周期都是多少。 这个cnt寄存器索引到axi lite的4号寄存器里面。 unsigned int FSK_GET_CNT(){ unsigned int r = *(volatile unsigned int *) (0x43c00000 + 4*4) ; return ( r ); } 之后循环设置不同的step数值,调用这个函数看一下周期数duosh。 while(1){ FSK_TX_SET (0,0,i,i); usleep(1000); t32=2; while(t32--) { printf("%d , %d ,\n",i,FSK_GET_CNT()); usleep(100); } while(1) if ( 0x0d == getchar())break; i++; } 我们看一下结果: 很显然发送时设置的步进step和收的周期计数器cnt基本成反比,即在误差允许范围内step*cnt=360 文本的统计我列下来: /* *1 , 359 , 2 , 179 , 3 ,

X86汇编3.内存访问

老子叫甜甜 提交于 2020-02-26 04:08:25
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 1.内存中字的存储 8086CPU中,用16位寄存器来存储一个字,高8位存放高字节,低8位存放低字节。在内存中存储时,由于内存单元是字节单元,一个单元存放一个字节,那么一个字(2字节,16位)应该用两个连续的存储单元(内存地址)来存储,低字节存放在低地址,高字节存放在高地址,这就是我们所说的小端序,大端序与之相反。 字单元:存放一个字型数据(16位)的内存单元,它由两个连续内存单元组成。 8086CPU不支持将数据直接存入段寄存器(DS),需要先将数据存放到通用寄存器,然后再MOV到段寄存器。 “[address]”做为一个整体表示一个内存单元,中括号中的数字表示内存单元的偏移地址。如: 假设DS中为1000H,那么: MOV Al, [0] ;将10000H内存地址中的数据存入AX MOV [0], Al ;将AX中的数据存入内存地址10000H eg.1读取10000H中内存单元的内容 mov bx, 1000H mov ds, bx mov al, [0] eg.2将al中的数据存入10000H内存地址中 mov bx, 1000H mov ds, bx mov [0

X86汇编4.基本指令详解

故事扮演 提交于 2020-02-26 03:47:57
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 数据: [bx]:eg. mov ax,[bx],表示bx寄存器中的数据作为一个偏移地址EA,段地址SA默认在D中,将SA:EA内存单元中的数据存入AX x ptr: x表示:word、byte,eg. mov word ptr ds:[0],1 start标号:指定程序运行起始地址 伪指令: 1.segment...ends伪指令 格式: XXX segment ;定义一个一个段开始,名称为XXX XXX ends ;定义一个段结尾,名称为XXX 释义:segment...ends指令对,定义一个段XXX。 2.end 释义:end是一个汇编程序结束的标志。 3.assum 释义:表示假设,它假设某一段寄存器和程序中的某一个sgment...ends定义的段相关联,上面示例assume cs:codesg就是将代码段codesg和CPU中的段寄存器cs联系起来。 4.数据定义伪指令 dw:定义数据类型,定义字型数据,如:dw 0123H, 0456H, 0789H db:定义ASCII码数据,eg. db 'unix' dd:定义双字型数据 dup:数据复制,db 3