码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ARM 汇编伪指令


    一、伪指令的意义

    • 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
    • 伪指令的意义在于指导编译过程。
    • 伪指令是和具体的编译器相关的,我们使用 gnu 工具链,因此学习 gnu 环境下的汇编伪指令。

    二、gnu 汇编中的一些符号

    • @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
    • # 做注释,一般放在行首,表示这一行都是注释而不是代码。
    • :以冒号结尾的是标号
    • . 点号在 gnu 汇编中表示当前指令的地址
    • # 立即数前面要加#或$,表示这是个立即数
    int a;
    
    
    while(1);
    
    flag:
    	b flag
    	
    	b .
    	
    IRQ_STACK_START:
    	.word	0x0badc0de
    等价于 unsigned int IRQ_STACK_START = 0x0badc0de;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、常用 gnu 伪指令

    .global _start		    @ 给_start外部链接属性
    .section .text		    @ 指定当前段为代码段
    .ascii .byte .short .long .word 
    .quad .float .string    @ 定义数据
    .align 4			    @ 以16字节对齐
    .balignl 16 0xabcdefgh 	@ 16字节对齐填充
    .equ			        @ 类似于C中宏定义
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    .align 4 @ 2的 4 次幂,16字节对齐
    .align 2 @ 2的 2 次幂, 4字节对齐

    .balignl 16, 0xdeadbeef @ 对齐 + 填充
    b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料。

    0x00000008: .balignl 16, 0xdeadbeef
    0x0000000c: 0xdeadbeef
    0x00000010: 下一条指令


    偶尔会用到的 gnu 伪指令

    .end			@标识文件结束
    .include			@ 头文件包含
    .arm / .code32	@声明以下为arm指令
    .thumb / .code16	@声明以下为thubm指令
    
    • 1
    • 2
    • 3
    • 4

    最重要的几个伪指令

    ldr		大范围的地址加载指令
    adr	    小范围的地址加载指令
    adrl	中等范围的地址加载指令
    nop	空操作
    
    ARM 中有一个 ldr 指令,还有一个 ldr 伪指令
    一般都使用 ldr 伪指令而不用 ldr 指令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    adr 与 ldr
    • adr 编译时会被1条 sub 或 add 指令替代,而ldr编译时会被一条 mov 指令替代或者文字池方式处理;
    • adr 总是以 PC 为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
    • ld r加载的地址和链接时给定的地址有关,由链接脚本决定。

    注意:

    ldr指令: ldr r0, #0xff
    伪指令: ldr r0, =0xfffl @涉及到合法/非法立即数,涉及到ARM文字池

    adr 和 ldr 的差别:ldr 加载的地址在链接时确定,而 adr 加载的地址在运行时确定;所以我们可以通过 adr 和 ldr 加载的地址比较来判断当前程序是否在链接时指定的地址运行。

  • 相关阅读:
    docker 部署springboot(成功、截图)
    【密评】商用密码应用安全性评估从业人员考核题库(十三)
    面试总结-Redis篇章(十二)——Redis是单线程的,为什么还那么快
    【剑指Offer】44.数字序列中某一位的数字
    DRF-项目-(1):构建纯净版的drf项目,不再使用django的后台管理,django的认证,django的session等功能,作为一个纯接口项目
    【唐山海德教育】什么是安全员证书,有哪些分类?
    促进国内凝聚态物理理论与统计物理及交叉学科的学术交流及促进学科发展,与龙讯旷腾相约济南
    vueRouter的$route和$router的解析和运用场景
    Matlab 画图(超详细)
    11.22 - 每日一题 - 408
  • 原文地址:https://blog.csdn.net/weixin_42109053/article/details/128073257
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号