汇编杂谈-逻辑运算指令和移位指令

逻辑运算指令

  • AND / TEST, TEST 执行 AND 指令但是不更新寄存器,只更新 EFLAGS
  • SUB / CMP,同上,CMP 指令不更新寄存器,但更新 EFLAGS
  • OR
  • XOR
  • NOT

TEST 和 CMP 指令会更新 EFLAGS 寄存器,详见 EFLAGS 寄存器

例: cmp oprd 1, oprd 2 当执行到 CMP 指令的时候会读取这两个寄存器的内容,并加以减法运算,结果本身不保留,并按照结果设置符号位(属算术运算)。

如何判断大小: 若执行指令后:ZF=1, 则说明两个数相等,因为 zero 为 1 说明结果为0.

移位指令

  • CLC 进位清零
  • SHL / SHR 移位
  • ROL / ROR 循环移位
  • RCL / RCR 带进位循环移位

是否带进位区别如下:

  1. 不带进位
1
2
3
4
5
6
xchg bx, bx
clc
mov al, 0b0100_0101
rol al, 1
; al from: 0x45 -> 0b0100_0101
; al to:   0x8a -> 0b1000_1010
  1. 带进位
1
2
3
4
5
6
7
clc; CF置为0
mov al, 0b1111_1111
rcl al, 1
rcl al, 1
; al from: 0xff -> 0b01111_1111
; al to:   0xfe -> 0b1111_1110, 最左侧的1送入CF,CF的0送入第0位
; al to:   0xfd -> 0b1111_1101,最左侧的1送入CF,CF的1送入第0位
0%