arm-linux 汇编学习

本文介绍ARM-Linux汇编的基础知识,包括关键指令的使用及如何通过汇编进行芯片初始化。文中详细解析了一段关闭看门狗并设置堆栈以调用C程序main函数的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

arm-linux 汇编学习第一课

在学习arm的时候,总是绕不开汇编,汇编一般用来写一些与芯片初始化相关的代码,而最简单的如下所示:

.text
.global _start
_start:
        ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
        mov     r1, #0x0                     
        str     r1, [r0]            
        ldr     sp, =1024*4         @ 设置堆栈
        bl      main                @ 调用C程序中的main函数
halt_loop:
        b       halt_loop

现在我们来分析一些代码:
第一行的.text:.text是arm-linux编译器的一个关键字,表示后续编译出来的内容放在代码段,是可执行的;

第二行的.global:.global同样是一个关键字,告诉编译器关键字后面的是一个全局可见的变量、函数名、地址。编译后存放在全局符合表中,供其它程序寻找如加载器。

第三行:_start表示一个地址

第四、五、六是关闭芯片的看门狗(此芯片是S3C2440),如果不关闭芯片看门狗,不在规定的时间内喂狗,芯片是会不断的重启的

第七行是栈的初始化,以便后面可以调用C函数main

第八行是调用main函数

后面两行是不断循环在最后

