• ARMday2


    目录

    一、示例汇编代码示例

    二、.程序的调试

    ​编辑三、map.lds分析

    四、【汇编语言的相关语法】

    1、汇编文件中的内容

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

    五、【汇编的指令】

    1.数据搬移指令

    1.1 基本格式

    1.2 示例

    ​编辑2. 立即数的概念

    2.1 概念

    2.2 立即数的判断

    ​编辑2.3 如何将一个非立即数保存在寄存器中

    ​编辑3.移位操作指令

    3.1 指令格式以及指令码

    3.2 示例

    ​编辑4.位运算指令

    4.1 相关指令功能以及规则

     4.2 位运算指令码以及格式

     4.3 示例

    5.算数运算指令

    5.1 指令码以及格式

    5.2 示例代码

    ​编辑5.3 进行64位算数运算

    6.数据比较指令

    6.1 语法

    ​编辑6.2 示例

    7.跳转指令

    任务

    1.复习今日内容

    2.实现1-100,累加


     

    一、示例汇编代码示例

    1. .text @声明当前内容为文本段内容
    2. .global _start @声明_start的内容为全局内容
    3. _start:
    4. mov r1,#1 @将1保存在r1寄存器
    5. loop:
    6. b loop @程序跳转到loop标签
    7. .end @程序结束

    二、.程序的调试

    三、map.lds分析

    map.lds文件是一个链接脚本文件 链接脚本的作用:当程序在编译的最后一个阶段-链接阶段中按照链接脚本的规定,链接不同的文件生成可执行文件

    1. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
    2. /*指定输出elf格式的适用于32位机器的镜像,镜像内部的数据按照小端存储方式 */
    3. OUTPUT_ARCH(arm)/*生成的镜像架构是ARM架构的 */
    4. ENTRY(_start)/* 程序执行的入口是_start*/
    5. SECTIONS /* 内部指定了不同内容在内存中的存储位置*/
    6. {
    7. . = 0x00000000; /*当前程序起始地址为0X0*/
    8. . = ALIGN(4);/*程序中的指令遵循4字节对齐*/
    9. .text : /*指定文本段的存储地址*/
    10. {
    11. ./Objects/start.o(.text) /*start.o的内容放在文本段最开始*/
    12. *(.text)/*其他的文件保存位置由链接器自己决定*/
    13. }
    14. . = ALIGN(4);
    15. .rodata : /*规定只读代码段的存储规则*/
    16. { *(.rodata) }
    17. . = ALIGN(4);
    18. .data :
    19. { *(.data) }
    20. . = ALIGN(4);
    21. __bss_start = .; /*指定.bss段的起始位置*/
    22. .bss :
    23. { *(.bss) }
    24. __bss_end__ = .;/* 指定.data段的起始位置*/
    25. }

    四、【汇编语言的相关语法】

    1、汇编文件中的内容

    1. 1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用
    2. .text .global .glbal .if .else .endif .data .word....
    3. 2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算
    4. 数据处理指令
    5. 数据搬移指令
    6. 算数运算指令
    7. 数据移位指令
    8. 位运算指令
    9. 数据比较指令
    10. 跳转指令
    11. 内存读写指令
    12. 状态寄存器传送指令 CPSR
    13. 软中断指令
    14. 3.伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现
    15. 4.注释
    16. 单行注释: @ ;
    17. 多行注释: /* */
    18. 条件注释
    19. .if 1/0
    20. 指令段1
    21. .else
    22. 指令段2
    23. .endif

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

    1. 指令的基本格式:
    2. <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>
    3. <opcode>:指令的操作码
    4. cond:条件码后缀
    5. s:指令的执行结果将会影响CPSR中的条件标志位。
    6. <Rd>:目标寄存器,指令的运算结果保存在目标寄存器中
    7. <Rn>:第一操作寄存器,只能是寄存器
    8. <shifter_operand> :第二操作数,既可以是寄存器编号,又可以是立即数
    9. 意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中
    10. 注意:
    11. 1.一般一条汇编指令就占据一行代码
    12. 2.汇编不区分大小写
    13. 3.操作数前面要跟一个#

    五、【汇编的指令】

    1.数据搬移指令

    1.1 基本格式

    1. <opcode> {<cond>} {s} <Rd>, <shifter_operand>
    2. 解释:
    3. <opcode>:指令的操作码
    4. cond:条件码后缀
    5. s:指令的执行结果将会影响CPSR中的条件标志位。
    6. <Rd>:目标寄存器,指令的运算结果保存在目标寄存器中
    7. <shifter_operand> :第一操作数,既可以是寄存器编号,又可以是立即数
    8. 指令码:
    9. mov:将操作数直接搬移到目标寄存器中
    10. mvn:将操作数按位取反之后搬移到目标寄存器中

    1.2 示例

    2. 立即数的概念

    2.1 概念

    定义:可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取

    循环右移:低位移除,补到高位

    2.2 立即数的判断

    1. 如何判断一个数据是不是立即数:
    2. 只要让这个数据或者这个数据按位取反的值循环右移偶数位,能够得到一个0-255范围内的数字就说明这个数是立即数
    3. ex:
    4. 1. 0X104-> 0000 0000 0000 0000 0000 0001 0000 0100
    5. 0X104循环右移两位-》00 0000 0000 0000 0000 0000 0001 0000 01->0x41
    6. 0X41是一个0-255范围内的数据
    7. 0x1040X41循环右移30位得到的数据,所以,0X104是立即数
    8. 2.0x101-> 0000 0000 0000 0000 0000 0001 0000 0001
    9. 0X101找不到一个0-255范围内的数字寻魂右移偶数位得到它,所以它不是立即数
    10. 3.0XFFFFFFFE ->1111 1111 1111 1111 1111 1111 1111 1110
    11. 0XFFFFFFFE也找不到0-255范围内的数字循环右移偶数位得到它,但是它的取反值0X1是一个立即数,所以0XFFFFFFFE也是一个立即数

    2.3 如何将一个非立即数保存在寄存器中

    利用伪指令ldr即可完成非立即数的操作 格式: ldr 目标寄存器名,=数据

    3.移位操作指令

    3.1 指令格式以及指令码

    1. 格式:
    2. <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>
    3. 解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中
    4. 指令码:
    5. lsl:左移运算,最高位移出,最低位补0
    6. lsr:右移运算,最低位移出,最高位补0
    7. ror:循环右移:最低位移出,补到最高位

    3.2 示例

    1. text
    2. .global _start
    3. _start:
    4. mov r0,#0XFF
    5. lsl r1,r0,#4 @0XFF左移四位结果保存到r1 0XFF0
    6. lsr r2,r0,#4 @0XFF右移移四位结果保存到r2 0XF
    7. ror r3,r0,#4 @0XFF循环右移四位结果保存到r3 0XF000000F
    8. loop:
    9. b loop
    10. .end

    4.位运算指令

    4.1 相关指令功能以及规则

    与、或、异或、按位清0

    与:与0清0 与1不变

    初值

    运算值

    结果

    1

    0

    0

    1

    1

    1

    0

    1

    0

    0

    0

    0

    或:或1置1 或0不变

    初值

    运算值

    结果

    1

    0

    1

    1

    1

    1

    0

    1

    1

    0

    0

    0

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

    初值

    运算值

    结果

    1

    0

    1

    1

    1

    0

    0

    1

    1

    1

    1

    0

    按位清0:想要哪位清0,只需要和1进行运算即可

    初值

    运算值

    结果

    1

    1

    0

    0

    1

    0

    1

    0

    1

    0

    0

    0

     4.2 位运算指令码以及格式

    1. 格式:
    2. {} {s} , ,
    3. 指令码:
    4. and:进行按位与
    5. orr:进行按位或
    6. eor:按位异或
    7. bic:按位清0

     4.3 示例

    1. .text
    2. .global _start
    3. _start:
    4. mov r0,#0XFF
    5. and r1,r0,#(~(0X1<<4)) @第四位清0 0xEF
    6. orr r2,r0,#(0X1<<9) @第9位置1 0X2FF
    7. eor r3,r0,#0XF @0xf0
    8. bic r4,r0,#(0X1<<4)@第四位清0 0xEF
    9. loop:
    10. b loop
    11. .end

    5.算数运算指令

    5.1 指令码以及格式

    1. 格式:
    2. {}{s} , ,
    3. 指令码:
    4. add:加法运算 Rd=Rn+shifter_operand
    5. adc:进行加法运算时考虑CPSR的C位 Rd=Rn+shifter_operand+CPSR[c]
    6. sub:减法运算 Rd=Rn-shifter_operand
    7. sbc:进行减法运算时考虑CPSR的c位 Rd=Rn-shifter_operand-!CPSR[c]
    8. RSB
    9. :逆向减法Rd=shifter_operand-Rn
    10. RSC:带借位的逆向减法指令 Rd = shifter_operand – Rn - !CPSR[c]
    11. mul:乘法运算 Rd=Rn*shifter_operand

    5.2 示例代码

    加法

    1. .text
    2. .global _start
    3. _start:
    4. mov r0,#0XFFFFFFFE
    5. mov r1,#3
    6. adds r2,r0,r1 @0X1,运算的结果影响到条件位
    7. adc r3,r1,r2 @r3=r1+r2+CPSR[c]
    8. loop:
    9. b loop
    10. .end

    减法:

    1. .text
    2. .global _start
    3. _start:
    4. mov r0,#0XFFFFFFFE
    5. mov r1,#3
    6. subs r2,r1,r0 @减法不借位,c位置1,借位,c位清0
    7. mov r3,#6
    8. sbc r4,r3,r1 @r4=r3-r1-!CPSR[c]
    9. loop:
    10. b loop
    11. .end

    5.3 进行64位算数运算

    1. MOV R1,#0xfffffffe @第一个数据的低32位
    2. mov r2,#0x00000004 @第一个数据的高32位
    3. MOV R3,#0x00000005 @第二个数据的低32位
    4. mov r4,#0x00000004 @第二个数据的高32位
    5. 加法:
    6. 32位:
    7. adds r5,r1,r3
    8. 32位:
    9. adc r6,r2,r4
    10. 减法:
    11. 32位:
    12. subs r5,r3,r1
    13. 32位:
    14. sbc r6,r4,r2

    6.数据比较指令

    6.1 语法

    1. 格式:
    2. cmp ,
    3. 比较指令的本质:
    4. 拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位
    5. 可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句
    6. 这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现

    6.2 示例

    1. .text
    2. .global _start
    3. _start:
    4. MOV R1,#4
    5. MOV R2,#4
    6. CMP R1,R2
    7. addeq r3,r1,r2 @if(r1==r2) r3=r1+r2
    8. subne r4,r1,r2 @if(r1!==r2) r4=r1-r2
    9. loop:
    10. b loop
    11. .end

    7.跳转指令

    1. 一般实现程序的跳转有两种方式:
    2. 1.直接修改PC的值
    3. 2.通过跳转指令
    4. 跳转指令:
    5. 1.b label
    6. 解释:跳转到label标签所在代码,此时跳转,lr寄存器不保存返回地址
    7. ex:
    8. .text
    9. .global _start
    10. _start:
    11. MOV R1,#4
    12. MOV R2,#4
    13. CMP R1,R2
    14. beq addfunc
    15. bne subfunc
    16. addfunc:
    17. add r3,r1,r2
    18. b loop
    19. subfunc:
    20. sub r4,r1,r2 @if(r1!==r2) r4=r1-r2
    21. b loop
    22. loop:
    23. b loop
    24. .end
    25. 2. bl label
    26. 解释:跳转到label标签所在代码,此时跳转,lr寄存器保存返回地址
    27. ex:
    28. .text
    29. .global _start
    30. _start:
    31. MOV R1,#4
    32. MOV R2,#4
    33. CMP R1,R2
    34. bleq addfunc
    35. blne subfunc
    36. addfunc:
    37. add r3,r1,r2
    38. mov pc,lr @程序返回
    39. subfunc:
    40. sub r4,r1,r2 @if(r1!==r2) r4=r1-r2
    41. mov pc,lr @程序返回
    42. loop:
    43. b loop
    44. .end
    45. 3. bx 地址
    46. 跳转到地址对应的的指令位置,此时跳转LR不保存返回地址
    47. .text
    48. .global _start
    49. _start:
    50. MOV R1,#4
    51. MOV R2,#4
    52. MOV R3,#4
    53. MOV R4,#4
    54. MOV R5,#4
    55. MOV R6,#4
    56. bx r3 @跳转到地址为4的指令位置
    57. loop:
    58. b loop
    59. .end
    60. 4.blx 地址
    61. 跳转到地址对应的的指令位置,此时跳转LR保存返回地址
    62. .text
    63. .global _start
    64. _start:
    65. MOV R1,#4
    66. MOV R2,#4
    67. MOV R3,#4
    68. MOV R4,#4
    69. MOV R5,#4
    70. blx r3 @跳转到地址为4的指令位置
    71. MOV R6,#4
    72. loop:
    73. b loop
    74. .end

    任务

    1.复习今日内容

    2.实现1-100,累加

    1. .text
    2. .global start
    3. _start:
    4. mov r0,#0 @存放sum
    5. mov r1,#1 @存放相加的数值
    6. loop:
    7. cmp r1,#100
    8. bhi wh
    9. add r0,r0,r1
    10. add r1,r1,#1
    11. b loop
    12. wh:
    13. b wh
    14. .end

  • 相关阅读:
    【rainbowzhou 面试9/101】技术提问--常见的大数据基准测试工具有哪些未命名文章
    c++事件总线模型
    ArcGIS操作(四)
    【unity】网格描边方法
    锐捷网络NBR700G 信息泄露漏洞复现 [附POC]
    和数集团着重发力 区块链发展潜力再获认可
    浏览器存储(webStorage)常用API以及简单使用
    Restormer: Efficient Transformer for High-Resolution Image Restoration
    如何使用 K8s 实现跨集群管理,这篇文章告诉你了!赶紧收藏
    强大而灵活的python装饰器
  • 原文地址:https://blog.csdn.net/m0_69894626/article/details/134309968