Lab2 ARM指令

实际连接示意图

仅一台macbook pro

所用器材列表

macbook一台

各项测试情况

  1. 生成了Thumb指令还是ARM指令
    • C代码
    • 通过编译参数改成,使得其编译成ARM指令或thumb指令

      默认为ARM指令


      加上参数-mthumb编译为thumb指令
    • 汇编代码情况

      用arm-linux-gnueabi-objdump –d 命令查看汇编码

      ARM


      thumb


      对比上述汇编可知,ARM和Thumb编译的结果最大的不同是32位与16位的区别,且Thumb的指令数比ARM多,但整体上,ARM汇编结果比Thumb的大(ls –l的结果如下)
  2. 对于ARM指令,能否产生条件执行的指令
    • C代码
    • ARM指令


      观察8454的ble可知,能产生条件执行的指令。
  3. 设计C的代码场景,观察是否产生了寄存器移位寻址
    • C代码
    • 在编译参数中加入-O开启优化:
    • ARM指令


      观察84a4可知,产生了寄存器移位寻址。
  4. 设计C的代码场景,观察一个复杂的32位数是如何装载到寄存器的
    • C代码
    • ARM指令


      观察可知,32位数先被存在了8460处,然后用ldr指令将之装入寄存器r3
  5. 写一个C的多重函数调用的函数,观察并分析
    • C代码
    • ARM指令



      观察和分析可知:

      a) 调用时的返回地址在lr链接寄存器中,在执行bl指令时,会自动将下一条指令地址传入lr寄存器。

      b) 传入的参数在r0和r1中。

      c) 在函数堆栈中,本地变量存在返回地址和fp之后。

      d) r0-r3是caller保存而r4是callee保存。
  6. 尝试写C的表达式来编译得到MLA指令
    • C代码
    • ARM指令(编译参数加上-O)


      在84ac处出现了mla。
  7. 尝试写C的表达式来编译得到BIC指令
    • C代码
    • ARM指令(编译参数加上-O)


      在84a0处出现了bic指令。
  8. 编写一个汇编函数,接受一个整数和一个指针做为输入,指针所指应为一个字符串,该汇编函数调用C语言的 printf()函数输出这个字符串的前n个字符,n即为那个整数。在C语言写的main()函数中调用并传递参数给这个汇编函数 来得到输出。
    • 代码如下(用“puts”输出字符串)