文档视界 最新最全的文档下载
当前位置:文档视界 › ARM汇编之寄存器

ARM汇编之寄存器

ARM汇编之寄存器
ARM汇编之寄存器

在线学习好工作https://www.docsj.com/doc/3f18006580.html,/

ARM汇编之寄存器

ARM A系列寄存器的情况

这是寄存器的总表,下面是CPU的各个模式,上面的纵轴就是寄存器组。

CPU在运行的时候为什么会有寄存器?

想象CPU是一个圈一直在运转,然后寄存器里面有大量的指令,这些指令不知道从哪里来的,但是一般情况下我们的程序在计算我们的程序,我们的程序一般是放在内存里面的,它从内存里面把这些程序读进来之后,在运行,但是如果现在这个程序在运行时异常,那么就要进行CPU状态的切换,除了状态切换之外,当前的一些数据结果需要进行一个保存,但是如果要把这个结果存到内存去,内存并不稳定并且很慢,所以就要想办法能不能找到一个临时空间保存一下,这就是为什么会诞生寄存器。

设置寄存器的原因就是为了更好的去控制和达到效率,ARM体系为了很好的去控制CPU,设定了哪些寄存器?

User纵轴上的十三个寄存器称为通用寄存器,R13是一个比较特殊的寄存器,也叫做SP,就是占指针的寄存器,就是指向某一些占空间,R14是LR,就是连接寄存器,它肯定是去连接某一个地方。R15是PC,这是程序计数器,这是CPU在每一个空间切换的时候的计数器,最下面那个也就是APSR或者CPSR,PSR 就是程序状态寄存器,A代表应用程序状态寄存器,C代表当前程序状态寄存器。

在往下就类似于R17,只不过它叫做SPSR,S就是以保存程序代表寄存器或者我们也可以称为存储状态寄存器,通过这些我们大概把寄存器了解了。

那么这上面分为通用的,那么下面就是特殊寄存器,从横向来看,我们可以看到在USR模式下面,这样寄存器挺全的,但是USR下面没有SPSR,就是没有存储状态的寄存器,然后FIQ快速中断模式下面面是共享R0到R7,意思就是这些模式下的R0到R7它们与USR模式下的R0到R7是共享的,这样如果存储一些数据在R0到R9下面,突然发生异常,切换到另一个模式,那么我们就应该要想办法把这个存取一下,因为另一个模式可能也要往这里面写东西,那么写之前就应该把USR模式下的先保留一下,到时候退出解决后在还原回来,所以我们要一个R0到R7这块寄存器是共享的,同样FIQ后面几个模式的R8到R12也是和USR共享的,只有FIQ是自己独有的,同样的我们在看到PC计数器也是共享的,还有SPSR也是共享的,但是SPSR每个状态都有自己独有的。

APSR应用程序的一个寄存器,它只在USR下面叫做APSR,其他模式下面叫做当前程序存储寄存器。

总结

1,R0-R12是通用寄存器,放通用数据然后每个寄存器都是32位的。

2,各个模式的R0到R12与USR模式是共享的(除了FIQ,R8-R12),PC,CPSR是共享的。

3,USR模式没有SPSR

SP:栈指针,存储栈地址,比如有个CPU,然后还有个外部资源也就是内存,我们想象CPU在程序跳转的时候在运行是最核心的ALU单元,然后外部资源存储着程序A和程序B还有程序C,实际上在CPU在读程序A的时候,可能下面的时候会跳到程序B单元,这个时候它可能不知道地址在哪里,那么这个时候就存储在SP这个寄存器里面,SP这个寄存器表示后面将要执行的程序。

LR:链接寄存器,存储于程序返回地址。这个链接寄存器主要用在函数A

和函数B,A正在运行时,突然要调用B,那么就引了一个分支了,然后这个函数B去运行,运行完之后还是要返回到最初然后继续往下走,那么这个时候返回值应该要有个记录,这就是链接寄存器。

PC:程序计数器

APSR/CPSR:应用程序状态寄存器/当前程序状态寄存器。

