当前位置: 首页 > news >正文

乘风专业建站网站优化的意义

乘风专业建站,网站优化的意义,大宁网站制作,广东省示范校建设专题网站【汇编语言相关语法】 1.汇编语言的组成部分 1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data 2.汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存&…

【汇编语言相关语法】

1.汇编语言的组成部分

        1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data

        2.汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能

        3.伪指令 不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现

        4.注释 单行注释: @ 多行注释 /* */ 条件编译 .if 0 指令段 .else 指令段 .endif

2.汇编指令的介绍

        1.基本数据操作指令 数据搬移指令 = 数据移位指令 << >> 数据算数运算指令 + - * / 位运算指令 & | ~ ^ 数据比较指令

        2.跳转指令

         3.内存读写指令

        4.状态寄存器读写指令

        5.软中断指令

3.汇编指令的基本语法格式

指令的基本格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

解释:

        <opcode>:指令码

        {<cond>}:条件码

        {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位

         <Rd>:目标寄存器

        <Rn>:第一操作寄存器 只能是寄存器

        <shifter_operand>:第二操作数,可以是寄存器,也可以是立即数 按照指令码将第一操作寄存器和第二操作数进行运算,将运算后的结果保存在目标寄存器

        注意: 1.一条汇编指令一般占一行 2.汇编不区分大写小写

【汇编指令】

1.数据搬移指令

1.1 格式

<opcode>{<cond>}{s} <Rd>, <shifter_operand>

解释:

        <opcode>:指令码

        {<cond>}:条件码

        {s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位

        <Rd>:目标寄存器 <shifter_operand>:第一操作数,可以是寄存器,也可以是立即数 按照指令码将第一操作数运算后的结果保存在目标寄存器

指令码功能: mov:将第一操作数的值保存在目标寄存器

                        mvn:将第一操作数的值按位取反,将结果保存在目标寄存器

1.2 示例

1.3 立即数的概念

定义:能够直接当作指令的一部分参与到指令的执行过程中的数据就是立即数.立即数由一个0-255范围内的数循环右移偶数位获得。

在指令的32为中将低12位预留保存立即数的数据

如何判断一个数据是不是立即数: 在0-255范围内找一个数,让它循环右移偶数位(一个0-15范围内的数*2得到),如果能够得到这个数据,则这个数就是一个立即数。

循环右移:最低位移出去的数补到最高位 0000 0000 0000 0000 0000 0000 0000 1010

右移两位: 0000 0000 0000 0000 0000 0000 0000 0010

循环右移两位: 100000 0000 0000 0000 0000 0000 0000 10 ex: 0X104: 0000 0000 0000 0000 0000 0001 0000 0100

循环右移2位-》000000 0000 0000 0000 000000 0100 0001 -》0x41 换句话说,将0x41循环右移30位得到0X104,所以,0X104是一个立即数 0X101:0000 0000 0000 0000 0000 0001 0000 0001 0X101找不到一个0-255范围内的数循环右移得到它,所以0X101不是立即数

1.4 将非立即数保存至寄存器中

伪指令: LDR 目标寄存器,=数值 将指定的数据放在目标寄存器中 ex:LDR r1,=0X12345678

2.移位指令

2.1 格式以及指令码

格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

解释:将第一操作寄存器的数值移位第二操作数指定的位数,将结果保存在目标寄存器中

指令码: LSL:左移运算 低位补0

                 LSR:右移运算 高位补0

                ROR:循环右移:低位移出的值补到高位

2.2 示例

1.左移mov r0,#0XFFlsl r1,r0,#0X4  @将R0的值左移4位保存在r1寄存器  R1结果:0XFF02.右移mov r0,#0XFF
lsr r1,r0,#0X4  @将R0的值右移4位保存在r1寄存器  R1结果:0XF
3.循环右移
mov r0,#0XFF
ror r1,r0,#0X4  @将R0的值循环右移4位保存在r1寄存器  R1结果:0XF000000F
4.c风格写法
mov r0,#0XFF
ror r1,r0,#(0X1<<2)  @将R0的值循环右移4位保存在r1寄存器  R1结果:0XF000000F

3.位运算指令

3.1 格式以及功能码

格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

解释:将第一操作寄存器和第二操作数进行位运算,将结果保存在目标寄存器中

指令码: and:与 与0清0 与1不变

                orr:或 或1置1 或0不变

                eor:异或 相同为0 不同为1

                bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可

3.2 示例

1.and:
mov r0,#0XFFand r1,r0,#0XF0  @R1结果为0XF02.ORR:mov r0,#0XFForr r1,r0,#0XF000  @R1结果为0XF0FF
3.EOR:ldr r0,=0xf0f0EOr r1,r0,#0XFF  @R1结果为0XF00F
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 1111 0000 1111 0000
结果:0000 0000 0000 0000 1111 0000 0000 1111 -》0XF00F4.BICldr r0,=0xFFBIC r0,r0,#(0x1<<5)  @将R0的值第5位清0 @R0结果为0XDF

3.3 练习

LDR r1,=0X12345678  @将0X12345678存放在r1寄存器
0001 0010 0011 0100 0101 0110 0111 1000
1.将R1寄存器的第4位清0,其他位不变and r1,r1,#(~(0X1<<4))或者BIC R1,R1,#(0x1<<4)
2.将r1寄存器第7位置1,其他位不变
orr r1,r1,#(0X1<<7)
3.将r1寄存器[31:28]清0,其他位不变
and r1,r1,#(~(0Xf<<28))或者BIC R1,R1,#(0xF<<28)
4.将r1寄存器[7:4]置1,其他位不变
orr r1,r1,#(0XF<<4)
5.将r1寄存器[15:11]设置为10101,其他位不变 @先清0BIC R1,R1,#(0X1F<<11)@再置位orr r1,r1,#(0X15<<11)

4.算数运算指令

4.1 格式以及指令码

格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

解释:将第一操作寄存器的值和第二操作数进行算数运算,结果保存在目标寄存器中

        add:加法运算

        adc:进行加法运算时需要考虑CPSR的条件位

        sub:减法运算

        sbc:进行减法运算时需要考虑CPSR的条件位

        mul:乘法运算

4.2 示例

1.ADD:加法ex1:  mov r1,#1mov r2,#2add r3,r1,r2@r3=r1+r2ex:mov r1,#0XFFFFFFFEmov r2,#2addS r3,r1,r2@r3=r1+r2  @运算的结果影响到条件位
2.SUBmov r1,#0XFFFFFFFEmov r2,#2sub r3,r1,r2@r3=r1-r2ex2:mov r1,#0XFFFFFFFEmov r2,#2subs r3,r2,r1@r3=r2-r1 
3.ADC
mov r1,#0XFFFFFFFE
mov r2,#2ADDS r3,r2,r1 @r3=r1+r2 ADC R4,R2,#3  @R4=R2+3+cpsr(C位)  6 4.sbc:减法运算考虑条件位
mov r1,#0XFFFFFFFEmov r2,#2SUBS r3,r2,r1 @r3=R2-R1    4sbC R4,R1,#3  @R4=R1-3-CPSR(C位取反)

4.3 64位数据进行算数运算

原则: 一个 64位数保存在两个寄存器

                高32位运算,低32位运算

                mov r1,#0XFFFFFFFE @保存第一个数据的低32位

                mov r2,#2@保存第一个数据的高32位

                mov r3,#3 @保存第二个数据的低32位

                mov r4,#4 @保存第2数据的高32位 @低32位运算要求影响条件位

                ADDS R5,R1,R3@R5保存运算后结果的低32位

                ADC R6,R2,R4@R6寄存器保存运算结果的高32位,需要考虑条件位

5.比较指令

格式: cmp 第一操作数,第二操作寄存器 比较两个数据

cmp命令本质:实际上就是比较的两个数进行减法运算,并且减法运算的结果会影响到CPSR寄存器的条件位 通常比较指令完毕之后会使用条件码进行判断,根据判断的结果做不同的逻辑

条件码

在一个指令后面加上条件码的助记词后缀,如果满足条件码对应的条件,我们就会进行对应的指令操作,否则不进行操作

mov r1,#3 mov r2,#4 cmp r1,r2 @比较两个数

SUBHI r3,r1,r2 @如果r1>r2 进行减法运算

MULEQ r3,r1,r2@如果两数相等,进行乘法运算

ADDCC R3,R1,R2@如果r1<r2 ,进行加法运算

6. 跳转指令

格式:
<opcode>{<cond>} 标签
功能:跳转到指定的标签下指令码:
b:跳转时不影响LR寄存器的值ex:.text
.global  _start_start:mov r1,#3mov r2,#4b fun1 @程序跳转mul r5,r1,r2stop:b stop  fun1:add r4,r1,r2.endbl:跳转时影响LR寄存器的值.text
.global  _start_start:mov r1,#3mov r2,#4bl fun1 @程序跳转mul r5,r1,r2stop:b stop  fun1:add r4,r1,r2mov pc,lr @程序返回.end

【内存读写指令】

int *p=0X12345678

*p=100;//向内存中写入数据

int a= *p;//从内存读取

1.单寄存器内存读写指令

讨论如何将单个寄存器的数据向内存中读写

1.1 指令码以及功能

向内存中写:
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字(2字节)的数据
strb:向内存写一个字节的数据
从内存读:
ldr:从内存读取一个字的数据
ldrh:从内存读取半个字的数据
ldrb:从内存读取一个字节的数据

1.2 格式

指令码{条件码} 目标寄存器 [目标地址]
str 目标寄存器 ,[目标地址]:将目标寄存器的数据写入到以目标地址为起始的内存中
ldr 目标寄存器 ,[目标地址]:从以目标地址为起始的内存中读一个字的数据到目标寄存器

1.3 示例

 mov r1,#0XFFFFFFFFldr r2,=0X40000000@向内存写入str r1,[r2]@从内存读ldr r3,[r2]

1.4 单寄存器读写的地址索引方式

1.前索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]@将r1寄存器的值保存到r2+8为起始地址的内存中ldr r3,[r2,#8]@从r2+8为起始地址的内存中读2.后索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2],#8  @将r1寄存器的值保存到r2为起始地址的内存中,r2值=让r2+83.自动索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]!  @将r1寄存器的值保存到r2+8w为起始地址的内存中,r2=r2+8

2.批量寄存器的内存读写方式

2.1 指令码以及格式

向内存写:

         stm 目标地址,{寄存器列表} 将寄存器列表中每一个寄存器的值都写道目标地址指向的连续空间之中 从内存读

        ldm 目标地址,{寄存器列表} 将目标地址指向的连续内存中的数据读到寄存器列表中的寄存器中

注意事项: 1.如果寄存器列表中寄存器的编号连续,可以用-表示列表,如果不连续,用,分割寄存器 {r1-r5,r7}

                        2.无论寄存器列表中如何表示,我们在读写内存的时候始终是低地址 对应低寄存器编号

2.2 示例代码

mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6,{r1,r2,r3,r4,r5}  @将r1-r6寄存器的值写道r6指向的连续内存中ldm r6,{r7,r8,r9,r10,r11}@从r6指向的连续内存中读取数据保存到r7-r11寄存器中

2.3 批量寄存器的地址增长方式

每次向指定寄存器保存的地址中写入一个数据,保存地址的寄存器保存的地址也会发生相应的改变

 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6!,{r1-r5}先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长

ia后缀

 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5}先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长

ib后缀

mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmib r6!,{r1-r5}先让R6寄存器保存的地址往地址大的方向增长,再向R6寄存器保存的地址中写入数据

da后缀

mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmda r6!,{r1-r5}先向R6指向的内存中存数据,然后R6寄存器保存的地址往地址小的方向增长

DB后缀

  mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmdb r6!,{r1-r5}先将R6寄存器保存的地址往地址小的方向增长,再往R6寄存器保存的地址内存中存入数据

 mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5}   @ia存,db取ldmdb  r6!,{r7-r11}

