Python微信订餐小程序课程视频
https://blog.youkuaiyun.com/m0_56069948/article/details/122285951
Python实战量化交易理财系统
https://blog.youkuaiyun.com/m0_56069948/article/details/122285941
本篇关键词:指令格式、条件域、类型域、操作域、数据指令、访存指令、跳转指令、SVC(软件中断)
内核汇编相关篇为:
- v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的
- v75.03 鸿蒙内核源码分析(汇编基础) | CPU上班也要打卡
- v76.04 鸿蒙内核源码分析(汇编传参) | 如何传递复杂的参数
- v77.01 鸿蒙内核源码分析(可变参数) | 正在制作中 …
- v78.01 鸿蒙内核源码分析(开机启动) | 正在制作中 …
- v79.01 鸿蒙内核源码分析(进程切换) | 正在制作中 …
- v80.03 鸿蒙内核源码分析(任务切换) | 看汇编如何切换任务
- v81.05 鸿蒙内核源码分析(中断切换) | 系统因中断活力四射
- v82.06 鸿蒙内核源码分析(异常接管) | 社会很单纯 复杂的是人
- v83.01 鸿蒙内核源码分析(缺页中断) | 正在制作中 …
本篇说清楚 ARM指令是如何被编码的,机器指令由哪些部分构成,指令有哪些类型,每种类型的语法又是怎样的 ?
代码案例 | C -> 汇编 -> 机器指令
看一段C语言编译(clang)成的最后的机器指令(armv7)
int main(){
int a = 0;
if( a != 1)
a = 2*a + 1;
return a;
}
生成汇编代码如下:
main:
60c: sub sp, sp, #8
610: mov r0, #0
614: str r0, [sp, #4]
618: str r0, [sp]
61c: ldr r0, [sp]
620: cmp r0, #1
624: beq 640 0x34>
628: b 62c 0x20>
62c: ldr r1, [sp]
630: mov r0, #1
634: orr r0, r0, r1, lsl #1
638: str r0, [sp]
63c: b 640 0x34>
640: ldr r0, [sp]
644: add sp, sp, #8
648: bx lr
汇编代码对应的机器指令如下图所示:

便于后续分析,将以上代码整理成如下表格
| 汇编代码 | 机器指令(十六进制表示) | 机器指令(二进制表示) |
|---|---|---|
| sub sp, sp, #8 | e24dd008 | 1110 0010 0100 1101 1101 0000 0000 1000 |
| mov r0, #0 | e3a00000 | 1110 0011 1010 0000 0000 0000 0000 0000 |
| str r0, [sp, #4] | e58d0004 | 1110 0101 1000 1101 0000 0000 0000 0100 |
| str r0, [sp] | e58d0000 | 1110 0101 1000 1101 0000 0000 0000 0000 |
| ldr r0, [sp] | e59d0000 | 1110 0101 1001 1101 0000 0000 0000 0000 |
| cmp r0, #1 | e3500001 | 1110 0011 0101 0000 0000 0000 0000 0001 |
| beq 640 | 0a000005 | 0000 1010 0000 0000 0000 0000 0000 0101 |
| b 62c | eaffffff | 1110 1010 1111 1111 1111 1111 1111 1111 |
| ldr r1, [sp] | e59d1000 | 1110 0101 1001 1101 0001 0000 0000 0010 |
| mov r0, #1 | e3a00002 | 1110 0011 1010 0000 0000 0000 0000 0001 |
| orr r0, r0, r1, lsl #1 | e1800081 | 1110 0001 1000 0000 0000 0000 1000 0001 |
| str r0, [sp] | e58d0000 | 1110 0101 1000 1101 0000 0000 0000 0000 |
| b 640 | eaffffff | 1110 1010 1111 1111 1111 1111 1111 1111 |
| ldr r0, [sp] | e59d1000 | 1110 0101 1001 1101 0001 0000 0000 0000 |
| add sp, sp, #8 | e28dd008 | 1110 0010 1000 1 |

本文深入探讨了鸿蒙内核中的机器指令编码,包括指令格式、条件域、CPSR寄存器及其作用。通过C->汇编->机器指令的转换案例,解释了指令的组成部分和不同类型的指令。文章还提到了鸿蒙内核源码分析系列的其他篇章,涉及汇编基础、参数传递和中断处理等主题。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