SPSR:已存储程序状态寄存器。想象一个程序正在运行,这个程序当前状态正常,这个状态就先把它保存到CPS里面,这个时候突然发生异常,那么当前状态就应该变成异常,就把这个状态存到CPSR上面,但是异常处理完了之后,我们希望还是能够回到之前那个状态,但是这个时候当时的状态已经被清理掉了,这个时候我们就可以用SPSR把原来那个状态保存,这样当状态在发生改变的时候,要还原就可以去SPSR里面读取之前那个状态,这就是它们之间的关系,就类似有一个A的变量,给A这个变量赋了一个值,然后还赋了一个新值,但是又希望原来那个值要保存,所以有个变量B,然后把变量A赋给变量B。

来源:麦子学院

原文链接:https://www.docsj.com/doc/3f18006580.html,/wiki/arm/register/

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

嵌入式-ARM寄存器基本概念.

嵌入式-ARM寄存器基本概念 嵌入式-ARM寄存器基本概念 类别:嵌入式系统 无论是学习哪一种处理器,首先需要明确的就是这种处理器的寄 存器以及工作模式。ARM有37个寄存器,其中31个通用寄存器,6个状 态寄存器。这里尤其要注意区别的是ARM自身寄存器和它的一些外设的寄存器的区别。ARM自身是统一架构的,也就意味着37个寄存器无论在哪 个公司的芯片里面都会出现。但是各家公司会对ARM进行外设的扩展,所以就 出现了好多外设寄存器,一定要与这37个寄存器区别开来!!!1、备份寄存器(R8-R14)对于R8-R12来说,除在快速中断模式下,每个模式对 应相同物理寄存器,所以在FIQ模式下可不必保护和恢复中断现场。对于R13-R14来说,每个寄存器对应6个不同的物理寄存器,其中一个是用户模式 和系统模式共用的。寄存器R13常用做栈指针SP,除用户和系统模式 外,其他模式在使用时的名字构成为R13_。寄存器R14又被称 2、不分组寄存器(R0-R7)不分组也就是说说,在所有的处理器模式下指的都时同一物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理 器模式使用一个名字相同的物理寄存器,就是使用的同一个寄存器,这样可能 造成寄存器中数据被破坏,所以在进行模式切换时必须加以保护。为连接寄存器(LR),除用户和系统模式外,其他模式在使用时的名字构成为 R14_。有下面两种特殊用途:A、每个处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BL或BLX指令调用子程序时, R14被设置成该子程序的返回地址。B、当异常中断发生时,该异常模式 下的R14被设置成保存该模式基于PC的返回地址,对于有些异常模式,R14的值有可能与将返回的地址有个常数的偏移量,不同模式偏移量还有所不同(在ARM 的异常处理里有详细介绍)。3、程序计数器R15 对于用户来说,尽量避免使用STR/STM指令来保存R15的值。当成功向R15写入一个地址 数值时,程序将跳转到该地址执行。在ARM状态下指令总是字对齐的,所以PC的PC[1:0]位恒为零,在想PC写入地址时一定要注意将PC[1:0]设为零。ARM采用的是3级流水线结构,所以PC指向的是当前执行指令的下 两条指令,PC-8为当前指令地址。4、程序状态寄存器CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。同时除了用户和系统模式以外,每中处理器模式下都有一个专用的物理状态寄存器,称为 SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态 寄存器的内容。当在用户模式和系统模式中访问SPSR,将会产生不可预知的结果。CPSR和SPSR的格式相同,如下:0:M0 1:M1 2:M2 3:M3 4:M4 5:T(=1 Thumb执行) 6:F(=1是禁止) 7: I(=1是禁止) 注意:M0~M4并不是所有的组合都定义了有效的处理模式,如 果错误设置,将会引起无法预料的错误。27:Q 在ARM V5的E系列处理器中,CPSR的bit[27]称为q标识位,主要用于指示增强的dsp指令是否发生了

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.docsj.com/doc/3f18006580.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

《ARM嵌入式系统结构与编程》习题答案

