我们先来看下,如果在C代码中两个定义如下,一个数组和一个结构体。

在32位ARM汇编中的定义如下:

| ```html .data .balign 4 a: .skip 400 .balign 4 b: .skip 8

| -------------------------------------------------------------- |结构体my_struct实际是5个字节,但是这里定义了8个自己,因为是4字节对齐的,多出的3个自己就是Padding,填充用。      我们看个完整的例子。## 示例填充数组ARM32为例。复制代码

.data

.balign 4 a: .skip 400 .balign 4 b: .skip 8 .text

.global main main: ldr r1, addr_of_a /* r1 ← &a / mov r2, #0 / r2 ← 0 / loop: cmp r2, #100 / 检查索引是否达到100了*/ beq end /* 到达100则结束*/ add r3, r1, r2, LSL #2 /* r3 ← r1 + (r24) ,获取数组中各项地址/ str r2, [r3] /* r3 ← r2 ,将索引复制给数组各项/ add r2, r2, #1 /* r2 ← r2 + 1 ,索引自加1*/ b loop /* 循环开始处*/ end: bx lr addr_of_a: .word a

as -g -o array.o array.sgcc -o array array.o上面这段代码完成了如下C代码片段:for (i = 0; i < 100; i++)  a\[i] = i; ## 索引模式上面的模式操作有些过时。在获取数组地址的时候可以使用ARM提供的索引方法。\[Rsource1, +#immediate]或者\\[Rsource1, -#immediate]寄存器方法:\[Rsource1, +Rsource2] 或者\\[Rsource1, -Rsource2]综合的方法:\[Rsource1, +Rsource2, shift_operation #immediate]或者\\[Rsource1, -Rsource2, shift_operation #immediate]| ```htmlstr r2, [r1, #+12]  /* *(r1 + 12) ← r2 */``` || ----------------------------------------------------- |执行前后r1是没有变化的。## 更新索引以上这些的话不会自动更新索引,因为是要循环100次的,每次操作完需要更新索引。\[Rsource1], #+immediate 或者\\[Rsource1], #-immediate循环片段可以改成如下:复制代码

loop: cmp r2, #100 /检查索引是否达到100了/ beq end /到达100则结束 str r2, [r1], #4 / r1 ← r2 then r1 ← r1 + 4 / add r2, r2, #1 / r2 ← r2 + 1 ,自加/ b loop /* Go to the beginning of the loop */ end:

\[Rsource1], +Rsource2或者\\[Rsource1], -Rsource2再或者\[Rsource1], +Rsource2, shift_operation #immediate 或\\[Rsource1], -Rsource2, shift_operation #immediate这些操作是执行后再跟新索引的。## 前更新索引我们看下执行前跟新索引的操作。命令如下,区别是加了一个!号。\[Rsource1, #+immediate]!或\\[Rsource1, #-immediate]!代码小片段如下:| ```htmlldr r2, [r1, #+12]!  /* r1 ← r1 + 12 then r2 ← *r1 */``````htmladd r2, r2, r2       /* r2 ← r2 + r2 */``````htmlstr r2, [r1]         /* *r1 ← r2 */``` || ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |此外还有:\[Rsource1, +Rsource2]! 或\\[Rsource1, +Rsource2]!或者\\[Rsource1, +Rsource2, shift_operation #immediate]!或\\[Rsource1, -Rsource2, shift_operation #immediate]!几个命令的差异卡看上去比较小,主要是注意感叹号和中括号。使用如上这些可以轻松获取的结构体中的某个变量便宜。例如C语法中的:b.f1 = b.f1 + 7;其中b是结构体如下:struct my_struct{<!-- -->  char f0;  int f1;} b;可以通过如下代码片段实现,r1是结构体的基地址:| ```htmlldr r2, [r1, #+4]!  /* r1 ← r1 + 4 then r2 ← *r1 ,跳过f0变量*/ add r2, r2, #7     /* r2 ← r2 + 7 */ str r2, [r1]       /* *r1 ← r2 */``` || --------------------------------------------------------------------------------------------------------------------------------------------- |


©著作权归作者所有:来自51CTO博客作者wx607823dfcf6a9的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 实现文件上下文管理(__enter__和__exit__)
  2. 第4部分- Linux ARM汇编首个程序
  3. 第12部分- Linux ARM汇编 控制指令
  4. 流程控制之if判断
  5. 元组类型内置方法
  6. 给我1万字,也讲不清Java内存排查。1万不行来2万~.~
  7. 想把Java代码写的更漂亮么?了解一下Try吧
  8. 解析Java横死之谜,气定神闲看花开花落
  9. 将java进程转移到“解剖台”之前,法医都干了什么?

随机推荐

  1. android 控件xml属性
  2. Android调试工具 adb
  3. android Linearlayout中有关gravity与lay
  4. 【Arcgis for android】保存地图截图到sd
  5. android 缓存Bitmap
  6. android XML下searchable.xml
  7. Android UI开发第三十三篇——Navigation
  8. [小代码]在Android和PHP之间的加密/解密,
  9. android AudioManager类 详解
  10. android 使用Intent传递数据之剪切板