20230818 CHAPTER 4 Controlling Program Flow 程序流程控制
Unconditional Branch
The simplest branch instruction is
B label 无条件分支跳转
有符号数为负则设置N标志,否则clear
结果为0 设置此标志,否则clear
加法中溢出了则设置此标志,减法不需要借也就是结果不为负则设置,移位中保存最后一位移出的值;
加法或减法中 ,有符号数溢出则设置此标志位
这些标志位存在一个NZCV系统寄存器中,只允许特权访问
只有在指令的后追加S才会设置标志位,除了“比较”命令
B.{condition} label 按条件分支
CMP Xn, Operand2 比较,等同于 SUBS XZR, Xn, Operand2;cmp命令自动set flag;
按位与 异或 或 按位清零
bic 清零xs的位 ,由操作数2中位为1的位指定
48 = 0
65 = A
97 = a
单个ascii字符 char 用单引号''括起来,多个字符的字符串用"" 双引号括起来
下面是一个程序打印寄存器里的hex值,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // // a program to print a register in hex // .global _start _start: ldr x0,=hexbase ldr x1,=hexstr mov x2, 0xabcd movk x2, 0x1234 ,lsl 16 movk x2, 0x5678 ,lsl 32 movk x2, 0x09ef ,lsl 48 add x1,x1, 17 //point to the last char loop: and x3,x2, 0xf //get 4 bits ldrb w4,[x0,x3] //get the char from hexbase strb w4,[x1] //write to hexstr sub x1,x1, 1 //prepare next write lsr x2,x2, 4 //x2 shit right 4bits to prepare next loop cmp x2, 0 b.eq cout //break loop if x2=0 b loop cout: mov x0, 1 //stdout ldr x1,=hexstr //str to print mov x2, 19 // count to print mov x8, 64 // linux write system call svc 0 mov x0, 0 mov x8, 93 //return 0 svc 0 .data hexbase: .ascii "0123456789abcdef\n" hexstr: .ascii "0x0000000000000000\n" |
hexbase是16进制字符表,hexstr保存hex字符串
这个程序我自己写的,跟书上的不一样,我好nb!
3级流水机制,实现每一个时钟周期一条指令,跳转会用3个时钟周期,现代armCPU的分支预测机制跟降低跳转的延迟,程序应该少用跳转,不仅效率的考虑,分支太多让程序难以理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)