1章绪论 1.国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解?答:见教材1.1节。 2.嵌入式系统是从何时产生的,简述其发展历程。答:见教材1.1节。 3.当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。 答:见教材1.2.1节的嵌入式Linux和嵌入式实时操作内核UC /OS-I 。 4.举例说明嵌入式设备在工控设备中的应用。答:见教材1.3节的“工业控制领域”。 5.未来嵌入式技术的发展趋势有哪些?答:见教材1.4节的嵌入式技术的发展趋势。 2章ARM技术与ARM体系结构 1.简述ARM处理器内核调试结构原理。答:对教材1.2节的图2-1进行描述。 2.分析ARM7TDMI-S各字母所代表的含义。答:参考教材 2.1.2 ARM核版本命名规则说明。3.ARM处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,并指出处理器在什么情况下进入相应的模式。 ARM处理器共有7种工作模式: 用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优(fast)中断产生时将会进入这种模式。 IRQ模式:也称为普通中断模式,:当一个低优先级中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在IRQ 模式下进行。 SVC模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。 未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。 系统模式:使用和User模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。 在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又称为异常模式 4.分析程序状态寄存器(PSR)各位的功能描述,并说明C、Z、N、V在什么情况下进行置位和清零。PSR的具体格式为 V—溢出标志位 对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1表示符号位溢出,其他的指令通常不影响V位。 例如:两个正数(最高位为0)相加,运算结果为一个负数(最高位为1),则符号位溢出,相应V=1。

IAR -arm 入门教程

