




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
开发平台01请在插入菜单—页眉和页脚中修改此文本2编程语言从处理器的角度来看一条指令只是一个操作多条指令构成程序完成一个功能操作从程序执行角度来看处理器读取指令后译码执行,完成所有操作从程序设计的角度来看如何用指令来描述所要实现的功能如何组织这些指令如何将指令和数据放置到规定的存储位置如何让文字的文本变成可以执行的二进制数请在插入菜单—页眉和页脚中修改此文本3编程语言机器语言二进制语言处理器能直接执行的唯一语言按照指令的执行顺序将相应的二进制数值排列写入存储空间后就可以执行,但不便编程汇编语言采用助记符来表示指令汇编指令和机器指令一一对应的采用一些助记符来规范指令的排列和数据的存放指令和规范一起构成了汇编语言可视为机器语言的文字描述形式,方便程序的设计。高级语言面向处理的,采用规范的数据定义、操作语句和程序结构程序更接近处理思路,更易读易懂可以应用于更多的处理器程序通过编译器可以生成汇编程序。程序汇编语言高级语言视角存储器与指令数据结构与算法数据定义直观,易观察抽象,但易用运算处理直接,效率高,但描述复杂直接,描述简洁,但效率稍低流程结构跳转主导,不易描述且难懂格式化,描述简单且易读应用场合面向处理系统启动和高速处理面向数据处理和业务应用C语言请在插入菜单—页眉和页脚中修改此文本4程序要素程序由数据、运算和流程三者结合构建而成流程是算法的体现,决定如何执行运算操作控制器控制流程运算是数据的加工,决定如何处理数据ALU加工数据数据是信息的表现和处理的对象,决定如何存储和访问寄存器和存储器存储数据程序有四个基本要素数据定义处理语句流程控制组织结构请在插入菜单—页眉和页脚中修改此文本5程序要素数据定义实质是完成存储分配确定数据的类型、数量、存储介质、位置采用变量来定义数据高级语言的变量可以保存寄存器,也可以保存在存储器汇编语言中的变量都是定义在存储器的处理语句实质是实现数据加工高级语言的运算语句是面向变量的一条运算语句所对应的汇编可能需要多条语句涉及到多次的寄存器与存储器之间的数据交互操作汇编语言的运算语句是面向ALU的一条语句就是一次操作,涉及一次寄存器和存储器的交互操作请在插入菜单—页眉和页脚中修改此文本6程序要素流程控制实质是构建某一功能的处理操作流根据数据加工的结果来调整所要执行的操作处理流程采用三种常用结构顺序结构、分支结构、循环结构。高级语言有专用的结构构建语句,涉及比较运算和跳转操作汇编语言中只能用多个跳转语句来实现组织结构实质是将多个功能处理流程有机组合完成一个复杂的功能组织形式是采用函数或子过程来构建功能模块,通过功能模块互联实现程序的功能高级语言采用专用的函数或子过程语法来构建,自动完成堆栈操作和参数传递等工作汇编语言则通过标号定义和堆栈操作来实现请在插入菜单—页眉和页脚中修改此文本7编程语言对照Thumb-2汇编语言与C语言功能汇编语句C语句数据定义DCB,DCW,DCD,DCQ,SPACEchar,short,long,longlong,int,[],struct处理语句ADD,SUB,MUL,DIV,AND,ORR,EOR,BIC,CMP,LSL,ASR,LSR,MLA,MLS,CMP,TST+,-,*,/,&.|,~,^,>>,<<,++,--,>,<,>=,<=,==,!=,&&,||,!流程控制B,BX,CBZ,CBNZif-else,switch-case,while,do-while,for,continue,break,goto组织结构PROC,ENDP,BLintfunc(),return,func()请在插入菜单—页眉和页脚中修改此文本8汇编程序结构分区采用AREA对代码和数据分别分区,并指明存储类型必须包括两个区保存异常向量表的只读数据区AREARESET,DATA,READONLY;区名为RESET,用于异常向量表,保存在ROM中。包含启动程序的只读代码区AREA|.text|,CODE,READONLY;区名为系统默认名,保存在ROM中自行添加可读写数据区AREAmydata,DATA,READWRITE;区名为mydata,保存在RAM中自行添加只读代码区AREAmycode,CODE,READONLY;区名为mycode,保存在ROM中每个区的首个指令或数据通常都要有标识标识被外部使用,要用EXPORT语句再声明一次请在插入菜单—页眉和页脚中修改此文本9汇编程序结构异常向量表在只读存储区中分配的数据重启时映射在地址0x00000000其中第1个字保存主栈指针MSP值值人为指定或通过语句来自动分配第2个字保存重启异常处理向量标识Reset_Handler的值异常向量表首地址标识为__Vectors,需再用EXPORT语句声明栈用户存放程序临时创建的局部数据启动时自动分配一定空间的主堆栈堆运行中被动态分配的存储段,大小并不固定,可动态扩张或缩减。根据需求分配AREARESET,DATA,READONLY;EXPORT__Vectors__Vectors;第一个字为MSP初值;第二个字为Reset_Handler的值⁝;第n个字为异常类型n-1的异常服务函数的值⁝请在插入菜单—页眉和页脚中修改此文本10重启服务重启异常服务初始化时钟初始化存储器初始化数据数据初始化只读区(RO区)分配异常向量表、程序代码和只读数据可初始化的读写区(RW区)分配需初始化的数据不初始化的读写区(ZI区)分配不需要初始化的数据AREA|.text|,DATA,READONLYENTRYReset_Handler PROCEXPORT Reset_Handler [WEAK]⁝ENDPRW区数据的初值:既要保存在ROM中,保证数据不丢失又要保存在RAM中,供处理器使用加电后要用指令将它们从ROM中读出并写到相应的RAM中请在插入菜单—页眉和页脚中修改此文本11重启服务数据初始化加载视图RO区和RW区均在ROM中保存供加电启动时使用执行视图RO区在ROM中保存RW区和ZI区在RAM中保存供执行时使用①源地址为Image$$RO$$Limit,目的地址为Image$$RW$$Base;②判定目的地址与Image$$ZI$$Base的大小关系③小时,从源地址取一字写到目的地址,两地址皆增4再复制下一字,再执行②;④判定目的地址与Imag$$ZI$$Limit的大小关系;⑤小时,向目标地址写0,地址增4,再执行④。请在插入菜单—页眉和页脚中修改此文本12集成环境KeiluVision先建立一个空项目testcm4“Device”选择”ARM”-“ARMCortexM4”-“ARMCM4”ROM开始于地址0x00000000,空间大小为0x40000RAM开始于地址0x20000000,空间大小为0x20000空项目中新建或添加源文件startup.s系统初始化和测试汇编程序test.c编制C语言程序请在插入菜单—页眉和页脚中修改此文本13集成环境Keil配置请在插入菜单—页眉和页脚中修改此文本14启动文件三个基本步骤:可读写数据区定义堆栈只读数据区定义异常向量表代码区给出重启异常服务函数以及数据初始化函数先进行基本设备初始化,再进行变量初始化最后跳转用户主程序AREASTACK,DATA,READWRITE,ALIGN=3SPACE 1024__initial_sp;栈底,也是栈顶的初始地址AREARESET,DATA,READONLYEXPORT__Vectors__VectorsDCD__initial_sp;MSP的初值DCDReset_
AREA|.text|,CODE,READONLYENTRYReset_HandlerPROC;重启异常处理程序EXPORTReset_Handler[WEAK]BLData_Init;数据初始化IMPORTmain;用户主函数main()的地址LDRR0,=mainBXR0;执行main函数ENDPIMPORT|Image$$RO$$Limit|IMPORT|Image$$RW$$Base|IMPORT|Image$$ZI$$Base|IMPORT|Image$$ZI$$Limit|Data_Init PROC;RW区装载与ZI区清零LDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR2,=|Image$$ZI$$Base|;RW区复制LOOPRWCMPR1,R2LDRCCR3,[R0],#4STRCCR3,[R1],#4BCCLOOPRW;ZI区执行清0操作。LDRR2,=|Image$$ZI$$Limit|LDRR0,=0LOOPZICMPR1,R2STRCCR0,[R1],#4BCCLOOPZI;数据初始化完成BXLRENDPEND数据定义02请在插入菜单—页眉和页脚中修改此文本16数据定义常量表示具体数值的字符串标号op1MOVR0,R1采用EQU定义constEQU值;#defineconst值变量一个存储空间标号-变量名-存储单元地址字节空间xSPACEm
;charx[m]; unsignedcharx[m];双字变量aDCQ0 ;longlonga; unsignedlonglonga;字变量bDCD0 ;longa; unsignedlonga;半字变量cDCW0 ;shorta; unsignedshorta;字节变量dDCB0 ;chara; unsignedchara;字变量(地址)eDCDb ;int*e=&b; unsignedint*e=&b;双字和字变量从4的倍数地址开始分配半字变量从偶数地址开始分配字节变量可以任何地址开始分配请在插入菜单—页眉和页脚中修改此文本17数据定义变量汇编语言变量是存储空间[a]变量名a是该存储空间的首地址C语言变量名a代表存储空间&a表示存储空间的首地址*a表示以a值为地址的存储空间变量赋值操作变量名作为地址常量,保存在寄存器作为基地址功能汇编语句C语句对64位变量赋值0x123456789ABCDEF0LDRR0,=0x9ABCDEF0LDRR1,=0x12345678LDRR2,=aSTRDR0,R1,[R2]a=0x123456789ABCDEF0;对32位变量赋值0x11223344LDRR1,=0x11223344LDRR2,=bSTRR1,[R2]b=0x11223344;对16位变量赋值0x5678LDRR1,=0x5678LDRR2,=cSTRHR1,[R2]c=0x5678;对8位变量赋值0x78LDRR1,=0x78LDRR2,=dSTRBR1,[R2]d=0x78;请在插入菜单—页眉和页脚中修改此文本18数据定义变量赋值功能汇编语句C语句将变量b的值赋给变量aLDRR2,=bLDRR0,[R2]LDRR2,=aSTRR0,[R2]a=b;将变量a的地址值赋给变量bLDRR1,=aLDRR2,=bSTRR1,[R2]b=(long)&a;将变量c的高字节赋给变量dLDRR2,=cLDRBR1,[R2,#1]LDRR0,=dSTRR1,[R0]d=*((char*)&c+1);请在插入菜单—页眉和页脚中修改此文本19数据定义加载和存储指令只关心存储空间的地址变量是为方便程序设计而设的汇编语言中赋值操作可跨越变量定义的约束aDCB0;chara;bDCB0;charb;cDCB0;charc;dDCB0;chard;功能汇编语句C语句[a]
0x12LDRR1,=0x12LDRR0,=aSTRBR1,[R0]a=0x12;[b]
0x34LDRR1,=0x34LDRR0,=bSTRBR1,[R0]b=0x34;[c]
0x56LDRR1,=0x56LDRR0,=cSTRBR1,[R0]b=0x56;[d]
0x78LDRR1,=0x78LDRR0,=dSTRBR1,[R0]b=0x78;功能汇编语句C语句[a]
0x78563412LDRR1,=0x78563412LDRR0,=aSTRR1,[R0]*(long*)&a=0x78563412;基于变量定义,逐个变量操作从存储器角度看,向四个字节存储单元写四个数,也可以是向一个字存储单元写一个数请在插入菜单—页眉和页脚中修改此文本20数组变量多个相同类型的变量顺序排列构成数组变量数组变量名为数组变量的首地址C语言采用“[]”来定义数组变量变量名也是数组变量的首地址赋值采用基址+偏移量寻址方式汇编语言基址取变量名偏移量以字节为单位,其值=序号×类型尺寸字节、半字、字和双字的类型尺寸分别为1、2、4、8C语言其偏移量只是相差的同类型变量的个数功能汇编语句C语句字节数组cDCB0,0,0unsignedcharc[]={0,0,0};半字数组bDCW0,0,0,0,0unsignedshortb[]={0,0,0,0,0};字数组aDCDc,b,a,0longa[]={(long)c,(long)b,(long)a,0};请在插入菜单—页眉和页脚中修改此文本21数组变量数组赋值功能汇编语句C语句字数组a的第3个变量赋值0x12345678LDRR0,=0x12345678LDRR1,=aSTRR0,[R1,#2*4]a[2]=0x12345678;或*(a+2)=0x12345678;半字数组b的第5个变量赋值0x1234LDRR0,=0x1234LDRR1,=bSTRHR0,[R1,#4*2]b[4]=0x1234;或*(b+4)=0x1234;字节数组c的第1个变量赋值0x12LDRR0,=0x12LDRR1,=cSTRBR0,[R1,#0]c[0]=0x12;或*c=0x12;功能汇编语句C语句1个字aDCD0x12345678longa=0x12345678;1个含2半字的数组aDCW0x5678,0x1234shorta[]={0x5678,0x1234};1个含4字节的数组aDCB0x78,0x56,0x34,0x12chara[]={0x78,0x56,0x34,0x12};1个半字和1个含2字节的数组aDCW0x5678bDCB0x34,0x12shorta=0x5678;charb[]={0x34,0x12};1个含2字节的数组和1个半字aDCB0x78,0x56bDCW0x1234chara[]={0x78,0x56};shortb=0x1234;采用不同的定义方式来实现请在插入菜单—页眉和页脚中修改此文本22指针变量在C语言中,定义指针变量来保存变量的地址指针对应着汇编语言中的地址对某类型<type>的指针变量p赋值时p=&a;对于该类型的数组变量x,数组变量名本身就是地址(指针常量)p=x;对于指定地址值N的存储空间,可以直接赋立即数p=(<type>*)N;在汇编语言中,指针变量就是一个普通的字型变量只是这个字型存储单元用来保存其它变量的地址功能C语言汇编语言定义指针变量shortx[4];short*p;xSPACE4*2pDCD0指针变量赋值p=x;LDRR0,=xLDRR1,=pSTRR0,[R1]指针变量对应的存储空间赋值*p=2LDRR0,=2LDRR1,=pLDRR1,[R1]STRHR0,[R1]对指针变量指向的存储空间赋值后指针变量自增*p++=2;LDRR0,=2LDRR1,=pLDRR2,[R1]STRHR0,[R2],#2STRR2,[R1]指针变量自增后再对其指向的存储空间赋值*++p=2;LDRR0,=2LDRR1,=pLDRR2,[R1]STRHR0,[R2,#2]!STRR2,[R1]请在插入菜单—页眉和页脚中修改此文本23结构体变量多个不同类型的变量顺序排列构成结构体变量结构体变量名为结构体变量的首地址C语言采用“struct{}”来定义结构体类型以及变量以变量名为基地址,联合结构体内变量名的偏移量进行寻址结构体内每个变量的偏移量为其地址与变量名的差值功能汇编语句C语句1个变量内含1个字、1个半字和1个字节aDCD0DCW0DCB0struct{unsignedlongx;unsignedshorty;unsignedcharz;}a;功能汇编语句C语句将0x12345678、0x9ABC和0xDE分别保存在变量a中LDRR1,=aLDRR0,=0x12345678STRR0,[R1,#X]LDRR0,=0x9ABCSTRHR0,[R1,#Y]LDRR0,=0xDESTRBR0,[R1,#Z]a.x=0x12345678;a.y=0x9ABC;a.z=0xDE;XEQU0YEQU4ZEQU6请在插入菜单—页眉和页脚中修改此文本24变量共用变量的实质是存储空间无论何种类型的变量,都是一定大小的存储空间类型定义,只是对存储空间进行了一种应用划分对于某固定的存储空间可以采用不同的类型来定义相当于同一物理体可有多个不同的描述方式所保存的数据可以使用不同的访问方式功能汇编语句C语句1个字aDCD0longa;2个半字aDCW0DCW0struct{shortx;shorty;}a;1个含2半字的数组aDCW0,0shorta[2];4个字节aDCB0DCB0DCB0DCB0struct{charx;chary;charz;charw;}a;1个含4字节的数组aDCB0,0,0,0chara[4];1个半字和1个含2字节的数组aDCW0DCB0,0struct{shortx;chary[2];}a;1个半字和2个字节aDCW0
DCB0
DCB0struct{shortx;chary;charz;}a;1个含2字节的数组和1个半字aDCB0,0DCW0struct{charx[2];shorty;}a2个字节和1个半字aDCB0
DCB0
DCW0struct{charx;chary;shortz;}a;数据处理03请在插入菜单—页眉和页脚中修改此文本26符号扩展加载有符号数和无符号数加载时有符号数要扩展符号位采用LDRSB和LDRSH指令寄存器数据扩展SXTB、SXTHUXTB、UXTH数据定义DCB0xFFDCW0xFFFFDCD0xFFFFFFFF无符号数值255655354294967295寄存器0x000000FF0x0000FFFF0xFFFFFFFF有符号数值-1-1-1寄存器0xFFFFFFFF0xFFFFFFFF0xFFFFFFFF功能
汇编语句C语句汇编语句C语句无符号数有符号数变量定义xDCB0xF0unsignedcharx=0xF0;xDCB0xF0charx=0xF0;yDCW0x1000unsignedshorty=0x1000;yDCW0x1000shorty=0x1000;zDCD0unsignedlongz=0;zDCD0longz=0;变量读取LDRR0,=xLDRBR0,[R0]LDRR1,=yLDRHR1,[R1]LDRR2,=zLDRR2,[R2]
LDRR0,=xLDRSBR0,[R0]LDRR1,=yLDRSHR1,[R1]LDRR2,=zLDRR2,[R2]
变量保存LDRR0,#NLDRR1,=zSTRR0,[R1]z=N;LDRR0,#NLDRR1,=zSTRR0,[R1]z=N请在插入菜单—页眉和页脚中修改此文本27数据运算算术运算、移位运算、位逻辑运算一条汇编指令功能C语言汇编语言功能C语言汇编语言
算术运算
加z=x+yADDR2,R0,R1减z=x-ySUBR2,R0,R1
乘z=x*yMULR2,R0,R1除z=x/yU/SDIVR2,R0,R1
乘累加z=z+x*yMLAR2,R2,R0,R1乘累减z=z-x*yMLSR2,R2,R0,R1
移位运算
左移z=x<<yLSLR2,R0,R1右移z=x>>yL/ASRR2,R0,R1
位逻辑运算
与z=x&yANDR2,R0,R1或z=x|yORRR2,R0,R1
非z=~xMVNR2,R0异或z=x^yEORR2,R0,R1
请在插入菜单—页眉和页脚中修改此文本28数据运算关系运算两个量值之间的大小关系关系成立时运算结果为逻辑“真”非零值来代表“真”不成立时运算结果为逻辑“假”零值来代表“假”逻辑运算对逻辑量进行与、或、非运算逻辑与和逻辑或采用位逻辑来计算逻辑非采用条件指令来实现功能C语言汇编语言功能C语言汇编语言关系运算大于z=x>yCMPR0,R1MOVLSR2,#0MOVHIR2,#1小于小于z=x<yz=x<yCMPR0,R1MOVHSR2,#0MOVLOR2,#1CMPR0,R1MOVLER2,#0MOVGTR2,#1CMPR0,R1MOVGER2,#0MOVLTR2,#1不小于z=x>=yCMPR0,R1MOVHSR2,#1MOVLOR2,#0不大于不大于z=x<=yz=x<=yCMPR0,R1MOVLSR2,#1MOVHIR2,#0CMPR0,R1MOVGER2,#1MOVLTR2,#0CMPR0,R1MOVLER2,#1MOVGTR2,#0等于z=x==yCMPR0,R1MOVEQR2,#1MOVNER2,#0不等于不等于z=x!=yz=x!=yCMPR0,R1MOVEQR2,#0MOVNER2,#1逻辑运算逻辑与z=x&&yANDR2,R0,R1逻辑非逻辑非z=!xz=!xCMPR0,#0MOVNER2,#0MOVEQR2,#1逻辑或z=x||yORRR2,R0,R1请在插入菜单—页眉和页脚中修改此文本29运算数据存储大量临时数据需要临时保存在存储器采用分配的变量保存时,存取数据均需取地址和读写数据两条指令完成采用堆栈保存,不需要取地址而只需要读写数据一条指令存储空间可以反复被利用功能使用寄存器使用堆栈a*b+a*c+a*d+b*c+b*d+c*dMULR4,R0,R1;a*bMULR5,R0,R2;a*cADDR4,R4,R5MULR5,R0,R3;a*dADDR0,R4,R5MULR4,R1,R2;b*cADDR0,R0,R4MULR4,R1,R3;b*dADDR0,R0,R4MULR4,R2,R3;c*dADDR0,R0,R4PUSH{R2,R3}MULR2,R0,R2;a*cMULR3,R0,R3;a*dMULR0,R0,R1;a*bADDR2,R2,R3ADDR0,R0,R2POP{R2,R3}PUSH{R0}MULR0,R1,R2;b*cMULR1,R1,R3;b*dMULR2,R2,R3;c*dPOP{R3}ADDR0,R0,R1ADDR0,R0,R2ADDR0,R0,R3a-d分别保存在R0-R3中共用6个寄存器R0-R5只用R0-R3流程结构04请在插入菜单—页眉和页脚中修改此文本31分支结构四种结构单分支结构、双分支结构、多分支结构、开关结构请在插入菜单—页眉和页脚中修改此文本32单分支结构若-则结构由一个关系和一个分支体构成只有关系为真时才执行支体的语句if(<cond>){//关系为真时要执行的语句}处理流程图C语言汇编语言if(x>y){z=z+1;}CMPR0,R1BLEop0LDRR3,[R2]ADDR3,#1STRR3,[R2]op0CMPR0,R1ADDGER3,R3,#1STRGER3,[R2]变量x和y值分别保存在R0和R1中变量z的地址保存在R2中请在插入菜单—页眉和页脚中修改此文本33分支结构双分支结构若-则-否则结构由一个关系和两个分支体构成若关系为真,则执行支体1的语句,否则执行支体2的语句if(<cond>){//关系为真时要执行的语句}else{//关系为假时要执行的语句}处理流程图C语言汇编语言if(x>y){z=z+1;}else{z=z-1;}CMPR0,R1BLEop0LDRR3,[R2]ADDR3,#1STRR3,[R2]Bop1op0LDRR3,[R2]SUBR3,#1STRR3,[R2]op1LDRR3,[R2]CMPR0,R1ADDGTR3,#1SUBLER3,#1STRR3,[R2]请在插入菜单—页眉和页脚中修改此文本34分支结构多分支结构若-则-否则若-则-…结构,多个关系和多个分支体若关系1为真,则执行支体1的语句,否则,若关系2为真,则执行支体2的语句,否则……if(<cond1>){//关系1为真时要执行的语句}elseif(<cond2>){//关系1为假但关系2为真时要执行的语句}elseif(<cond3>)⁝else{//所有关系都为假时要执行的语句}处理流程C语言汇编语言if(x==0){y=1;z=1;}elseif(x<=2){y=2;z=3;}else{z=4;}CMPR0,#0BNEop0LDRR3,=1STRR3,[R1]STRR3,[R2]Bop_endOp0CMPR0,#2BGTop1LDRR3,=2STRR3,[R1]LDRR3,=3STRR3,[R2]Bop_endOp1LDRR3,=4STRR3,[R2]op_end请在插入菜单—页眉和页脚中修改此文本35分支结构开关结构针对某一变量或变量的表达式的值来选择相应的分支体相当于若变量或变量表达式的值为某值时,则执行相应的分支体分支是基本数值的,可以采用查表跳转指令switch(<expr>){case<val_0>:⁝//值为val_0时要执行的语句case<val_1>:⁝//值为val_1时要执行的语句case<val_N>:⁝//值为val_N时要执行的语句default:⁝//其它值时要执行的语句}请在插入菜单—页眉和页脚中修改此文本36分支结构开关结构处理流程C语言汇编语言switch(x){case0:
y=1;
break;case1:case2:y=2;break;default:y=0;}CMPR0,#2MOVHIR0,#3TBB[PC,R0]b_tblDCB((b_0-b_tbl)/2)DCB((b_1_2-b_tbl)/2)DCB((b_1_2-b_tbl)/2)DCB((b_3-b_tbl)/2)b_0LDRR2,=1STRR2,[R1]Bb_endb_1_2LDRR2,=2STRR2,[R1]Bb_endb_3LDRR2,=0STRR2,[R1]b_end变量x值保存在R0中变量y的地址保存在R1中不在偏移表中出现的序号值,必须在使用查表跳转指令前对序号值进行重赋值处理相当于C语言中的default语句支体请在插入菜单—页眉和页脚中修改此文本37循环结构三种结构当型、直到型和计数型请在插入菜单—页眉和页脚中修改此文本38循环结构当型当关系为真时执行循环体执行循环体前先检测关系是为真,是则执行循环体,否则结束字符串存储处理流程C语言汇编语言char*p=x;y=0;while(*p){y++;p++;}MOVR2,#0loopLDRBR3,[R0],#1CBZR3,loop_endADDR2,#1Blooploop_end
STRR2,[R1]while(<逻辑量>){//循环体;}字符串保存在变量名为x的字节型数组变量中,x的值保存在R0中。所计算得到的长度保存在名为y的字型变量中,y地址保存在R1中。请在插入菜单—页眉和页脚中修改此文本39循环结构直到型执行循环体直到关系为假执行循环体后检测关系是否为真,是则再执行循环体,否则结束处理流程C语言汇编语言char*p=x-1;y=-1;do{y++;p++;}while(*p);MOVR2,#-1loopADDR2,#1LDRBR3,[R0],#1CMPR3,#0BNEloopSTRR2,[R1]字符串保存在变量名为x的字节型数组变量中,x的值保存在R0中。所计算得到的长度保存在名为y的字型变量中,y地址保存在R1中。do{//循环体;}while(<逻辑量>);请在插入菜单—页眉和页脚中修改此文本40计数型采用计数量确定循环次数,执行前对计数量赋初始,每次执行循环体前检测计数量是否达到规定数,每次执行完循环体后计数量更新。for(<计数量)=<初值>;<执行循环体的关系>;<循环量更新表达式>){//循环体;}处理流程C语言汇编语言s=0;for(i=0;i<=N;i++){s=s+i;}MOVR2,#0MOVR0,#0loopCMPR0,#NBNEloop_endADDR2,R0ADDR0,#1Blooploop_endSTRR2,[R1]
函数05请在插入菜单—页眉和页脚中修改此文本42函数一个大型程序通常由若干个程序模块按照一定流程组合而成。每个程序模块也称为子程序,由一个或多个语句块组成,负责完成某项特定任务,具备相对的独立性。子程序通过主程序的调用来实现功能。子程序有两种表现形式过程强调动作,没有返回值函数侧重计算,通常有返回值两者实质是一回事,后文统称为函数过程是没有返回值的函数请在插入菜单—页眉和页脚中修改此文本43函数函数操作函数被调用时,返回地址保存在LR中进入函数时,需将函数体内会用到的寄存器压入堆栈保护离开函数时,将返回地址赋给PC实现返回函数有输入参数和返回值接受调用方的数据进行处理,处理结果返给调用方函数在处理中需要多个寄存器这些寄存器的值称为现场函数开始时现场保存使用这些寄存器之前要将原有的数据压入堆栈函数结束时现场恢复当处理结束后再恢复回来功能汇编语言C语言哑函数dummyPROCBXLRENDPvoiddummy(){}请在插入菜单—页眉和页脚中修改此文本44函数参数传递参数传递调用者将所要处理的数据(也称为输入参数)保存在寄存器或存储器中函数从中读取这些数据并将处理结果(也称为返回值)也保存在这些寄存器或存储器中函数结束返回后,调用者从中读取数据。存储方式寄存器传递调用者将参数保存在指定的寄存器中函数被调用时,从这些寄存器中取数进行处理,处理结果保存在指定的寄存器中存储变量传递调用者将参数保存在指定的存储变量中函数被调用时,从这些存储变量中取数进行处理,处理结果保存在指定的存储变量中堆栈传递调用者将数据压入堆栈中函数被调用时,从堆栈中取出输入参数处理结束后,返回参数保存在输入参数所在的堆栈单元中返回交互输入参数与返回值请在插入菜单—页眉和页脚中修改此文本45函数参数传递存储方式寄存器/堆栈联合传递调用者将输入参数一部分保存在寄存器中,一部分保存在堆栈中函数从寄存器中和堆栈中获得输入参数,其结果也保存在寄存器和堆栈中作为返回值功能汇编语言C语言参数传递主程序将x和y值分别读入寄存器R0和R1,并将R1压栈。调用返回后,将R0中值保存到z中,再调整SP下移一字,回到初始栈位。LDRR0,=xLDRHR0,[R0]LDRR1,=yLDRHR1,[R1]PUSH{R1}BLmyfuncLDRR1,=zSTRR0,[R1]ADDSP,#4z=myfunc(x,y);函数压入工作寄存器R1,再从堆栈中取出输入参数存于R1,其和保存在调入时的栈顶,弹出R1后返回。myfuncPROCPUSH{R1}LDRR1,[SP,#4]ADDR0,R1POP{R1}MOVPC,LRENDPintmyfunc(intx,inty){returnx+y;}请在插入菜单—页眉和页脚中修改此文本46函数参数传递参数作用传值传变量的值改变参数值不影响变量的值传址传变量的地址利用地址可以改变变量的值功能参数分配C语言汇编语言传值voidswap(intx,inty){intz;z=y;y=x;x=z;}swapPROCPUSH{LR}MOVLR,R0MOVR0,R1MOVR1,LRPOP{PC}ENDP功能参数分配C语言汇编语言传址voidswap(int*x,int*y){intz;z=*y;*y=*x;*x=z;}swapPROCPUSH{R2,LR}LDRR2,[R0]LDRLR,[R1]
STRLR,[R0]
STRR2,[R1]POP{R2,PC}ENDP请在插入菜单—页眉和页脚中修改此文本47局部变量分配局部变量函数体内需要一定量的存储空间供函数处理使用,其作用域仅在函数体内在函数结束后就没用了,故在堆栈空间中进行分配函数相关的堆栈区分为四个子区从高地址向低地址依次分配为:输入参数子区参数传递寄存器保护子区用于保护调用现场,通过PUSH和POP建立和释放多个寄存器局部变量子区该空间的分配和释放通过更新SP来实现,局部变量存储空间的寻址是以SP为基址实现临时保护子区运算时动态保存中间数据,通过出栈和入栈指令来操作请在插入菜单—页眉和页脚中修改此文本48局部变量分配局部变量汇编语言函数的局部变量保存在存储器中,每个变量都使用地址来访问C语言函数的输入参数和内部定义的变量都视为局部变量可能保存在寄存器中,也可能保存在存储器中,要根据具体处理过程来定某函数有三个输入参数值a、b和c,一个保存在R0,另两个保存在堆栈中,返回结果保存在R0。程序只允许用寄存器R0、R1和R2,处理过程需要3个临时字变量。功能C语言汇编语言寄存器与堆栈函数:三个输入参数,一个返回值。intmyfunc(intx,inty,intz){intm,n,k;k=x;⁝}myfuncPROCPUSH{R1,R2}SUBSP,SP,#4*3STRR0,[SP,#4*2]⁝ADDSP,SP.#4*3POP{R1,R2}BXLRENDP请在插入菜单—页眉和页脚中修改此文本49迭代函数
功能C语言汇编语言unsignedintfac(unsignedintn){unsignedinti,s;s=1;for(i=n;i>=1;i--)s=s*i;returns;}facPROCPUSH{LR}MOVLR,#1loopCMPR0,#1BLOretMULLR,LR,R0SUBR0,#1BloopretMOVR0,LRPOP{PC}ENDP请在插入菜单—页眉和页脚中修改此文本50递归函数
功能C语言汇编语言指令执行后状态寄存器组堆栈R0LRm-1mm+1函数:计算阶乘,利用公式:n!=n
(n-1)!0!=1输入参数和返回参数均保存在R0中。unsignedintfac(unsignedintn){if(n)returnn*fac(n-1);elsereturn1;}
facPROCna---CBZR0,op2na---PUSH{R0,LR}nana-SUBR0,#1n-1ana-BLfac(n-1)!bna-POP{LR}(n-1)!nna-MULR0,LRn!nna
POP{LR}n!ana-op2
MOVR0,#10!ana
ret
MOVPC,LRn!a---ENDP
函数调用中都会在堆栈中保存调用时的寄存器,故反复调用自身不影响函数的正常执行混合编程06请在插入菜单—页眉和页脚中修改此文本52变量互用C用汇编变量汇编程序的变量名用EXPORT来声明才可由C程序使用使用时用extern来声明变量名asm_var在汇编程序中代表地址、在C程序中代表存储空间汇编用C变量C语言中的变量只要不使用static来声明就可以由汇编使用,使用时用IMPORT语句声明变量;汇编程序EXPORTasm_varasm_var DCD0//C程序externintasm_var;asm_var=2;汇编程序IMPORTc_varLDRR0,=3LDRR1,=c_varSTRR0,[R1]//C程序intc_var;请在插入菜单—页眉和页脚中修改此文本53函数调用输入参数1-参数4保存在寄存器R0-R3,其它参数从最后向前入栈保存32位返回值保存在R0,64位返回值保存在R0和R1中输入参数参数1参数2参数3参数4参数5
参数m返回值一个参数R0------R0R1两个参数R0R1------R0R1三个参数R0R1R2----R0R1四个参数R0R1R2R3---R0R1五个参数R0R1R2R3SP--R0R1m个参数R0R1R2R3SP…SP+4m-20R0R1;汇编程序EXPORTasm_funcasm_funcPROCMULR0,R0BXLR//C程序externunsignedintasm_func(unsignedintn);voidtest{asm_func(2);}unsignedintc_func(unsignedintn){returnn*n;};汇编程序IMPORTc_funcLDRR0,=3PUSH{LR}BLc_funcPOP{LR}请在插入菜单—页眉和页脚中修改此文本54
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 线粒体铁转运蛋白MrsC调控玉米新月弯孢毒力的机制研究
- 苏教版二年级下册科学课程拓展计划
- 物流机器人协作-洞察及研究
- 农村地区慢性病预防与管理-洞察及研究
- 小学图书室多元阅读资源计划
- 腰痛中医护理病例讨论
- 非工作上网行为对员工工作繁荣的影响研究
- 玻璃深加工技术管理制度
- 足球俱乐部器材管理制度
- 标准化公司财务管理制度
- 刚新修订《治安管理处罚法》培训
- 厨师长岗位面试问题及答案
- 农业水果储藏管理办法
- 胡麻种植技术课件
- (零诊)成都市2023级(2026届)高中毕业班摸底测试物理试卷(含答案)
- 料质检员笔试试题及答案
- 高压安全知识培训
- 护士长岗位胜任力培训心得
- 陕西省西安市经开区2024-2025学年八年级下学期期末学生学业水平质量监测英语试卷(含答案)
- 警察警械使用培训课件
- 燃气管道施工重点难点及安全措施
评论
0/150
提交评论