cli 全称 Clear Interupt
sti 全称 Set Interupt
这两个指令分别是用来屏蔽中断和恢复中断用的,如: 设置栈基址SS和偏移地址SP时,需要cli,因为如果设置这两个地址的指令被分开了,那么很有可能SS被修改了,但由于中断,而代码跳去其它地方执行了,SP还没来得及修改,就有可能出错。
movsb(MOVe String Byte):即字符串传送指令,这条指令按字节传送数据。
通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。
rep (repeat)指令就是"重复"的意思,术语叫做"重复前缀指令"。
因为既然是传递字符串,则不可能一个字(节)一个字(节)地传送,所以需要有一个寄存器来控制串长度。这个寄存器就是CX,指令每次执行前都会判断CX的值是否为0(为0结束重复,不为0,CX的值减1),以此来设定重复执行的次数。因此设置好CX的值之后就可以用rep movsb了。
cld 全称 Clear Director
std 全称 Set Director
cld(CLear Direction flag)是清方向标志位,把标志(flags)寄存器的DF=0,地址指针si、di增加;如是std则把DF=1,地址指针减小也使DF的值为0,在执行串操作时,使地址按递增的方式变化,这样便于调整相关段的当前指针。cld指令与std(Set Direction flag)的执行结果相反,即置DF的值为1。
jmp 无条件跳转指令,即直接跳转,也称为 段内跳转指令
jmpi段间跳转指令,即间接跳转,用于x86实模式下。
在Linux早期版本的boot.s中,为了改变CS的值,操作的方法如下所示:
entry start
start:
jmpi go, #BOOTSEG
go: mov ax, cs
那么可以通过mov指令直接修改CS的内容吗,即如下:
mov ax, #0x7c0
mov cs, ax
当然是不可以的,CS和IP是8086 CPU中2个最关键的寄存器。它们指示了要读取指令的地址。大部分8086 CPU寄存器的值,都可以使用mov指令来改变,但CS、IP中的值不能用mov指令来修改。
能够改变CS、IP寄存器内容的指令称为转移指令。一个最简单的可以修改它们的指令,就是上面用的 jmpi指令。 jmpi 0, 0x9000h 表示间接跳转(相当于跳到另一个段去开始执行), 即程序跳到9000:0 去继续执行了。
汇编指令集合比较多,这里只是简单列举了几个。
如下图的分类
汇编常用指令分类