首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么可能和不可能的宏对ARM汇编代码没有任何影响?

可能和不可能的宏对ARM汇编代码没有任何影响的原因是,宏是在代码预处理阶段展开的,而ARM汇编是在汇编阶段进行的,两者在编译过程中处于不同的阶段。在代码预处理阶段,编译器会将宏展开为相应的代码片段,然后进行汇编。而在汇编阶段,编译器将根据汇编指令生成相应的机器码。

宏是一种在源代码中定义的代码片段,它可以接收参数,并在代码预处理阶段被替换为实际的代码。宏可以用来简化代码,提高代码的重用性和可读性。然而,由于宏在代码预处理阶段展开,它们只是文本替换,不会对汇编指令产生影响。

ARM汇编是一种低级的程序设计语言,用于编写与特定处理器架构兼容的机器码指令。汇编指令直接对应于底层硬件指令,用于执行特定的操作。在汇编阶段,编译器将根据汇编指令生成对应的机器码,并最终生成可执行程序。

因此,宏对ARM汇编代码没有任何影响。宏只是在代码预处理阶段进行展开,并不会改变汇编指令的生成和执行过程。在编译器的处理过程中,宏已经被展开为实际的代码,而ARM汇编代码则是根据汇编指令生成的机器码来执行的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【反复横跳】从AC5到AC6转型之路(1)——补救准备

没有bug编译器是不存在,一个生命周期已经结束编译器就几乎不在存在修复已有bug未发现bug可能性;而一个积极维护编译器则可以及时将发现问题进行修复; Arm Compiler 5过去只有...C语言预处理”问题,得到了根治——你可以大大方方汇编代码里用 #include、各类定义 #if 了。...---- armasm(Arm Syntax):直接使用 armasm 来编译汇编代码。该选项 UAL 源代码文件兼容性最好。...3、在线汇编(Inline Assembly)嵌入C代码汇编(Embedded Assembly) 无论你是否了解 Arm Compiler 5所支持这两种在C语言中使用汇编方法,也不用关心它们区别...,结论是——任何Arm Compiler 5下C代码只要使用了上述两种方法之一,基本上就是“需要手工干预”

4.5K30

熟悉又陌生arm 编译器详解(armccarmclang)

代码包括程序结果没有影响可达代码,例如对从未使用过局部变量赋值。无法访问代码是专门代码无法通过任何控制流路径访问,例如紧跟在返回之后代码 陈述。 -O1受限优化。...调试视图与 –O0 区别在于: 不能在死代码上设置断点。 变量值在初始化后可能在其范围内不可用。例如,如果他们分配位置已被重复使用。 没有影响函数可能会被乱序调用,或者如果结果是不需要。...编译器可能会执行调试信息无法描述优化。这是默认优化级别。调试视图与 –O1 区别在于: 源代码到目标代码映射可能是多,因为可能多个源代码位置映射到目标文件一个点,更激进指令优化。...因为优化会影响目标代码到源代码映射,所以使用 -Ospace -Otime 选择优化级别通常会影响调试视图。 如果需要简单调试视图,选项 -O0 是最好选择。...如果寄存器未声明为C或C++变量,编译器将生成警告 不得在内联程序集代码中保存还原寄存器,编译器会执行此操作。此外,内联汇编程序不提供物理寄存器直接访问。

