ARM汇编

本文介绍了ARM模拟器VisUAL的基本功能,探讨了栈的四种操作方式,包括满/空栈、增/减栈,以及ARM指令集中的位操作、比较、分支和跳转。还讲解了不同进制之间的转换和字节序的概念,以及如何在KEIL和GCC环境下进行预处理、编译和反汇编操作。
摘要由CSDN通过智能技术生成

ARM UAL模拟器VisUAL

在这里插入图片描述
VisUAL模拟的ARM板子如图,它没有模拟外设,仅仅模拟了CPU、ROM、RAM。
红色区域不能读不能写,只能运行其中的程序。
RAM可读可写。

栈的4种方式

根据栈指针指向,可分为满(Full)/空(Empty)

  • 满SP指向最后一个入栈的地址,需要先修改SP再入栈
  • 空SP指向下一个位置,先入栈再修改SP

根据压栈时SP的增长方向,可分为增/减:

  • 增:SP变大
  • 减:SP减小

组合就有四种方式:

  • 满增
  • 满减
  • 空增
  • 空减

常用的是满减
入栈时用STMDB,也可以用STMFD
出栈是用STMIA,也可以用LDMFD

在这里插入图片描述

压栈就是先减后存,出栈就是先读后增

MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

位操作
AND R1,R2,#(1<<4)
BIC R1,R2,#(1<<4)
ORR R1,R2,R3

比较
CMP R0,R1;比较R0-R1的结果
CMP R0,#0x12
在这里插入图片描述
在这里插入图片描述

分支/跳转指令

  • B:Branch,跳转。
  • BL:Branch With Link,跳转前先把返回地址保存在LR寄存器中。
  • BX/BLX:根据跳转地址的BIT0切换为ARM状态或Thumb状态(0:ARM状态,1:Thumb状态)

ADR PC,LR

进制

在这里插入图片描述
几进制就逢几进一

10进制里,每一位的权重,从右往左数:个十百千万,也就是:10^0, 10^1, 102,103……
16进制里,每一位的权重,从右往左数,分别是:16^0, 16^1, 16^2, 16^3, 16^4, ……
8进制里,每一位的权重,从右往左数,分别是:8^0, 8^1, 8^2, 8^3, 8^4, ……
2进制里,每一位的权重,从右往左数,分别是:2^0, 2^1, 2^2, 2^3, 2^4, ……

10进制,逢10进1,16 = 110^1 +610^0 = 16
16进制:逢16进1, 0x10 = 116^1 + 016^0 = 16
8进制: 逢8进1, 020 = 28^1 + 08^0 = 16
2进制: 逢2进1, 0b10000 = 12^4 + 02^3 + 02^2 + 02^1 +0*2^0 = 16

它们表示的值是一样的。

在代码里,
10进制这样写:123456789,每位最大值为9
16进制这样写:0x12ABCDEF, 每位最大值为15,
A表示10,B表示11,C表示12,D表示13,E表示14,F表示15
8进制这样写:01234,每位最大值为7
2进制这样写:0b0110,每位最大值为1 (注意:C语言没有二进制数值的表示方法)

硬件上用多个晶体管表示数据,晶体管只有2个状态,0和1。——二进制
后续为了简便,使用八进制和十六进制表示。

在C语言中表示:

  • 二进制前面加0b(程序里没有)
  • 八进制前面加0
  • 十六进制前面加0x

字节序

假设int a = 0x12345678;
16进制数中每位数值占据4 bit;在内存中,是以8个bit作为1byte。
因此0x12345678中每两位作为1byte, 其中0x78是低byte,0x12是高byte。

在内存中的存储方式有两种:
在这里插入图片描述
0x12345678的低位(0x78)存在低地址,即方式1,叫做小字节序(little endian)。
0x12345678的低位(0x78)存在低地址,即方式2,叫做大字节序(big endian)。

一般ARM芯片都是小字节序,有些处理器,可以设置某个寄存器,让整个系统使用大字节序或小字节序。

位操作

嵌入式开发中,只涉及逻辑移位,不关心符号位,都是补0。

算术移位,需要分有符号型值和无符号型值:

  • 对于无符号型值,算术移位等同于逻辑移位。
  • 对于有符号型值 ,算术左移等同于逻辑左移;算术右移补的是符号位,正数补0,负数补1。

程序处理的4个步骤

在这里插入图片描述

  1. 预处理
  2. 编译
  3. 汇编:把汇编文件转换成目标文件(里面是机器码)
  4. 反汇编:把可执行文件(目标文件,机器码)转换成汇编文件。

KEIL下如何生成反汇编

在KEIL的User选项中,如下图添加这两项:

fromelf  --bin  --output=led.bin  Objects\led_c.axf
fromelf  --text  -a -c  --output=led.dis  Objects\led_c.axf

在这里插入图片描述
然后重新编译,就会得到二进制文件led.bin,反汇编文件led.dis。

在这里插入图片描述

GCC下反汇编

使用GCC工具链编译程序时,在Makefile中有这一句:

$(OBJDUMP) -D -m arm  led.elf  > led.dis	# OBJDUMP = arm-linux-gnueabihf-objdump

它就是把可执行程序led.elf,反汇编,得到led.dis。

SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令的执行。 SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt-ARM-3.0 SimIt-ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2 cd SimIt-ARM-3.0-gk ./configure make make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c /* * hello.c * Tue Sep 8 10:13:40 CST 2015 */ int main() { printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); } [root@ORA9 gcc-asm]# arm-linux-gcc -v Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM, vers
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值