ARM64 在线仿真器

今天在晚上找到一个简单的ARM64在线仿真器,它非常适合学习ARM64的指令,在教学中应该很好用。网址ARM64 Online Simulatoricon-default.png?t=N7T8http://163.238.35.161/~zhangs/arm64simulator/

它是由康涅狄格州立大学的Shuqun Zhang教授开发的。软件基于Alexandro Sanchez开发的Unicorn CPU emulator framework for JavaScript (https://github.com/AlexAltea/unicorn.js)。这是一个非常有名的轻量级CPU仿真器。

我们使用一个简单的斐波那契数列计算程序进行了测试:

main:
      mov x0, 10
      mov x1, #1
      mov x2, #1
      mov x3, #0
      START:
            cmp x0, x1
            b.gt LOOP
            b.eq END
      LOOP:
            add x4, x2, x3
            mov x3, x2
            mov x2, x4
            add x1, x1, #1
            b START
      END:
            mov x0, x4

这段ARM汇编程序是一个简单的循环计算程序。下面是对每行代码的解释:

  1. mov x0, 10: 将寄存器x0的值设置为10。这通常用作循环计数器。
  2. mov x1, #1: 将立即数1移动到寄存器x1,用作循环的初始值。
  3. mov x2, #1: 将立即数1移动到寄存器x2,用作循环的起始值。
  4. mov x3, #0: 将立即数0移动到寄存器x3,用作循环中的累加器。

接下来是程序的主要部分:

  1. START:: 标签,标记循环开始的地方。

  2. cmp x0, x1: 比较寄存器x0和x1的值。

  3. b.gt LOOP: 如果x0大于x1(即循环计数器x0大于1),则跳转到标签LOOP

  4. b.eq END: 如果x0等于x1,跳转到标签END,结束程序。

  5. LOOP:: 标签,标记循环体开始的地方。

  6. add x4, x2, x3: 将x2和x3的值相加,结果存储在x4中。这是计算斐波那契数列的步骤。

  7. mov x3, x2: 将x2的值移动到x3,为下一次迭代准备前一个斐波那契数。

  8. mov x2, x4: 将x4的值移动到x2,更新当前的斐波那契数。

  9. add x1, x1, #1: 将x1的值增加1,这是循环计数器的更新。

  10. b START: 无条件跳转到START标签,继续循环。

  11. END:: 标签,标记程序结束的地方。

  12. mov x0, x4: 将x4的值移动到x0,这通常是程序的返回值或最终结果。

这个程序计算的是斐波那契数列的第10项(因为初始时x0为10)。斐波那契数列是这样的序列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...,其中每一项都是前两项的和。

运行结果:

  • 初始时x2和x3都是1(斐波那契数列的前两项)。
  • 经过9次循环(因为x0从10递减到1),x4将包含斐波那契数列的第10项的值。

根据斐波那契数列的定义,第10项的值是55。因此,程序运行结束后,寄存器x0将包含值55。

将程序输入到仿真器中,然后运行程序就可以得到正确的结果。

 仿真器的主要功能:

  • 支持64位ARM指令集。4千字节内存(地址范围0x10000 - 0x11000)。
  • 代码段:0x10000 - 0x107FF,数据段:0x10800 - 0x10DFF,栈段:0x10E00 - 0x10FFF
  • 不支持:伪指令(directives),系统调用(SVC)
  • 伪指令 "LDR reg, #imm" 不被支持。您可以使用 "ADR x1, #0x800" (寄存器x1将具有0x10800的值而不是0x00800),然后使用 "LDR/STR x2, [x1]" 来加载/存储数据段中的数据。
  • 您可以通过双击寄存器,并输入新的十六进制值来修改寄存器的值。
  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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、付费专栏及课程。

余额充值