移位指令
- SHL(Shift Left Logical):逻辑左移。
- SHR(Shift Right Logical):逻辑右移。
- SAL(Shift Arithmetic Left):算术左移(与SHL相同)。
- SAR(Shift Arithmetic Right):算术右移。
- ROL(Rotate Left):循环左移。
- ROR(Rotate Right):循环右移。
- RCL(Rotate through Carry Left):带进位的循环左移。
- RCR(Rotate through Carry Right):带进位的循环右移。
这些移位指令都是对二进制位进行移动
SHL/SAL(逻辑左移)
将位向左移动指定的次数,最右边空出的位填充0。
MOV AL, 01H ; AL = 0000 0001B
SHL AL, 1 ; AL = 0000 0010B,左移1位
SHR(逻辑右移)
将位向右移动指定的次数,最左边空出的位填充0。
MOV AL, 02H ; AL = 0000 0010B
SHR AL, 1 ; AL = 0000 0001B,右移1位
SAR(算术右移)
将位向右移动指定的次数,最左边空出的位用原来的最高位(符号位)填充。
MOV AL, 82H ; AL = 1000 0010B
SAR AL, 1 ; AL = 1000 0001B,右移1位,符号位填充
ROL(循环左移)
将位向左移动指定的次数,最左边移出的位被放到最右边。
MOV AL, 01H ; AL = 0000 0001B
ROL AL, 1 ; AL = 0001 0000B,左移1位,最左边的位被放到最右边
ROR(循环右移)
将位向右移动指定的次数,最右边移出的位被放到最左边。
MOV AL, 01H ; AL = 0000 0001B
ROR AL, 1 ; AL = 1000 0000B,右移1位,最右边的位被放到最左边
RCL(带进位的循环左移)
将位向左移动指定的次数,最左边移出的位被放到进位标志(CF)中,原来在CF中的位被放到最右边。
MOV AL, 03H ; AL = 0000 0011B
STC ; 将CF设置为1
RCL AL, 1 ; AL = 0011 0100B,左移1位,CF的值被放到最右边,最左边的位被放到CF
RCR(带进位的循环右移)
将位向右移动指定的次数,最右边移出的位被放到进位标志(CF)中,原来在CF中的位被放到最左边。
MOV AL, 03H ; AL = 0000 0011B
STC ; 将CF设置为1
RCR AL, 1 ; AL = 1100 0011B,右移1位,CF的值被放到最左边,最右边的位被放到CF
串传送指令
MOVSB/MOVSW/MOVSD
这些指令用于在内存之间复制数据。MOVSB
传送一个字节,MOVSW
传送一个字(16位),MOVSD
传送一个双字(32位)。
; 假设DS:SI指向源字符串,ES:DI指向目的字符串
; CX寄存器包含要复制的字节数
CLD ; 清除方向标志,确保SI和DI自增
REP MOVSB ; 重复复制字节,直到CX为0
LODSB/LODSW/LODSD
这些指令用于从内存中加载数据到寄存器,并根据方向标志(DF)递增或递减SI/DI。
; 假设DS:SI指向源字符串
; AL/AX/EAX将存储加载的数据
CLD ; 清除方向标志,确保SI自增
LODSB ; 加载一个字节到AL,并递增SI
LODSW ; 加载一个字到AX,并递增SI
LODSD ; 加载一个双字到EAX,并递增SI