32汇编位运算

本文最后更新于:2024年8月16日 下午

x32汇编位运算

  • 有符号数的乘法和除法可以用算术移位
  • 无符号数的乘法和除法可以用逻辑移位

算数移位指令

指令格式:ASL/SAR Reg/Mem, CL/Lmm

SAL(算数左移)

image-20231030121701186

1
2
3
4
5
6
7
8
9
10
11
SAL eax,1
SAL ax,1
SAL al,1

;操作 eax寄存器操作修改al寄存器位0x81
SAL al,1
0x81
10000001 << 1 == 0000 0010


CF:1 0x02
SAR(算数右移)

image-20231030121709987

1
2
3
4
5
6
7
8
9
10
11
SAR eax,1
SAR ax,1
SAR al,1

;操作 eax寄存器操作修改al寄存器位0x81
SAR al,1
0x81
1000 0001 >> 1 == 1100 0000

CF = 1 0xC0

逻辑移位指令

指令格式SHL/SHR Reg/Mem, CL/Imm

SHL(逻辑左移)

image-20231030134752734

1
2
3
4
5
6
7
8
9
10
11
12
SHL eax,1
SHL ax,1
SHL al,1

;操作 eax寄存器操作修改al寄存器位0x81
SHL al,1
0x81
1000 0001 << 1 == 0000 0010


CF:1 0x02

SHR(逻辑右移)

image-20231030134759638

1
2
3
4
5
6
7
8
9
10
11
12
SHR eax,1
SHR ax,1
SHR al,1

;操作 eax寄存器操作修改al寄存器位0x81
SHR al,1
0x81
1000 0001 >> 1 == 0100 0000


CF:1 0x40

循环移位指令

指令格式ROL r/m, i8 ROR r/m, CL

ROL(逻辑左移)

image-20231030144809729

1
2
3
4
5
6
7
8
9
10
11
12
RCL eax,1
RCL ax,1
RCL al,1

;操作 eax寄存器操作修改al寄存器位0x81
RCR al,1
0x81
1000 0001 -> 1 == 1100 0000


CF:1 0xC0

ROR(逻辑右移)

image-20231030144820884

1
2
3
4
5
6
7
8
9
10
11
12
ROL eax,1
ROL ax,1
ROL al,1

;操作 eax寄存器操作修改al寄存器位0x81
ROL al,1
0x81
1000 0001 -> 1 == 1100 0000


CF:1 0xC0

带进位的循环移位指令

指令格式RCL r/m, i8 RCR r/m, CL

RCL( 带进位循环左移)
1
2
3
4
5
6
7
8
9
10
11
12
RCL eax,1
RCL ax,1
RCL al,1

;操作 eax寄存器操作修改al寄存器位0x81
RCL al,1
0x81
1000 0001 <-- 1 == 0000 0010


CF:1 0x02

RCR( 带进位循环右移)
1
2
3
4
5
6
7
8
9
10
11
12
RCR eax,1
RCR ax,1
RCR al,1

;操作 eax寄存器操作修改al寄存器位0x81
RCR al,1
0x81
1000 0001 --> 1 == 0100 0000


CF:1 0x40

练习1

1、定义一个unsiged char 类型,通过程序为第3、5、7位赋值,赋值时不能影响到其它位原来的值.(使用位操作指令、比如:& | ! ^ << >>等)

1
2
3
4
5
unsigned char bit = 0;





32汇编位运算
https://huajien.gitee.io/2022/d28cb9fe/
作者
HUAJI
发布于
2022年5月16日
许可协议