学习ARM汇编指令的经典资料。 对ARM的各种汇编指令进行了深入全面的讲解,并给出了各种示例和详细注解,并且还对一些值得注意的点或是容易犯错误的地方进行了总结。 目录 前言................................................................................................................................................................i 目录................................................................................................................................................................I ARM7TDMI(-S)指令集及汇编....................................................................................................................1 ARM处理器寻址方式..........................................................................................................................2 寄存器寻址....................................................................................................................................2 立即寻址........................................................................................................................................2 寄存器偏移寻址............................................................................................................................2 寄存器间接寻址............................................................................................................................3 基址寻址........................................................................................................................................3 多寄存器寻址................................................................................................................................4 堆栈寻址........................................................................................................................................4 块拷贝寻址....................................................................................................................................5 相对寻址........................................................................................................................................5 指令集介绍............................................................................................................................................7 ARM指令集..................................................................................................................................7 指令格式................................................................................................................................7 第2个操作数................................................................................................................7 #immed_8r...........................................................................................................7 Rm..........................................................................................................................8 Rm,shift..................................................................................................................8 条件码............................................................................................................................9 ARM存储器访问指令........................................................................................................11   LDR和STR........................................................................................................11   LDM和STM.......................................................................................................14   SWP.....................................................................................................................17 ARM数据处理指令............................................................................................................19 数据传送指令..............................................................................................................20   MOV............................................................................................................20   MVN............................................................................................................20 算术逻辑运算指令......................................................................................................20   ADD.............................................................................................................20   SUB..............................................................................................................21   RSB..............................................................................................................21   ADC.............................................................................................................21   SBC..............................................................................................................21   RSC..............................................................................................................22   AND.............................................................................................................22   ORR..............................................................................................................22   EOR..............................................................................................................22   BIC...............................................................................................................23 比较指令......................................................................................................................23   CMP.............................................................................................................23   CMN.............................................................................................................23   TST...............................................................................................................24   TEQ..............................................................................................................24 乘法指令......................................................................................................................25   MUL.............................................................................................................25   MLA.............................................................................................................25   UMULL........................................................................................................25   UMLAL........................................................................................................26   SMULL........................................................................................................26   SMLAL........................................................................................................26 ARM跳转指令....................................................................................................................27   B...........................................................................................................................27   BL.........................................................................................................................27   BX........................................................................................................................27 ARM协处理器指令............................................................................................................28   CDP......................................................................................................................28   LDC......................................................................................................................29   STC......................................................................................................................29   MCR.....................................................................................................................30   MRC.....................................................................................................................30 ARM杂项指令....................................................................................................................31   SWI......................................................................................................................31   MRS.....................................................................................................................32   MSR.....................................................................................................................33 ARM伪指令........................................................................................................................34   ADR.....................................................................................................................35   ADRL...................................................................................................................35   LDR......................................................................................................................36   NOP......................................................................................................................37 Thumb指令集.............................................................................................................................39 Thumb指令集与ARM指令集的区别..............................................................................39 Thumb存储器访问指令.....................................................................................................40   LDR和STR........................................................................................................41   PUSH和POP......................................................................................................43   LDMIA和STMIA..............................................................................................43 Thumb数据处理指令.........................................................................................................45 数据传送指令..............................................................................................................46   MOV............................................................................................................46   MVN............................................................................................................46   NEG..............................................................................................................47 算术逻辑运算指令......................................................................................................47   ADD.............................................................................................................47   SUB..............................................................................................................48   ADC.............................................................................................................49   SBC..............................................................................................................49   MUL.............................................................................................................50   AND.............................................................................................................50   ORR..............................................................................................................50   EOR..............................................................................................................51   BIC...............................................................................................................51   ASR..............................................................................................................51   LSL...............................................................................................................52   LSR..............................................................................................................52   ROR..............................................................................................................53 比较指令......................................................................................................................53   CMP.............................................................................................................53   CMN.............................................................................................................54   TST...............................................................................................................54 Thumb跳转指令.........................................................................................................55   B...................................................................................................................55   BL.................................................................................................................55   BX................................................................................................................55 Thumb杂项指令.........................................................................................................56   SWI..............................................................................................................56 Thumb伪指令.............................................................................................................57   ADR.............................................................................................................57   LDR..............................................................................................................57   NOP..............................................................................................................58 伪指令..................................................................................................................................................59 符号定义伪指令..........................................................................................................................59   GBLA、GBLL、GBLS..............................................................................................59   LCLA、LCLL、LCLS................................................................................................60   SETA、SETL、SETS.................................................................................................61   RLIST...........................................................................................................................61   CN................................................................................................................................62   CP.................................................................................................................................62   DN、SN.......................................................................................................................62   FN.................................................................................................................................63 数据定义伪指令..........................................................................................................................63   LTORG.........................................................................................................................64   MAP.............................................................................................................................64   FIELD..........................................................................................................................65   SPACE..........................................................................................................................66   DCB.............................................................................................................................66   DCD和DCDU............................................................................................................67   DCDO..........................................................................................................................67   DCFD和DCFDU........................................................................................................68   DCFS和DCFSU.........................................................................................................68   DCI...............................................................................................................................69   DCQ和DCQU............................................................................................................69   DCW和DCWU..........................................................................................................70 报告伪指令..................................................................................................................................70   ASSERT.......................................................................................................................70   INFO............................................................................................................................71   OPT..............................................................................................................................71   TTL和SUBT..............................................................................................................72 汇编控制伪指令..........................................................................................................................73   IF、ELSE和ENDIF...................................................................................................73   MACRO和MEND.....................................................................................................74   WHIL和WEND.........................................................................................................75 杂项伪指令..................................................................................................................................76   ALIGN.........................................................................................................................77   AREA...........................................................................................................................78   CODE16和CODE32..................................................................................................79   END.............................................................................................................................80   ENTRY.........................................................................................................................80   EQU.............................................................................................................................81   EXPORT和GLOBAL................................................................................................81   IMPORT和EXTERN.................................................................................................82   GET和INCLUDE......................................................................................................83   INCBIN........................................................................................................................83   KEEP............................................................................................................................83   NOFP...........................................................................................................................84   REQUIRE....................................................................................................................84   PEQUIRE8和PRESERVE8.......................................................................................84   RN................................................................................................................................84   ROUT...........................................................................................................................85 ARM伪指令................................................................................................................................86   ADR.............................................................................................................................86   ADRL...........................................................................................................................86   LDR..............................................................................................................................86   NOP..............................................................................................................................86   LDFD...........................................................................................................................86   LDFS............................................................................................................................87 Thumb伪指令.............................................................................................................................87   ADR.............................................................................................................................87   LDR..............................................................................................................................87   NOP..............................................................................................................................88 ARM汇编程序设计............................................................................................................................88 文件格式......................................................................................................................................88 ARM汇编的一些规范................................................................................................................88 汇编语句格式......................................................................................................................88 标号......................................................................................................................................89   基于PC的标号...................................................................................................89   基于寄存器的标号..............................................................................................90   绝对地址..............................................................................................................90 局部标号..............................................................................................................................90 符号......................................................................................................................................91 常量......................................................................................................................................91   数字常数..............................................................................................................91   字符常量..............................................................................................................92   布尔常量..............................................................................................................92 段定义..................................................................................................................................92 宏定义及其作用..................................................................................................................93 子程序的调用..............................................................................................................................94 数据比较跳转..............................................................................................................................95 循环..............................................................................................................................................95 数据块复制..................................................................................................................................95 栈操作..........................................................................................................................................96 特殊寄存器定义及应用..............................................................................................................96 散转功能......................................................................................................................................97 查表操作......................................................................................................................................97 长跳转..........................................................................................................................................97 对信号量的支持..........................................................................................................................98 伪指令使用..................................................................................................................................98 一个完整的例子..........................................................................................................................98 外围部件控制..............................................................................................................................99 三级流水线介绍..........................................................................................................................99 C与汇编混合编程............................................................................................................................100 内嵌汇编....................................................................................................................................100 内嵌汇编的指令用法........................................................................................................103 内嵌汇编器与armasm汇编器的差异.............................................................................104 内嵌汇编注意事项............................................................................................................104 访问全局变量............................................................................................................................106 C与汇编相互调用....................................................................................................................107 寄存器的使用规则............................................................................................................108 堆栈使用规则....................................................................................................................108 参数传递规则....................................................................................................................109 C程序调用汇编程序........................................................................................................110 汇编程序调用C程序.......................................................................................................111 ARM指令集列表..............................................................................................................................113 ARM存储器访问指令表列表..................................................................................................113 ARM数据处理指令列表..........................................................................................................114 ARM乘法指令列表..................................................................................................................115 ARM跳转指令列表..................................................................................................................116 ARM协处理器指令列表..........................................................................................................117 ARM杂项指令列表..................................................................................................................118 ARM伪指令列表......................................................................................................................119 Thumb指令集列表...........................................................................................................................120 Thumb存储器访问指令列表...................................................................................................120 Thumb数据处理指令列表.......................................................................................................121 Thumb跳转指令及软中断指令列表.......................................................................................122 Thumb伪指令列表...................................................................................................................123 汇编预定义变量及伪指令................................................................................................................124 预定义的寄存器和协处理器名................................................................................................124 通用寄存器........................................................................................................................124 程序状态寄存器................................................................................................................124 浮点数寄存器....................................................................................................................124 协处理器及协处理器寄存器............................................................................................125 内置变量列表............................................................................................................................125 伪指令列表................................................................................................................................126 指令条件码列表........................................................................................................................128 CPSR和SPSR分配图.............................................................................................................................129
<think>根据您提供的`ls`输出,可以看到在`/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin`目录下确实存在`arm-linux-gnueabihf-gcc`等工具链程序。因此,问题可能出在环境变量加载或者权限上。 ### 解决方案步骤 #### 1. 检查环境变量是否在当前会话生效 虽然您已经将工具链路径添加到`/etc/profile`中,但可能没有重新加载该文件。请执行: ```bash source /etc/profile ``` 然后再次尝试运行命令: ```bash arm-linux-gnueabihf-gcc --version ``` #### 2. 检查工具链的权限 使用`ls -l`检查工具链文件的权限: ```bash ls -l /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc ``` 如果缺少执行权限(`x`),则使用以下命令添加: ```bash sudo chmod +x /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-* ``` #### 3. 检查32位库依赖(重要) 在64位系统上运行32位工具链程序需要安装32位兼容库。执行以下命令安装: ```bash sudo apt-get update sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6 ``` #### 4. 验证工具链是否可运行 使用完整路径运行编译器: ```bash /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --version ``` 如果出现类似以下输出,则说明工具链本身正常: ``` arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4 Copyright (C) 2015 Free Software Foundation, Inc. ... ``` #### 5. 创建符号链接(可选) 如果上述步骤都正常,但使用命令时仍报错,可以尝试在`/usr/local/bin`中创建符号链接: ```bash sudo ln -s /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/local/bin/ ``` 然后测试: ```bash arm-linux-gnueabihf-gcc --version ``` ### 自动化检测脚本 以下脚本可以自动检测并修复常见问题: ```bash #!/bin/bash # 定义工具链路径和编译器 TOOLCHAIN_DIR="/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin" COMPILER_PATH="$TOOLCHAIN_DIR/arm-linux-gnueabihf-gcc" # 检查编译器是否存在 if [ ! -f "$COMPILER_PATH" ]; then echo "错误: 编译器未找到: $COMPILER_PATH" exit 1 fi # 检查权限 if [ ! -x "$COMPILER_PATH" ]; then echo "修复权限: $COMPILER_PATH" sudo chmod +x "$COMPILER_PATH" fi # 检查32位库依赖 echo "检查32位依赖库..." ldd "$COMPILER_PATH" | grep "not found" > /dev/null if [ $? -eq 0 ]; then echo "发现缺失的32位库,正在安装..." sudo apt-get update sudo apt-get install -y lib32z1 lib32ncurses5 lib32stdc++6 fi # 验证编译器 echo "测试编译器..." "$COMPILER_PATH" --version > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "成功: 编译器工作正常。" exit 0 else echo "错误: 编译器无法运行。" echo "尝试手动运行: $COMPILER_PATH --version" exit 1 fi ``` ### 使用说明 1. 将上述脚本保存为`fix_toolchain.sh` 2. 赋予执行权限:`chmod +x fix_toolchain.sh` 3. 运行脚本:`./fix_toolchain.sh` ### 编译示例 成功修复后,编译您的汇编文件: ```bash cd ~/linux/1_leds arm-linux-gnueabihf-gcc -g -c led.s -o led.o ``` §§相关问题§§: 1. 如何为不同的ARM架构(如Cortex-A, Cortex-M)选择正确的工具链? 2. 在Linux中,如何永久添加环境变量到用户配置文件中? 3. 交叉编译时如何处理目标系统的动态链接库? 4. 如何编写一个Makefile来支持交叉编译?</think>根据您列出的工具链目录内容,可以看到交叉编译工具链已正确安装。现在我们将解决之前遇到的权限和命令找不到问题,并提供完整的交叉编译流程。 ### 完整解决方案 #### 1. 修复权限问题(关键步骤) ```bash # 修复工具链权限 sudo chmod -R 755 /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf # 修复工作目录权限(替换k1为您的用户名) sudo chown -R k1:k1 ~/linux chmod 755 ~/linux/1_leds ``` #### 2. 验证工具链可执行性 ```bash # 直接运行编译器(使用完整路径) /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --version # 如果显示版本信息,说明工具链本身正常 # 如果报错,可能是缺少32位库 ``` #### 3. 安装必要的32位兼容库 ```bash sudo apt-get update sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 zlib1g:i386 ``` #### 4. 创建别名简化命令(可选) ```bash # 添加到 ~/.bashrc echo "alias arm-gcc='/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc'" >> ~/.bashrc source ~/.bashrc # 现在可以使用简化命令 arm-gcc --version ``` ### 完整的交叉编译示例 #### 示例汇编代码 (led.s) ```assembly /* led.s - 简单的ARM汇编LED控制示例 */ .global main main: MOV R0, #1 @ 设置GPIO输出值 BX LR @ 返回 ``` #### 编译步骤 ```bash cd ~/linux/1_leds # 1. 汇编 arm-linux-gnueabihf-gcc -g -c led.s -o led.o # 2. 链接 arm-linux-gnueabihf-gcc -nostdlib -o led led.o # 3. 检查生成的文件 file led # 应该输出: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped ``` ### 自动化编译脚本 ```bash #!/bin/bash # build_arm.sh - ARM交叉编译脚本 TOOLCHAIN_PATH="/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin" CC="${TOOLCHAIN_PATH}/arm-linux-gnueabihf-gcc" OUTPUT="led" echo "正在编译ARM程序..." $CC -g -c led.s -o led.o if [ $? -ne 0 ]; then echo "汇编失败!" exit 1 fi $CC -nostdlib -o $OUTPUT led.o if [ $? -ne 0 ]; then echo "链接失败!" exit 1 fi echo "编译成功! 输出文件: $OUTPUT" file $OUTPUT ``` ### 使用说明 1. 将上述脚本保存为 `build_arm.sh` 2. 添加执行权限:`chmod +x build_arm.sh` 3. 运行脚本:`./build_arm.sh` ### 交叉编译工作流程总结 1. **环境准备**:安装工具链,设置PATH 2. **权限修复**:确保工具链和工作目录有正确权限 3. **依赖安装**:安装32位兼容库 4. **编译过程**: - 汇编:`arm-linux-gnueabihf-gcc -c file.s -o file.o` - 链接:`arm-linux-gnueabihf-gcc -o executable file.o` 5. **验证**:使用`file`命令检查输出文件类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值