Python微信订餐小程序课程视频
https://blog.csdn.net/m0_56069948/article/details/122285951
Python实战量化交易理财系统
https://blog.csdn.net/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 1101 1101 0000 0000 1000 |
bx lr | e12fff1e | 1110 0001 0010 1111 1111 1111 0001 1110 |
CPSR寄存器
在理解本篇之前需了解下CPSR
寄存器的高4
位[31,28]
表达的含义。关于寄存器的详细介绍可翻看 系列篇的 (寄存器篇)
N、Z、C、V
均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行!意义重大!
CPSR
的第31
位是N
,符号标志位。它记录相关指令执行后,其结果是否为负。