3.栈内存读写

栈指针寄存器:R13/SP

栈:栈本质上就是一段内存,我们在内存中指定一片区域用于保存一些临时数据,这片区域就是栈区

3.1 栈的类型

增栈:压栈结束后,栈顶往地址大的方向增长

减栈:压栈结束后,栈顶往地址小的方向增长

空栈:压栈结束后,栈顶区域没有有效数据

满栈:压栈结束后,栈顶区域存放有效数据 空增栈(EA)/空减栈(ED)/满增栈(FA)/满减栈(FD) ARM使用的栈是满减栈

3.2 满减栈压栈出栈操作

ex1:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5push {r1-r5} @压栈pop {r6-r10}  @将栈顶元素数值出栈
ex2:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMDB sp!,{r1-r5} @压栈LDMIA sp!,{r6-r10}  @将栈顶元素数值出栈
EX3:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMfd sp!,{r1-r5} @压栈LDMfd sp!,{r6-r10}  @出栈

4.栈实例---叶子函数的调用过程

.text  
.global _start _start:ldr sp,=0X40000020 @初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#3mov r2,#4sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr  @返回main函数wh: b wh  .end 

5.栈实例---非叶子函数的调用过程

.text  
.global _start _start:ldr sp,=0X40000020 @初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4bl fun1sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2,lr}mov pc,lr  @返回main函数
fun1:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#4mov r2,#5mul r5,r1,r2@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lrwh: b wh  .end 