IAR 使用说明 关于文档(初版): 1.主要是为了给IAR的绝对新手作参考用 2.emot制件,由Zigbee & IAR 学习小组保持修订权 3.希望用IAR朋友能将它修订完善 4.任何人可无偿转载、传播本文档,无须申请许可,但请保留文档来源及标志 5.如无重大升级,请沿用主版本号 版本 版本号制作时间制定人/修改人说明 1.00 2008/7/27 emot 初版(仅供新手参考) 1.01 2010/8/19 Emot 增加 下载程序(第四章) 在线调试程序(第五章) 序: 其实IAR和keil区别也没有多大,不过很多人就是怕(当初我也怕)。怕什么呢,怕学会了,真的就是害怕学习的心理让新手觉得IAR是个不好用的或者说“还不会用的”一个工具吧。我也是一个刚毕业的小子,如果说得不妥,还请大家来点砖头,好让小组筑高起来。(Zigbee & IAR 学习小组地址是https://www.docsj.com/doc/3f18006580.html,/673) 初版我将会说明以下3个问题,IAR的安装、第一个IAR工程的建立和工作编译。这是我写的第一个使用说明,不足的以后补充吧。 一、IAR软件安装图解 1.打开IAR软件安装包进入安装界面 打开软件开发包

软件安装界面 2.按照提示步骤执行,一直到授权页面,输入序列号,IAR中有两层序列号,所以要输入两 组序列号。 输入第一组序列号

3.选择安装路径(最好默认,不默认也不影响使用) 路径选择页面

修改路径4.选择全部安装(Full) 选择全部安装5.按提示知道安装完成。

安装完成页面 二、新建第一个IAR工程 用IAR首先要新建的是工作区,而不是工程。在工作区里再建立工程,一个工作区里似乎也不能建多个工程(我试过,但没成功,不知道IAR里提出workspace的概念是为什么?)要不打IAR的help来看,说清楚也是头痛的事,先知道有要在工作空间里建工程就对了。新建IAR工作空间,首先是菜单File里选择Open再选择Workspace,为方便说明再遇到菜 单我就直接说成File-Open-Workspace这样了。看了下面图上的红圈就知道是怎么回事了。 接着就会看到一片空白。这时就是新的“办公区”了。

汇编语言-王爽-完美高清版视频教程

汇编语言》-王爽-完美高清版-零基础汇编语言入门书籍PDF格式 同时按ctrl+要下载的地址既可下载对应的视频 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f61cb107c8 001第一章- 基础知识01 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6806f45b8 002第一章- 基础知识02 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6ec42d4d3 003第一章- 基础知识03 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6deb05ec4 004第一章-基础知识04 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6e51f6838 005第一章- 基础知识05 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f66edaf8d3 006第二章- 寄存器(CPU工作原理)01 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6d07e07b9 007第二章- 寄存器(CPU工作原理)02 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6d7f585a8 008第二章- 寄存器(CPU工作原理)03 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f639d8b3cf 009第二章- 寄存器(CPU工作原理)04 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6dcadbde6 010第二章- 寄存器(CPU工作原理)05 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6ea3f01c1 011第二章- 寄存器(CPU工作原理)06 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f65b96a06f 012第二章- 寄存器(CPU工作原理)07 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f682da085a 013第三章- 寄存器(内存访问)01 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6486e698 014第三章- 寄存器(内存访问)02 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6b7491d9f 015第三章- 寄存器(内存访问)03 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f622b7f9a7 016第三章- 寄存器(内存访问)04 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f64e2424b9 017第三章- 寄存器(内存访问)05 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6e5132d4d 018第三章- 寄存器(内存访问)06 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f655c10e86 019第三章- 寄存器(内存访问)07 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6b22e64e6 020第四章- 第一个程序01 下载地址:https://www.docsj.com/doc/3f18006580.html,/file/f6812126a4

ARM体系的7种工作模式

ARM体系的7种工作模式 一、ARM体系的CPU有以下7种工作模式: 1、用户模式(usr):正常的程序执行状态 2、快速中断模式(fiq): 3、中断模式(irq): 4、管理模式(svc):操作系统使用的保护模式 5、系统模式(sys):运行具有特权的操作系统任务 6、数据访问终止模式(abt):数据或指令预取终止时进入该模式 7、未定义指令终止模式(und):未定义的指令执行时进入该模式 注解: 可以通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式;除用户模式外,其余6种工作模式都属于特权模式; 特权模式中除了系统模式以外的其余5种模式称为异常模式; 大多数程序运行于用户模式; 进入特权模式是为了处理中断、异常、或者访问被保护的系统资源; 二、ARM体系的CPU有两种工作状态 1、ARM 2、THumb CPU上电处于ARM状态 三、寄存器 ARM有31个通用的32位寄存器,6个程序状态寄存器,共分为7组,有些寄存器是所有工作模式共用的,还有一些寄存器专属于每一种工作模式; R13——栈指针寄存器,用于保存堆栈指针; R14——程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15的备份,而当发生中断或异常时,R14保存R15的返回值;

R15——程序计数器; 快速中断模式有7个备份寄存器R8—R14,这使得进入快速中断模式执行很大部分程序时,甚至不需要保存任何寄存器; 其它特权模式都含有两个独立的寄存器副本R13、R14,这样可以令每个模式都拥有自己的堆栈指针和连接寄存器; 四、当前程序状态寄存器(CPSR) CPSR中各位意义如下: T位:1——CPU处于Thumb状态,0——CPU处于ARM状态; I、F(中断禁止位):1——禁止中断,0——中断使能; 工作模式位:可以改变这些位,进行模式切换; 五、程序状态保存寄存器(SPSR) 当切换进入某一个特权模式时,SPSR保存前一个工作模式的CPSR值,这样,当返回前一个工作模式时,可以将SPSR的值恢复到CPSR中; 六、模式切换

Windows X86-64位汇编语言入门

Windows X86-64位汇编语言入门 Windows X64汇编入门(1) 最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。 文章的标题包含了本文的四方面主要内容: (1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista 64位版,调用的均为windows API。 (2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。至于三者间的区别,可自行搜索。 (3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。 (4)入门:既是入门,便不会很全。其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。其二,便于类似我这样刚接触x64汇编的新手入门。 本文所有代码的调试环境:Windows Vista x64,Intel Core 2 Duo。 1. 建立开发环境 1.1 编译器的选择 对应于不同的x64汇编工具,开发环境也有所不同。最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio 2005一起发布。因此,如果你是微软的忠实fans,直接安装VS2005既可。运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC 资源编译器,且自带了Include目录。它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。因此,本文的代码就在GoASM下编译。 第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。 不同的编译器,语法会有一定差别,这在下面再说。 1.2 IDE的选择 搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。因此,最简单的方法是自行修改EditPlus的masm语法文件,这也是我采用的方法,至少可以得到语法高亮。当然,如果你懒得动手,那就用notepad吧。 没有IDE,每次编译时都要手动输入不少参数和选项,做个批处理就行了。 1.3 硬件与操作系统 硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

《ARM嵌入式系统结构与编程》第二章课后答案

第2章ARM技术与ARM体系结构 1.简述ARM处理器内核调试结构原理 答:ARM处理器一般都带有嵌入式追踪宏单元ETM(Embedded Trace Macro),它是ARM 公司自己推出的调试工具。ARM处理器都支持基于JTAG(Joint Test Action Group 联合测试行动小组)的调试方法。它利用芯片内部的Embedded ICE来控制ARM内核操作,可完成单步调试和断点调试等操作。当CPU处理单步执行完毕或到达断点处时,就可以在宿主机端查看处理器现场数据,但是它不能在CPU运行过程中对实时数据进行仿真。 ETM解决了上述问题,能够在CPU运行过程中实时扫描处理器的现场信息,并数据送往TAP(Test Access Port)控制器。上图中分为三条扫描链(图中的粗实线),分别用来监视ARM核,ETM,嵌入式ICE的状态。 1.分析ARM7TDMI-S各字母所代表的含义。 答:ARM7 T D M I – S 中 ARM是Advanced RISC Machines的缩写 7是系列号; T:支持高密度16位的Thumb指令集; D:支持JTAG片上调试; M:支持用于长乘法操作(64位结果)ARM指令,包含快速乘法器;; I:带有嵌入式追踪宏单元ETM,用来设置断点和观察点的调试硬件; S:可综合版本,意味着处理器内核是以源代码形式提供的。这种源代码形式又可以编译成一种易于EDA工具使用的形式。 2.ARM处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,并指出处 理器在什么情况下进入相应的模式。 答:ARM技术的设计者将ARM处理器在应用中可能产生的状态进行了分类,并针对同一类型的异常状态设定了一个固定的入口点,当异常产生时,程序会自动跳转到对应异常入口处进行异常服务。 ?1.用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下 执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器不会自动切换工作模式 ?2.FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优先

ARM七种运行模式

s3c2440中断体系结构: 如何用中断? 1.中断发生:保存别人的状态 如何中断可以事先设置,对程序初始化,使能中断。 中断发生后,进入中断模式 2.中断处理 分辨中断源 进行不同的处理 清理工作 3.恢复别人的状态 过程:外界信号上升沿、下降沿,高电平、低电平都可以设置成信号引脚设置,再进入状态寄存器。 状态寄存器连接屏蔽寄存器 进入第二个状态寄存器,储存各种中断,可以储存多个中断 进入优先级寄存器,判断中断运行顺序 再进入屏蔽使能寄存器和模式寄存器 进入优先级寄存器 进入cpu处理 cpu的处理:进入入口地址 b handleIRQ 计算返回地址,被中断处地址 保存现场,即各寄存器状态 调用处理函数 函数运行完后恢复现场 函数的处理:分辨终端 处理中断 清除数据,即清除中断 1.中断寄存器 arm的七种模式 https://www.docsj.com/doc/3f18006580.html,r 用户模式r0-r15 2.fiq 快中断模式r0-r7 专用寄存器r8-r15, 3.svc 管理模式 专用寄存器r13-r14, 4.abt 数据访问终止模式 5.sys 系统模式 6.und 未定义指令终止模式 7.irq 中断模式 几种模式的区别:

嵌入式的中断: a.不同的寄存器 b.不同的权限 c.触发条件不一样 何时使用几种模式: usr 用户模式:arm处理器正常的程序执行状态 fiq 快中断模式:高速数据传输和通道处理 svc 管理模式:操作系统使用的保护模式 abt 数据访问终止模式:数据或者指令终止时进入,用于虚拟存储或者存储保护 sys 系统模式:运行具有特权的操作系统任务 und 未定义指令终止模式:未定义的指令执行时进入该模式,用于支持硬件处理器的软件仿真. irq 中断模式:用于通用的中断处理 后六种是特权模式,用于处理中断、异常和特殊权限处理 用户模式是最常见的模式 2.中断中的异常 中断是一种异常。 当发生中断时,cpu进入中断模式 cpu进入异常入口,异常入口是硬件规定的一个地址 运行模式 ARM920T 支持7 种运行模式: ●用户(usr)):正常ARM 程序执行状态 ●快中断(fiq)):为支持数据传输或通道处理设计 ●中断(irq)):用于一般用途的中断处理 ●管理(svc)):操作系统保护模式 ●中止(abt ): 数据或指令预取中止后进入 ●系统(sys)):操作系统的特权用户模式 ●未定义(und)):执行了一个未定义指令时进入 模式的改变可由软件控制,或者由外部中断或进入异常引起。大部分应用程序都将在用户模式执行。 被称为特权模式的非用户模式,都将进入到中断服务或异常中去,或者访问受保护的资源。内部寄存器 ARM920T 总共有37 个寄存器,其中31 通用32 位寄存器和6 个状态寄存器,但不能在同一时刻对所有的寄存器可见。处理器状态和运行模式决定了哪些寄存器对程序员可见。 ARM状态时内部寄存器集在ARM 状态,16 个通用寄存器和一个状态寄存器在任意时刻都可见。 在特权(非用户)模式下,将切换到指定模式的分组(banked)寄存器。图2-3 显示了哪些寄存器在各模式下是可见的:

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

