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
2
3
4
5
内存地址 大端模式 小端模式
addr+3 0x78 0x12
addr+2 0x56 0x34
addr+1 0x34 0x56
addr 0x12 0x78

二、位操作

1. 移位

1
2
3
int a = 0x6; // 二进制是 0b0110
int b = a<<1;
int c = a>>1;

第 2 行,对 a 左移一位,从 0b0110→0b1100,即 b=0xC
第 3 行,对 a 右移一位,从 0b0110→0b0011,即 b=0x3

2. 取反

1
2
int a = 0x6; // 二进制是 0b0110
int b = ~a;

第 2 行,对 a 按位取反,从 0b0110→0b1001,即 b=0x9

3. 位与

只有对应的两个二进位都为 1 时,结果位才为 1 ,例如

1
2
3
4
int a = 0x6; // 二进制是 0b0110
int b = 0x7; // 二进制是 0b0111

int c = a&b;

第 4 行, a&b,二进制是 0b0110,即 c=0x6

4. 位或

只要对应的二个二进位有一个为 1 时,结果位就为 1 ,例如

1
2
3
4
int a = 0x6; // 二进制是 0b0110
int b = 0x7; // 二进制是 0b0111

int c = a|b;

第 4 行, a|b,二进制是 0b0111,即 c=0x7

5. 置位

将某一位置1,例如

1
2
3
int a = 0x6; // 二进制是 0b0110

int a |= (1<<3);

第 3 行,将变量 a 的 bit3 置 1。 1<<3 = 0b1000,然后 0b1000|0b0110=0b1110,即 a=0xe

6. 清位

将某一位清0,例如

1
2
3
int a = 0x6; // 二进制是 0b0110

int a &= ~(1<<2);

第 3 行,将变量 a 的 bit2 清位。 ~(1<<2) = 0b1011,然后 0b1011&0b0110=0b0010,即 a=0x2