通用寄存器

Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)

狂风中的少年 提交于 2020-03-15 11:39:12
Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) 1 u-boot.lds 首先了解uboot的链接脚本board/my2410/u-boot.lds,它定义了目标程序各部分的链接顺序。 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件为ELF格式,32为,ARM小端*/ OUTPUT_ARCH(arm)/*指定输出可执行文件为ARM平台*/ ENTRY(_start)/*起始代码段为 _start*/ SECTIONS { /* 指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置*、 . = 0x00000000;从 0x0位置开始 . = ALIGN(4); 4字节对齐 .text : { cpu/arm920t/start.o (.text) board/my2440/lowlevel_init.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } /* 只读数据段

汇编语言学习总结

隐身守侯 提交于 2020-03-13 09:39:46
8086CPU 总共有14 个16位寄存器:         1、通用寄存器:8个         2、指令指针:1个         3、标志寄存器:1个 18位         4、段寄存器:4个 1、通用寄存器:数据寄存器4个 、、、 指针寄存器及变址寄存器4个        a、数据寄存器可以分为 高8位、低8位,可以分别寻址               AX = AH &AL:累加寄存器--------------运算、与外部IO通信               BX = BH & BL:基址寄存器-------------地址索引               CX =CH & CL:计数寄存器-------------计数--------移位指令、循环(loop)               DX = DH & DL:数据寄存器-------------数据传递        b、指针寄存器和变址寄存器               SP(Stack Pointer):堆栈指针寄存器-----------------SS:SP->目前的堆栈位置               BP(Base Pointer):基址指针寄存器------------------SS: BP               SI(Source Index):源变址寄存器 --------------

汇编——第二章 寄存器

五迷三道 提交于 2020-03-09 18:42:44
第二章 寄存器 cpu的主要的部件是寄存器, 不同的cpu,寄存器的个数、结构是不相同的。 在8086cpu中有14个寄存器,这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 IP:指令指针,指向当前相互要取出的指令字节,当BIU从内存中取出一个指令后,IP就自动加1, 这里的1指的不是一个字节,而是该条指令所占的字节数。 IP指向的是指令地址的段内地址偏移量,又称为 偏移地址(Offset Address) 或者 有效地址(A, Effective Address)。 CS:代码段寄存器 DS:数据段寄存器 SS:堆栈寄存器 ES:附加段寄存器 其他的寄存器会在后面相应的章节一一列出作用。 2.1 通用寄存器 8086CPU的所有寄存器都是16位的,可以存放俩个字节。 其中通用寄存器为AX、BX、CX、DX这四个。 这四个寄存器又可以分为8个单独的寄存器来使用,拿AX来说,可以分为高低俩个字节,名字分别为AH、AL。 虽说这四个寄存器都是通用寄存器,但是其都有独自的功能和特点。 AX:累加寄存器,通常用于运算,在乘除指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传输数据。 BX:基址寄存器,常用于地址索引。 CX:计数寄存器,常用于计数;常用于保存计算值,如位移指令,循环(loop

汇编

风流意气都作罢 提交于 2020-03-08 18:29:13
CPU有三条总线: 地址、数据、控制线 地址总线确定存储单元 控制总线发送指令 数据总线:传输数据 CPU N个地址线 地址总线宽度为N 可以寻找2^N个内存单元 *存储单元 0开始编号,一个存储单元可以存储一个Byte 8086CPU有16根地址线 1bit就是一根地址线 存储器以B为最小单位 ========================第二章 寄存器========================== 通用寄存器: AX BX CX DX AX ——> AH和AL 16位寄存器最大能存储的数 2^16 - 1 = 65536 - 1 转十六进制是四位 0~FFFFH 8 位寄存器 2^8 = 256 转十六进制 0~FFH 8086CPU在内部采用2个16位地址合成的方法来形成一个20位的物理地址 地址加法器: 物理地址 = 段地址 X 16 + 偏移地址 段地址 X 16 的说法是左移 4 位 一个X进制数左移1位,相当于乘以X 段地址 X 16 + 偏移地址 含义是: CPU 在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。 起始、基础地址就是段地址 偏移地址16位,0~FFFFH, 64KB *课后题: (1) CPU寻址范围 (0001H+ 0000H x 16 ) ~ (0001H+FFFFH x 16 )

汇编语言(王爽版)学习笔记 第二章 寄存器【CPU工作原理】(1)

旧巷老猫 提交于 2020-03-07 04:24:10
CPU概述 一个典型的CPU由 运算器、控制器、寄存器 等器件组成,这些器件靠内部总线相连。 区别: 内部总线实现CPU内部各个器件之间的联系 外部总线实现CPU和主板上其它器件的联系 8086CPU有14个寄存器: AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW 2.1通用寄存器 8086CPU所有的寄存器都是16位的,可以存放两个字节。 AX,BX,CX,DX通常用来存放一般性数据的被称为通用寄存器 一个16位的寄存器可以储存一个16位的数据 可存放的最大数据是2 16 -1 8086上一代CPU中的寄存器都是8位的; 为保证兼容性,AX,BX,CX,DX都可以分为两个独立的8位寄存器使用。 AX–>AH和AL BX–>BH和BL CX–>CH和CL DX–>DH和DL AX的高八位(8~15)组成了AH寄存器 AL的低八位(0~7)组成了AL寄存器 二者都可以单独使用 2.2 字在寄存器中的存储 一个字(word=2B)可以存在一个16位的寄存器中,这个字的高位字节和低位字节就存在这个寄存器的高8位寄存器和低8位寄存器中。 2.3 几条汇编指令 注:汇编指令不区分大小写 ?处表示4位已经存储不下了 ↓↓↓ 注:这里的丢弃,并不是指真正的丢弃进位值,只是进位值不能在8位寄存器中保存。 检测点2.1 AX=F4A3H AX=31A3H AX

ARM嵌入式系统

眉间皱痕 提交于 2020-03-02 10:10:28
一、常见的ARM嵌入式系统开发环境配置: 1、编译器/汇编器 2、指令系统模拟器 3、在线仿真器或调试探测器 4、目标开发板 5、跟踪捕捉仪 6、嵌入式操作系统 ARM嵌入式系统C编译器:ARM公司,keil公司,IAR System公司,lauterbach公司。 二、ARM嵌入式系统的硬件构成 ARM嵌入式芯片主要由32位ALU、31个32位通用寄存器和6个状态寄存器、32x8位乘法器、32x32位桶形移位寄存器、指令译码及控制逻辑、指令流水线和数据/地址寄存器组成。 在ARM处理器结构中,使用流水线技术以提高处理器指令的运行速度。在流水线操作中,允许多个操作同时进行,以及处理和存储系统连续操作。 三、ARM硬件配置 Cortex-M3是一个32位ARM处理器内核。内部的数据宽度是32位的,寄存器的接口同样也是32位的。与常用的ARM嵌入式处理器一样,Cortex-M3采用了哈弗结构,拥有独立的指令和数据总线,可以同时进行取地址操作和数据访问操作。 采用哈佛结构的数据/指令储存方式,处理器在访问数据的时候不再占用数据总线,从而提升了系统处理的性能。为进一步提高ARM处理器的处理能力,CM3的内部结构中包含了多条总线接口方式,每条总线都专门为特定的应用场合进行综合优化,并可以多条总线并行工作。 1、CM3中的寄存器组 在CM3处理器中包含了R0~R15寄存器组,其中

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法

徘徊边缘 提交于 2020-03-02 06:40:07
开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限 制,使用精练的汇编可以缩小目标代码的Size。另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能。所以我们必须了解汇编语言,即使你有可 能并不喜欢它。 如果你是计算机专业的话,在大学里你应该学习过Intel格式的8086/80386汇编,这里就不再讨论。如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法。 本书不会去讨论8086/80386的汇编编程,这类的书籍很多,你可以参考它们。这里只会讨论AT&T的汇编语法,以及GCC的内嵌汇编语法。 -------------------------------------------------------------------------------- 0.3.2 Syntax 1.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。 80386有如下寄存器: 8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp; 8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,

最牛X的GCC 内联汇编

别说谁变了你拦得住时间么 提交于 2020-03-02 05:55:44
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 内联汇编。这里内联表示的是什么呢?

AT&T的汇编格式&X86内联汇编

徘徊边缘 提交于 2020-03-02 04:47:09
AT&T的汇编格式 一 基本语法 语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx,eax ★常数/立即数的格式 AT&T: movl $_value,%ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d ★ 操作数长度标识 AT&T: movw %ax,%bx Intel: mov bx,ax ★寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer + indexpointer*indexscale + imm32) Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题.上式中的地址应为: imm32 + basepointer + indexpointer*indexscale 下面是一些例子: ★直接寻址 AT&T: _booga ; _booga是一个全局的C变量 注意加上$是表示地址引用,不加是表示值引用. 注:对于局部变量,可以通过堆栈指针引用. Intel

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.