C语言中的几个重要概念
│a │ │0x0030 │0000000000110000│
│ │ │0x000f │0000000000001111│
├─┴───┼────┼────────┤
│按位或 │ │0000000000111111│
│运算结果 │ │ │
└─────┴────┴────────┘
(3).将某数特定位置翻转
例 a ^ 0x000f使a的低4位翻转(0变1;1变0)。
┌─┬───┬────┬────────┐
│数│ │十六进制│ 补码 │
├─┼───┼────┼────────┤
│a │ │ 0x007a │0000000001111010│
│ │ │ 0x000f │0000000000001111│
├─┴───┼────┼────────┤
│ 按位异或 │ │0000000001110101│
│ 运算结果 │ │ │
└─────┴────┴────────┘
(4)将a的右起第2位反向变化(1变0,0变1)
a=a^0x02;//(0x02=00000010),异或的意义是"同值为0"
(5).将两个数(整型数)的值互换
例 a=a^b;b=b^a;a=a^b; //三步使得a、b的值互换
3.移位运算的特殊用途
(1).将某数除以2(右移1位)
例 a>>2 使得a被4除
①对于 signed a=-8,a>>2
a=-8
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │0 │0 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
├─┬─┐ ──> └───┐
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │1 │1 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
a=-2
②对于unsigned a=248,a>>2
a=248
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │0 │0 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
└───┐ ──> └───┐
┌─┬─┬─┬─┬─┬─┬─┬─┐
│0 │0 │1 │1 │1 │1 │1 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
补0──┴─┘ a=62
(2).将某数乘以2(左移1位)
注 左移时signed 与unsigned变量的情况一样,均要补0。
(3)将x的'右起第n(n>=0)位置0
x&=~(1《n); 若x是long,则x&=~((long)1《n);
(4)将x的右起第n(n>=0)位置1
x|=1《n;
若x是长整形数则 x|=(long)1《n;
五、C语言访问CPU寄存器的方法
1.使用联合REGS,和函数 int86() / int86x() / intr()
REGS是用来在进行 DOS软中断调用时向各个寄存器传输数据或从各个寄存器取出返回值。
union REGS 示意图
struct struct
WORDREGS BYTEREGS
┌ ┌───────┬──────┐──┬── ┐
│ │ │ al │ 1 byte │
│ │ ax ├──────┤──┴─ 2 bytes
│ │ │ ah │ │
│ ├───────┼──────┤───── ┘
│ │ │ bl │
│ │ bx ├──────┤
│ │ │ bh │
│ ├───────┼──────┤
│ │ │ cl │
│ │ cx ├──────┤
│ │ │ ch │
│ ├───────┼──────┤
│ │ │ dl │
│ │ dx ├──────┤
│ │ │ dh │
union regs├───────┼──────┤
│ │ │ │
│ │ si │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ di │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ cflag │ │
│ │ │ │
│ ├───────┤ │
│ │ │ │
│ │ flags │ │
│ │ │ │
└ └───────┴──────┘
│ x 两个结构变量 h │
└── 共享同一存储域 ──┘
2.使用伪变量和函数geninterrupt()
Turbo C 允许使用伪变量直接访问相应的8086寄存器。伪变量的类型有两种。
① unsigned int : _AX、 _BX、 _CX、 _DX、 _CS、 _DS、 _SS、 _ES、 _SP、 _BP、 _DI、 _SI
② unsigned char: _AL、 _AH、 _BL、 _BH、 _CL、 _CH、 _DL、 _DH