ARM寄存器详解

ARM 处理器有二十七个寄存器,其中一些是在一定条件下使用的,所以一次只能使用十六 个。 R0~R7:是通用寄存器并可以用做任何目的。 R8~R12:是通用寄存器,但是在切换到FIQ模式的时候,使用它们的影子(shadow)寄存器。 R13:被称为栈指针寄存器,常用来保存栈指针。 R14:链接寄存器,常用来保存函数返回地址 R15:是程序指针PC CPSR:(Current Program Status Register)当前程序状态寄存器,CPSR 寄存期保存当前程序运行的状态。 0 0 0 0 0 User26 模式 0 0 0 0 1 FIQ26 模式 0 0 0 1 0 IRQ26 模式 0 0 0 1 1 SVC26 模式 1 0 0 0 0 User 模式 1 0 0 0 1 FIQ 模式 1 0 0 1 0 IRQ 模式 1 0 0 1 1 SVC 模式 1 0 1 1 1 ABT 模式 1 1 0 1 1 UND 模式

ARM寻址方式 1.立即数寻址 ARM 指令的立即数寻址是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数。ADD R0,R0,#1 ;R0←R0 + 1 ADD R0,R0,#0x3A ;R0←R0 + 0x3A 在以上 2 条指令中,第2个源操作数即为立即数,实际使用时以“#”符