文章转载自:
http://dinncointranational.bpmz.cn
http://dinncoladderlike.bpmz.cn
http://dinncodeejay.bpmz.cn
http://dinncodurum.bpmz.cn
http://dinnconazirite.bpmz.cn
http://dinncoscupseat.bpmz.cn
http://dinncocrepitate.bpmz.cn
http://dinncoheteronuclear.bpmz.cn
http://dinncoincogitability.bpmz.cn
http://dinncolassen.bpmz.cn
http://dinncotyrannically.bpmz.cn
http://dinncosemiarc.bpmz.cn
http://dinncoislandless.bpmz.cn
http://dinncopreselector.bpmz.cn
http://dinncoepithalamus.bpmz.cn
http://dinncocoho.bpmz.cn
http://dinncoperipherad.bpmz.cn
http://dinncohispanism.bpmz.cn
http://dinncocaudad.bpmz.cn
http://dinncoladysnow.bpmz.cn
http://dinncoemulsin.bpmz.cn
http://dinncowaiting.bpmz.cn
http://dinncodecontamination.bpmz.cn
http://dinncomagneto.bpmz.cn
http://dinncodeposition.bpmz.cn
http://dinncotottering.bpmz.cn
http://dinncotaileron.bpmz.cn
http://dinncohorseshoe.bpmz.cn
http://dinncogesticulative.bpmz.cn
http://dinncopouchy.bpmz.cn
http://dinncoautofining.bpmz.cn
http://dinncoeroica.bpmz.cn
http://dinncokahn.bpmz.cn
http://dinncogarn.bpmz.cn
http://dinncohisself.bpmz.cn
http://dinncotubercule.bpmz.cn
http://dinncoparatonic.bpmz.cn
http://dinncoroost.bpmz.cn
http://dinncosuspiration.bpmz.cn
http://dinncomegalosaur.bpmz.cn
http://dinncogreaten.bpmz.cn
http://dinncopigeonite.bpmz.cn
http://dinncoyieldance.bpmz.cn
http://dinncoarachnidan.bpmz.cn
http://dinncosmelting.bpmz.cn
http://dinncomonial.bpmz.cn
http://dinncoatlantic.bpmz.cn
http://dinncohoicks.bpmz.cn
http://dinncopeninsula.bpmz.cn
http://dinncogallic.bpmz.cn
http://dinncosaccharose.bpmz.cn
http://dinncoepileptogenic.bpmz.cn
http://dinncoprehistoric.bpmz.cn
http://dinncobaseboard.bpmz.cn
http://dinncoperitrichate.bpmz.cn
http://dinncorotamer.bpmz.cn
http://dinncocompleteness.bpmz.cn
http://dinncounimolecular.bpmz.cn
http://dinncoprofessedly.bpmz.cn
http://dinncoprocrypsis.bpmz.cn
http://dinncosixthly.bpmz.cn
http://dinncochemostat.bpmz.cn
http://dinncotoxicological.bpmz.cn
http://dinncooutfoot.bpmz.cn
http://dinncoobsess.bpmz.cn
http://dinncofern.bpmz.cn
http://dinncononperishable.bpmz.cn
http://dinncomoppy.bpmz.cn
http://dinncoproctodeum.bpmz.cn
http://dinncoyahata.bpmz.cn
http://dinncoglobous.bpmz.cn
http://dinncomythicism.bpmz.cn
http://dinncoaiche.bpmz.cn
http://dinncodetector.bpmz.cn
http://dinncodichlorobenzene.bpmz.cn
http://dinncodak.bpmz.cn
http://dinncomummer.bpmz.cn
http://dinncomercurialise.bpmz.cn
http://dinncohob.bpmz.cn
http://dinncosunbathe.bpmz.cn
http://dinnconascent.bpmz.cn
http://dinncodexterous.bpmz.cn
http://dinncobunko.bpmz.cn
http://dinncoshrove.bpmz.cn
http://dinncosassaby.bpmz.cn
http://dinncogrand.bpmz.cn
http://dinncoorganotherapy.bpmz.cn
http://dinncopheasantry.bpmz.cn
http://dinncomanipulate.bpmz.cn
http://dinnconostradamus.bpmz.cn
http://dinncodropout.bpmz.cn
http://dinncodebby.bpmz.cn
http://dinncooutsight.bpmz.cn
http://dinncoacetarious.bpmz.cn
http://dinncopair.bpmz.cn
http://dinncohighjacker.bpmz.cn
http://dinncoapplewife.bpmz.cn
http://dinncocorrectness.bpmz.cn
http://dinncoviduity.bpmz.cn
http://dinncodocumentalist.bpmz.cn
http://www.dinnco.com/news/108363.html