2.1K40
  • 深入iOS系统底层之程序中汇编代码

    2.预处理 ☞-E 源代码文件 -o 输出文件: 代码进行预处理。也就是将所有#include#import头文件展开、将所有定义展开、将所有枚举值转化为常量值处理。...因为iOS系统支持多种体系结构,所以可以在汇编代码中使用几个来区分代码是x86_64还是arm或者arm64, 就比如下面的代码: //你可以像高级语言一样通过#include引入头文件。...这里面p2align貌似align所表达意义相似,不知道为什么会有两个关键字。 .align 3 .p2align 3 5.定义 汇编语言也可以C语言一样使用定义,来做一些代码复用处理。...定义语法如下: //开始 .macro 名称 //这里面可以编写任何其他汇编代码关键字 // 可以带参数,内使用参数总是从$0开始。...关于函数帧栈信息异常实现原理我会在后续文章中继续介绍。 引用汇编代码文件中符号 因为汇编代码源文件没有所谓.h头文件声明。

    1.7K30

    99%开发者从未听说过堆栈模型(加量增强版)

    你知道如何不写一行汇编代码就能设置栈大小么? 你知道如何在链接脚本中使用和头文件么? 你知道如何在代码中随时随地检查栈最大使用情况么?...【常见堆栈模型】 ---- 从单纯从我不负责任经验来看,由很多GCC领衔使用向生长”模型可能是嵌入式领域最常见”大聪明模型“,没有之一。...这样安排也彻底杜绝了栈“RW/ZI区域”发生入侵可能。当堆溢出时,与栈类似,大部分芯片来说都会触发故障异常,从而在开发调试阶段第一时间被我们所捕获。...问题是,我们要如何在Arm Compiler环境下实现“两面包夹芝士”模型呢?我们需要写汇编代码么? 不用担心,即便你启动文件是汇编,具体操作方法也非常简单。...这意味着,现阶段脚本文件我们实际使用RAM空间是没有任何限制——换句话说,如果超出了芯片实际SRAM大小,编译器也是不会报告错误

    1.9K30

    【反复横跳】从AC5到AC6转型之路(2)——“两面包夹芝士”堆栈模型

    【常见堆栈模型】 ---- 从单纯从我不负责任经验来看,由很多GCC领衔使用向生长”模型可能是嵌入式领域最常见”大聪明模型“,没有之一。...这样安排也彻底杜绝了栈“RW/ZI区域”发生入侵可能。当堆溢出时,与栈类似,大部分芯片来说都会触发故障异常,从而在开发调试阶段第一时间被我们所捕获。...问题是,我们要如何在Arm Compiler环境下实现“两面包夹芝士”模型呢?我们需要写汇编代码么? 不用担心,即便你启动文件是汇编,具体操作方法也非常简单。...这意味着,现阶段脚本文件我们实际使用RAM空间是没有任何限制——换句话说,如果超出了芯片实际SRAM大小,编译器也是不会报告错误。...无论启动文件是否为汇编,都可以正常工作。 实际上,使用链接脚本而非汇编启动文件来两段式堆栈模型进行配置是Arm公司一直以来所提倡

    1.1K20

    深度剖析Linux内核同步机制:实现高效可靠并发编程

    为什么可以这么做呢?对于单线程来说,a b 写入顺序,compiler 认为没有任何问题。并且最终结果也是正确(a == 1 && b == 0)。...它必须忘记它对内存所作任何假设,即使这些假设该函数可能是可见。我们看一下下面的代码片段,printf() 一定是一个外部函数。...每一次循环都会从内存中重新 load run 值。因此,当有其他进程修改 run 值为 0 时候,foo() 可以正常退出循环。为什么加入 barrier() 后汇编代码就是正确呢?...三、原子操作 所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它最小执行单位,不可能有比它更小执行单位,因此这里原子实际是使用了物理学里物质微粒概念。...spin_unlock_wait(x)该用于等待自旋锁x变得没有任何执行单元保持,如果没有任何执行单元保持该自旋锁,该立即返回,否则将循环在那里,直到该自旋锁被保持者释放。

    88720

    Linux内核设备驱动之系统调用笔记整理

    asmlinkage 通知编译器,使用局部堆栈来传递参数 FASTCALL 通知编译器,使用寄存器来传递参数 (4)系统调用号 因为系统调用要从用户空间进入内核空间,所以不可能通过简单函数调用完成,...在x86上,这一特殊机制就是汇编指令int $0x80, 而在arm上,就是汇编指令SWI。...,可以将系统调用定义放置到其功能联系最紧密代码中,如kernel/sys.c,加入: #include /* * return the size of...kernel stack */ asmlinkage long sys_foo(void) { return THREAD_SIZE; } d.在用户空间进行调用 通常,系统调用靠c库支持,glibc不可能支持我们自己系统调用...,此时,需要借助linux本身提供一组系统调用直接进行访问。

    1.9K31

    linux 编译汇编,linux下汇编教程

    Linux汇编行结构 任何汇编行都是如下结构: [:] [} @ comment [:] [} @ 注释 Linux ARM 汇编中,任何以冒号结尾标识符都被认为是一个标号,而不一定非要在一行开始。...Linux汇编程序中定义 格式如下: .macro 名 参数名列表 @伪指令.macro定义一个 体 .endm @.endm表示结束 如果使用参数,那么在体中使用该参数时添加前缀...GNU ARM汇编特殊字符语法 代码行中注释符号: ‘@’ 整行注释符号: ‘#’ 语句分离符号: ‘;’ 直接操作数前缀: ‘#’ 或 ‘$’ 第二部分 GNU编译器调试工具 一....C++源程序生成目标代码中还包括.fini(析构函数代码). init(构造函数代码)等。...gdb5.1.1以后版本加入了ARM处理器支持,在初始化时加入- target==arm参数可直接生成基于ARM平台gdbserver。

    3.5K31

    嵌入式 Arm Linux 入门必读书籍推荐

    对于入门者来说,刚开始不会汇编也没关系,工作影响不大,因为绝大部分场景都用不到。 但是当你技能提高一定层次,掌握了汇编就会让你更能深入系统内部,看清程序运行内部机理。...U-Boot Linux Kernel 中第一段启动代码,基本都是汇编,Cache、MMU 相关控制,也只能通过汇编实现。...因为这本书写作时间比较早,所以没有设计 Cortex-A 系列处理器,但是它任然是一本值得强烈推荐书,因为对于 32 位 Arm 来说,他们架构汇编指令保持了很大延续性,把这本书看懂了,...《ARM系列处理器应用技术完全手册》 这本书是华清远见出,主要内容是 ARM 处理器简介 ARM 汇编程序设计,学习ARM 指令还是很有帮助。...写在最后 这份书单非常长,53 份! 几乎不可能全部读完! 其实你也用不着把他们详细读完!

    7.2K46

    GCC 编译器使用

    本节文档使用 x86 上 gcc 来试验,使用 ARM交叉编译工具链做实验时效果也是类似的。不同交叉编译器工具链前缀可能不同,比如 arm-linux-gcc。...(2)编译 编译就是把 C/C++代码(比如上述“.i”文件)“翻译”成汇编代码,所用到工具为 cc1(它名字就是 cc1,x86 有自己 cc1 命令,ARM 板也有自己 cc1 命令)。...x86 有自己 as 命令,ARM 版也有自己 as 命令,也可能是 xxxxas(比如 arm-linux-as)。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。...GCC 忽略任何不需要汇编输入文件。 (3)-E 预处理后即停止,不进行编译。预处理后代码送往标准输出。 (4)-o file 指定输出文件为 file。...c main.c 执行上述命令后,得到如下警告信息: main.c: In function `main': main.c:6: warning: unused variable `i' 这个警告虽然程序没有影响

    3.8K31

    嵌入式学习书籍推荐

    ARM+Linux嵌入式底层内核驱动方向学习总体路线图 附上ARM学习路径图,希望学习者能有所启发。...指针之外,还要学习模块化编译处理、指针与数组、gcc、 Makefile、GDB、递归、结构体、定义使用等。C语言是整栋嵌入式大厦基础,所以在学习嵌入式时,必须把C语言重视起来,多敲代码,多练。...一 名优秀程序员必定是通过“体力劳动”再转向“脑力劳动”,这也是为什么我们要有“写不出代码=0”思想原因所在。 如果说C语言相当于文字,那么数据结构就相当于在造句、写文章。...嵌入式汇编有别于X86汇编,所以如果以前没有接触过汇编语言,那么没有必要先去学X86汇编再学嵌入式汇编,可以 直接学习嵌入式汇编。除了汇编我们还要学习ARM指令集。...由于Linux内核更新速度很快,书籍视频不可能及时更新,所以我们再看书视频后,要自己动手下载内核源码包,去看内核中代码,在这里可以充分检验 C语言、数据结构等基础知识掌握程度。

    1.7K41

    GCC内嵌汇编

    有的人这种C原因中嵌入汇编不是很熟悉,也不是很了解。今天就带大家了解了解。 为什么会出现这种写法 Linux内核绝大部分代码是用C语言写,而只有一小部分代码是使用内嵌汇编。...这部分代码大多是特定体系结构相关代码性能影响很大代码。GCC提供了内嵌汇编功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。...我们c代码是gcc来处理,当遇到嵌入汇编代码时候,gcc会将这些嵌入式汇编文本送给gas进行后续处理。这样,gcc需要了解嵌入汇编代码寄存器修改情况,否则有可能会造成大麻烦。...例如:gccc代码进行处理,将某些变量值保存在寄存器中,如果嵌入汇编修改了该寄存器值,又没有通知gcc的话,那么,gcc会以为寄存器中仍然保存了之前变量值,因此不会重新加载该变量到寄存器,而是直接使用这个被嵌入式汇编修改寄存器...其中常见就是内存修改通知: 如果一个内联汇编语句指令列表中指令对内存进行了修改,或者在此内联汇编出现地方,内存内容可能发生改变,而被改变内存地址你没有在其Output操作表达式中使用”m”

    3.1K30

    Linux内核学习(二)之head.S文件分析前期准备

    不过这其中可能很多人,虚拟内存页表等知识不是很清楚,没关系,这个不影响我们学习,这个我后面在文章中写到。好了,那就开始今天分享。...一、使用Sourc Insight 来建立一个linux工程: 1、为什么要使用SourceInsight: 对于一个真正一个项目,往往有几十几百甚至上万个c文件、h文件,代码量非常大,代码之间关联非常复杂...譬如这里引用了一个函数但是这个函数可能在另外一个目录下一个文件夹中存放,这样情况下代码查找阅读很困难,我们希望有一个好工具能够帮助。于是乎有了 Source Insight。...,一定要记得保存一下,不然通过最终修改不成功,而且没有保存修改地方。...balignl 16 0xabcdefgh @ 16字节对齐填充 • .equ @ 类似于C中定义 • .end @标识文件结束 • .include @ 头文件包含 • .arm / .code32

    82330

    MIPS架构深入理解11-向MIPS移植软件之编程语言

    MIPS架构移植软件之大小端问题》 *《MIPS架构深入理解9-向MIPS移植软件之Cache管理》 *《MIPS架构深入理解10-向MIPS移植软件之内存序》 中,我们分别讨论了大小端模式、Cache内存序对于移植代码影响...asm()中第3行代码,告诉GCC,操作数%1%2分别是ab,并且允许GCC将其保存到任何通用目的寄存器中。 示例函数最后,就是表明,把结果返回给调用者。...,编译器很可能将映射到内存上寄存器变量usart_sr,视作一个不变变量;而在while循环中也没有存储按位与表达式结果地方,编译器可能会自作主张将其保存到一个临时变量中。...,但是使用上面的方式,没有起到任何作用。...话虽如此,不要想当然认为,堆栈就可以安全移植了。必要时候,使用下面的2个方法-库函数-解决堆栈问题: stdargs: 使用头文件,定义,允许函数接收可变参数。

    1.2K30

    英特尔VS ARM:英特尔为何会在智能手机芯片市场竞争中一败涂地

    英特尔在移动市场败给ARM原因基本上人们认为X86指令架构(ISA)缺陷没有太大关系,或者ARM指令架构性能关系也不大。...我在5年前就做过这方面的阐述—以前是,现在也是正确: 首先,ARM 公司CPU以及NVIDIA性能在未来5年内绝不可能超过英特尔个人电脑和服务器领域中X86系列,而且在未来10年都不太可能。...ARM在这方面的进展被某些专家夸大其词—你不可能略施小计就能将你在移动手机上CPU说成是Core i3,i5甚至是Xeon竞争对手。...这方面不会有任何奇迹,ISA电源消耗是非常高,这是不容忽视ARM多核CPU芯片多核Xeon芯片在计算密集载荷方面有同样性能,也会损耗同样电量。...像Windows这样大型复杂软件平台几乎是专为英特尔指令架构汇编,要重新为其他指令架构重新汇编优化,如ARM基本上是不可能

    3.2K90

    iOS: ARM64不定函数传参问题调试剖析

    目前,主流移动设备CPU主要采用ARM处理器。在做移动客户端开发时,难免遇到需要分析汇编代码情况,牵涉到过程调用部分就必须要了解相应平台ABI。...本文从实际开发中遇到一个平台相关crash问题出发,通过代码对比,研究了在x86-64架构ARM64架构对于不定函数参数传递方式——特别是iOS系统不同之处,同时也解答了为什么在调用带不定参数类型...2.将函数指针强转为与原函数参数列表一致函数指针类型再调用: ARM64架构参数传递符合预期 每段测试代码都只展示了关键函数指针调用语句对应汇编,为便于阅读,关键汇编语句含义已经注释在末尾。....ARM64架构过程调用手册指出:ARM64于变参列表参数传递也不会作特殊处理,根据15条分配原则依次传参,整形指针也应先用寄存器传递 4.苹果iOS ABI函数调用手册指出:iOS相比ARM64...Passing Rules 部分中可以看到参数会依次经过StageC15条规则决定分配,并没有不定参数作特殊处理,既然如此那么参数传递也应如x86-64一样,传递指针会先填满用于传参寄存器后再通过栈传参

    2.4K33

    objc_msgSend底层探索(下)

    就是进入意思,往往就是一个函数开始,我点进去,最直观感受就是,他实现代码量很少,感觉很简单。 这里先插一个问题,为什么objc_msgSend是用汇编?而不是用C/C++写呢?...意思就是判断一下当前消息接收者到底有没有,如果没有消息接收者,那就不用继续下去了,没有意义了,需要先明确就是,整个过程我是模拟person找sayHello,如果不知所云,就请看上一篇文章。...搜到了两个定义,我就看第二个简单,他们是一样,第一个只是多了一些条件判断,那197行代码是什么意思呢?...首先要知道这个PTRSHIFT是什么,同样来全局搜索一下。 有一个定义,就等于3,所以就是左移4位,那为什么cmdmask要左移4位呢?...这个分析过程是非常枯燥乏味,但是一旦从中找到了思路学习方式,成就感也会油然而生,以后应用层开发也会有不小帮助,我就写到这里吧,如若内容有任何错误恳请指出,一起学习,共同成长。

    21820

    嵌入式:ARM符号定义伪操作详解

    文章目录 ARM汇编语言伪操作、指令与伪指令 两种编译模式集成开发环境IDE介绍 ADS/SDT IDE开发环境 集成了GNU开发工具IDE开发环境 ADS编译环境下ARM伪操作和指令 符号定义伪操作...ARM汇编语言源程序中语句一般由指令、伪操作、指令伪指令组成 伪操作是ARM汇编语言程序里一些特殊指令助记符,它作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行...指令是一段独立程序代码,可以插在源程序中,它通过伪操作来定义。在被使用之前必须提前定义好,之间可以互相调用,也可以自己递归调用。通过直接书写名来使用,并根据指令格式设置相应输入参数。...定义本身不会产生代码,只是在调用它时把体插入到源程序中。...伪指令也是ARM汇编语言程序里特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适机器指令代替成ARM或Thumb指令,从而实现真正指令操作。

    54820
    领券