号为前缀。 2.寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采 用的一种方式,也是一种执行效率较高的寻址方式。如以下的指令。 ADD R0,R1,R2 ;R0←R1 + R2 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。 3.寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器 中。例如以下指令。 ADD R0,R1,[R2] ;R0←R1 + [R2] LDR R0,[R1] ;R0←[R1] 在第1 条指令中,以寄存器R2 的内容作为操作数的地址,然后与R1相加,其结果存入 寄存器R0中。 第2条指令将以 R1 的值为地址的存储器中的内容送到寄存器R0中。 4.基址变址寻址 基址变址的寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给 出的地址偏移量相加,从而得到一个操作数的有效地址。如下面的几条指令所示。 LDR R0,[R1,#0x0A] ;R0←[R1 + 0x0A] LDR R0,[R1,#0x0A]!;R0←[R1 + 0x0A]、R1←R1 + 0x0A 在第1条指令中,将寄存器R1 的内容加上0x3A 形成操作数的有效地址,将该地址处的 操作数送到寄存器R0中。 在第2条指令中,将寄存器R1的内容加上0x0A形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增0x0A个字节。 5.多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用 一条指令完成传送最多 16 个通用寄存器的值。比如下面的指令。LDMIA R0,{R1,R2,R3,R4} ;R1←[R0] ;R2←[R0 + 4]

相关文档
相关文档 最新文档