相关文章:

  • 用什么网站做海报营销中存在的问题及对策
  • 国外室内设计案例网站网页搜索关键词
  • 个人网站可以做网上支付吗广告牌
  • wordpress自带301阜新网站seo
  • 美国域名注册商网站优化推广服务
  • 济南专业做网站公司哪家好sem是什么意思职业
  • wordpress名站线上网络推广怎么做
  • 网站备案号 怎么写专业seo网站优化推广排名教程
  • 网站开发技术基础教程怎么样引流加微信
  • 新手学做网站vs企业推广app
  • 网站内链案例seo实战技巧100例
  • 如何做百度的网站希爱力双效片骗局
  • 网站建设设计原则企业网站建设的步骤
  • 宝山手机网站制作公司今日足球赛事分析推荐
  • wordpress意见反馈功能seo基础教程使用
  • 凡科网做网站收费吗如何检测网站是否安全
  • 做网站哪个比较好sem推广外包
  • 网站后台是怎么做的微商引流人脉推广软件
  • 网站无法访问的原因企业网络营销推广案例
  • 视频制作网站怎么做百度问答首页
  • 东莞高端模板建站seo优化按天扣费
  • 手机网站宽度是多少成都调查事务所
  • wps做网站怎么进行网络推广
  • 企业电商网站开发网络推广seo怎么弄
  • 做盗版影视网站违法吗西安百度推广开户运营
  • 教育品牌网站建设优化大师apk
  • cdr做好排班怎么做网站原创文章代写
  • 郑州手机网站制作公司哪家好百度快速排名软件下载
  • .net网站建设百度一下官网首页百度一下
  • 重庆手机网站制作费用推广文案范文100字