《arm汇编语言学习记录.pdf》由会员分享,可在线阅读,更多相关《arm汇编语言学习记录.pdf(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Arm 汇编体系结构的基本编程:(ARM 基本的编程对于语言要求特别高,尤其是编程格式)分为四个点:AREA声明一个段AREA Example,CODE,READONLY;申明代码段Example ENTRY;申明代码入口START MOVE RO,#1/中间为汇编程序代码End/程序的结尾,表明结束四个关键点:环境利用RVDS环境编译程序,是一个集成环境,Code warrior 主要管理代码,产生出可以的镜像文件。及搭建ARM 集成环境的搭建.ARM 工作模式:1,工作状态:32 位工作状态2,thumb 状态:16 位的处理。支持最大的4G的存储存储模式的不同:大端模式及小端模式(重点:
2、面试中经常问到)大端及小端模式的不同:大端格式是数据的高位与地址的高位及地位的存储不同如 0X8070 的高位字节是80,逻辑低位是70;数据也存在存储空间要是将 70 放在低地址的话则为小端模式(逻辑高位放在地址的地位,逻辑地位放在地址的地位)要是相反的话则为大端模式的存储。arm 是 32 为的处理器但是他也可以处理8,16,32 位的数据。(如 89c51,128,K60 等)ARM 模式是指四个字节是指在4 的倍数的地方才可以存储数据,二字节也是一样。工作模式:用户模式;快速中端模式;外部中断模式;管理模式;数据访问终止模式等,每一种模式都有对应的中断标志符。模式之间的切换(主要是指A
3、RM 和 thumb 状态):1,通过程序员认为的控制,2,外部的中断控制等,由于外部中断和异常进行切换的。用户模式外的就是特权模式,除去用户模式和系统模式外就是异常模式。ARM 寄存器的分类主要是31 个通用寄存器,6个程序状态寄存器包括 SPSR 和 CPSR 等。主要是由于工作的状态不一样的话,能够访问的寄存器不同,其中工作模式不同寄存器的访问也不同。不分组寄存器:R0-R7 分组寄存器:R8-R14 其中 R13-R14是指堆栈指针,完成在数据存储,sp 指针完成数据的出栈和入栈功能。R14主要是子程序链接寄存器link,指在函数调用时用于程序的返回保存值。程序计数器:R15(pc)程
4、序状态寄存器:有 CPSR寄存器程序状态寄存器SPSR寄存器主要是终端模式的寄存器,它用于保存程序的异常处理功能。SPSR是指在异常模式下的CPSR和 SPSR一样;其中有四个标志位主要能说明程序的状态和环境。用五个位表示的工作模式;工作状态;中断开关等进行处理。实例:程序编译完成后可以再当前模式之下查看现在寄存器的值:ARM 寻址的方式:他的特点之一,寻址方式比较灵活。寻址方式是指寻找数据所在的物理地址:ARM 支持的寻址方式:(立即数寻址,寄存器寻址,寄存器地址寻址)1,立即数寻址立即数寻址需要加一个“#”(泛指一个立即数,即可进行常量之间的操作),在十六进制的寻址是指“ox”2,寄存器寻
5、址2,寄存器间接寻址它是指对于寄存器的地址进行操作,不直接处理操作数,而是处理操作数的地址3,寄存器寻址(寄存器直接寻址)直接对于寄存器中的数值进行操作;4,基址变址寻址操作不同。尤其注意第三种,5,多寄存器寻址指通过一条指令改变多个寄存器的地址值。6,堆栈寻址堆栈寻址递增堆栈递减堆栈ARM 汇编指令集:arm 支持的汇编指令1,跳转的指令:使用专门的指令和更改PC的值向前或者向后的跳转B 指令B条件 一旦遇见跳转命令,先判断条件在进行跳转。BL跳转指令BL条件 目标地址只不过使用B 指令使用完成后,不会跳转回来,而BL可以。BLX 则指跳转到thumb 状态,与其他两个不同将下一次要返回的值
6、进行保存。2,数据处理指令MOV 指令:指在通用寄存器或者立即数之间进行相互传递数据。MVN 指令CMP 指令:CPSR中存在条件标志位,实现比较完成后的存储。TST指令ADD 命令SUB指令AND 指令Orr 指令ORR指令Bic 指令MUL 指令实例:(指令的编程)ARM 指令集内存中指令的执行,ARM 的基本内存的指令;加载和存储指令主要是用在内存之间的各个操作1,LDR指令利用 R1 中存放的值找到操作数放到R1里面去。MOV 只能操作通用寄存器,要是操作内存单元必须用该指令。2,LDRB指令3,4,LDRH指令LDRB指令STR指令第一种采用基址变址寻址方式。第二个采用也是批量加载及
7、存储结构LDM 指令寄存器类表,进行传递。数据交换内的指令:SWP和 SWPB指令要是想用其他指令替换可以使用STR指令进行替换。移位指令交换和移位指令的演示;ARM 伪指令的编程:就是假指令数据定义的伪指令:和结合程序控制的伪指令:段的属性。混合编程:不到万不得已不会用到汇编,所以汇编主要用于硬件开始时,使用汇编实现;汇编程序主要是指创建函数的中介,在混合编程中:会使用 _asm 伪代码实现加入函数;在 c或者 c+函数的调用在汇编程序中访问c 或者 c+的变量的应用。程序中主要运用IMPORT标识符进行导入到汇编程序,实现两种形式见变量的参数传递。在汇编程序中使用C/C+的函数调用,反过来
8、呢?Over 标识符的使用。定义函数外extern,以及注意函数参数的传递方法。参数传递方法是通过寄存器完成参数的传递的。参数保存在寄存中,参数的传递有数量的限制参 数传递的问题?首先将函数名通过IMPORT将函数导入到寄存器中,完成下一步的调用。ARM 协处理器指令:协处理器是一种芯片,数字处理主要完成的各个处理,协处理器可以做管理缓存。协处理器的访问:专门的指令控制协处理器的处理方法一般在中断部分会用到。伪指令:ARM 指令汇编语言的伪指令伪指令(ADR,ADRL,LDR,NOP,)Arm 汇编语言的程序设计:(.s)汇编语言语言格式:ARM 程序有代码段的区别,有代码段数据段等。堆栈存储
9、的区别及存储方法本程序就是一个简单地加法运算。ARM 数据操作主要有三种形式:简单地寄存器操作;立即数操作;寄存器移位操作。设置条件码N 代表为负。等条件执行判断:子函数调用使用BL调用,指跳转完事能够返回到L寄存器中。多重子程序的调用是用到堆栈操作。跳转表利用程序计数器进行。状态的跳转BX实现。同一状态的函数调用,不同状态的函数调用。实现一些汇编程序的实例。数据块的复制:程序的实现方法。嵌入式 C的程序设计,注意尖括号与引号的区别;混合编程中参数传递的问题:混合编程的两种方式模块连接的约定规则模块连接的参数传递规则c+代码的优化。首先需要建立不同语言的接口。如 asm 操作码操作数 举例as
10、m mov ax,ds;Asm pop ax;asm pop ds;asm ret asm mov ax,ds;asm pop ax;asm pop ds;asm ret;asm push ds/*asm 语句是 C程序中唯一可以用换行结尾的语句*/下面举一个访问C语言的数据的例子:例 7.1:用嵌入汇编方式实现取两数较小值的函数minint min(int var1,int var2)/*用嵌入汇编语句实现的求较小值*/asm mov ax,var1asm cmp ax,var2asm jle minexit asm mov ax,var2minexit:return(_AX);/*将寄存器
11、AX 的内容作为函数的返回值*/main()/*C 语言主程序*/min(100,200);C语言程序中含有嵌入式汇编语言语句时C编译器 首先将 C代码的源程序(.c)编译成汇编语言源文件(.asm)然后激活汇编程序Turbo Assembler将产生的汇编语言源文件编译成目标文件(.obj)最后激活Tlink将目标文件链接成可执行文件(.exe)。/*LT702.C*/#include void upper(char*dest,char*src)asm mov si,src/*dest 和 src是地址指针*/asm mov di,dest asm cld loop:asm lodsb/*C
12、 语言定义的标号*/asm cmp al,aasm jb copy/*转移到 C的标号*/asm cmp al,zasm ja copy/*不是 a到 z之间的字符原样复制*/asm sub al,20h/*小写字母转换成大写*/copy:asm stosb asm and al,al/*C 语言中,字符串用NULL(0)结尾*/asm jnz loopmain()/*主程序*/char str=This Started Out As Lowercase!;char chr100;upper(chr,str);printf(Origin string:n%sn,str);printf(Uppe
13、rcase String:n%sn,chr);要注意模块连接的约定规则命名约定:汇编语言过程应采用C语言类型声明约定寄存器使用约定存储模式约定:采用相同的存储模式参数传递是关键通过堆栈传递入口参数通过寄存器返回出口参数;汇编语言子程序:lt703s.asm.model small,c;小型存储模式.data msg db Hello,C and Assembly!$.code PUBLIC display display proc mov ah,9;小型模式不必设置DS mov dx,offset msg;寄存器 AX和 DX无须保护int 21h ret display endp end;汇
14、编语言子程序:lt703s.asm.model small,c;小型存储模式.datamsg db Hello,C and Assembly!$.codePUBLIC display display procmov ah,9;小型模式不必设置DSmov dx,offset msg;寄存器 AX 和 DX 无须保护int 21hretdisplay endp end汇编中关于 PUSH 和 POP 的问题!PUSH 进栈指令(只以PUSH 为例来询问)在有些书籍上被解释为(以16 位为例):格式:PUSH SRC;执行操作:(SP-1),(SP-2)(SRC)SP-SP-2 在另一些书上解释为:
15、格式:PUSH SRC;执行操作:SP-SP-2(SP+1),SP)(SRC)也就是说:一种解释为数据先进栈后,指针再减2。一种解释为指针减2 后,数据才进栈。请问:这两种解释哪种更确切(正确点),或者说这两种都能说是正确(自己估计这两种说法都不影响操作,)请教大侠们指点,最好详细确切地说明一下,先谢过!回复大致分为三类。一类,先减2(即先调整指针)再压栈。这类最多。很多书书上也这样描述的。大概这样说也是根据书上说的。二类,同时进行。最没意义的回答。整个过程是同时进行,但细分肯定是有先后的,不可能一边调整SP一边数据进栈。三类,和 CPU 有关,也就是说,或者以8088 及以前为分界,或者说以
16、80286 及以前为分界,分别采取上面两种压栈方式。我查了下。前一种方式(数据先压,SP 再调)我也只在很早的书上见到过,后期的著作说的基本都是后一种方式。我个人认为,前一种方式(数据先压,SP 再调)比较合理。汇编语言在Visual C+中的应用格式_ _asm 指令举例int power2(int num,int power)_ _asm mov eax,num mov ecx,power shl eax,cl /返回 EAX=EAX(2CL)#include extern C long isum(int,int*);int imin(int,int*);void main(void)co
17、nst int SIZE=10;int arraySIZE;int temp;cout请输入 10 个整数:endl;for(temp=0;temparraytemp;coutendl;cout整数数据之和:tisum(SIZE,array)endl;cout其中最小值为:timin(SIZE,array)endl;/求 itmp 个元素的数组iarray 的最小数int imin(int itmp,int iarray)_asm mov ecx,itmp jecxz minexit;个数为 0,返回dec ecx mov esi,iarray mov eax,esijecxz minexit
18、;个数为 1,返回minlp:add esi,4cmp eax,esi;比较两个数据的大小jle nochange mov eax,esi;取得较小值nochange:loop minlp minexit:汇编程序设计的方法总结:常用的汇编指令有:MOV(MOVe)传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG)交换指令XLAT(TRANSLATE)换码指令LEA(Load Effective Address)有效地址送寄存器指令LDS(Load DS with pointer)指针送寄存器和DS 指令LES(Load ES with pointer)指针送寄存器和ES 指
19、令LAHF(Load AH with Flags)标志位送 AH 指令SAHF(Store AH into Flgs)AH 送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加 1 指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC(DECrement)减 1 指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned M
20、UL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的 BCD 码加法十进制调整指令DAS 压缩的 BCD 码减法十进制调整指令AAA 非压缩的 BCD 码加法十进制调整指令AAS 非压缩的 BCD 码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑
21、左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left)循环左移指令P58 ROR(Rotate Right)循环右移指令P58 RCL(Rotate Left through Carry)带进位循环左移RCR(Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前CLD(CLear Direction flag)清除方向标志指令STD(SeT Dire
22、ction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE REPZ(REPeat while Equal/Zero)相等为零时重复操作前缀REPNE REPNZ(REPeat while Not Equal/Zero)不相等不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令 P70 LOOPZ LOO
23、PE 为零相等时循环指令LOOPNZ LOOPNE 不为零不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置 0 指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置 1 指令NOP(No OPeretion)无操作指令HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=)等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令JZ OPR/结果为零转移JNZ OPR/结果不为零转移JS OPR/结果为负转移JNS OPR/结果为正转移JO OPR/溢出转移JNO OPR/不溢出转移JP OPR/结果为偶转移JNP OPR/结果为奇转移JC OPR/有进位转移JNC OPR/无进位转移使用一般在 X86 基础上完成的;在基于ARM 的环境