LV01-04-ARM汇编-03-大小端与位操作
本文主要是大小端和位操作的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
Win32DiskImager | Win32DiskImager v1.0 |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.nxp.com.cn/ | NXP官方网站 | |
https://www.nxpic.org.cn/ | NXP 官方社区 | |
https://u-boot.readthedocs.io/en/latest/ | u-boot官网 | |
https://www.kernel.org/ | linux内核官网 |
点击查看相关文件下载
分类 | 网址 | 说明 |
NXP | https://github.com/nxp-imx | NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库 |
https://elixir.bootlin.com/linux/latest/source | 在线阅读linux kernel源码 | |
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
I.MX6ULL | i.MX 6ULL Applications Processors for Industrial Products | I.MX6ULL 芯片手册(datasheet,可以在线查看) |
i.MX 6ULL Applications ProcessorReference Manual | I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网) | |
ARM | Cortex-A7 MPCore Technical Reference Manual | Cortex-A7 MPCore技术参考手册 |
ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition | ARM架构参考手册ARMv7-A和ARMv7-R版 | |
Arm Generic Interrupt Controller Architecture Specification- version 3 and version 4 | Arm通用中断控制器架构规范-版本3和版本4 | |
ARM Generic Interrupt Controller Architecture Specification - Version 2.0 | Arm通用中断控制器架构规范-版本2.0 | |
ARM Cortex-A Series Programmer's Guide for ARMv7-A | Cortex-A系列ARMv7-A编程指南 |
一、大小端
大端模式( Big-endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中 。
小端模式( Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 。
比如: 0x12345678,在大/小端模式的存储位置如下:
1 | 内存地址 大端模式 小端模式 |
二、位操作
1. 移位
1 | int a = 0x6; // 二进制是 0b0110 |
第 2 行,对 a 左移一位,从 0b0110→0b1100,即 b=0xC
第 3 行,对 a 右移一位,从 0b0110→0b0011,即 b=0x3
2. 取反
1 | int a = 0x6; // 二进制是 0b0110 |
第 2 行,对 a 按位取反,从 0b0110→0b1001,即 b=0x9
3. 位与
只有对应的两个二进位都为 1 时,结果位才为 1 ,例如
1 | int a = 0x6; // 二进制是 0b0110 |
第 4 行, a&b,二进制是 0b0110,即 c=0x6
4. 位或
只要对应的二个二进位有一个为 1 时,结果位就为 1 ,例如
1 | int a = 0x6; // 二进制是 0b0110 |
第 4 行, a|b,二进制是 0b0111,即 c=0x7
5. 置位
将某一位置1,例如
1 | int a = 0x6; // 二进制是 0b0110 |
第 3 行,将变量 a 的 bit3 置 1。 1<<3 = 0b1000,然后 0b1000|0b0110=0b1110,即 a=0xe
6. 清位
将某一位清0,例如
1 | int a = 0x6; // 二进制是 0b0110 |
第 3 行,将变量 a 的 bit2 清位。 ~(1<<2) = 0b1011,然后 0b1011&0b0110=0b0010,即 a=0x2