汇编 部分指令记录

默认分类 2018-09-18

状态标志位有:CF(进位标志位)、AF(辅助进位标志位)、ZF(零标志位)、PF(奇偶标志位)、SF(符号标志位)、OF(溢出标志位)

test test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx
jz xxxxxxxxx
如果ecx为零,设置ZF 零标志为1,Jz跳转

影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0)
Test对两个参数(目标,源)执行AND(与)逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
TEST AX,BX 与 AND AX,BX 命令有相同效果

cmp cmp是汇编的比较指令;

cmp(compare)指令的作用:进行比较两个操作数的大小;
例如:
   cmp oprd1,oprd2
  为第一个操作减去第二个操作数,但不影响第两个操作数的值;
  它影响flag的CF,ZF,OF,AF,PF
  怎么判断大小呢?
  若执行指令后;
  ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
  当无符号时:
  若
  CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
  CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
  当有符号时:
  若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
  若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
  若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
  若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
  最后两个可以作出这种判断的原因是,溢出的本质问题:
  两数同为正,相加,值为负,则说明溢出;
  两数同为负,相加,值为正,则说明溢出;
  故有,正正得负则溢出,负负得正则溢出。

xor

异或,二进制运算。可逆运算。1 xor 1=0,0 xor 0=0,1 xor 0=1,0 xor 1=1。
a xor b的运算方法:将a,b 转化为2进制数,再进行对比,每个数位上的0或1如果相同,那么结果就取0,如果不同就取1,将得到的结果转化为原来进制的数,就是结果。
一般 xor ax,ax 就是清0操作
两个数作异或(XOR)运算时,如果标志位 ZF=0 ,表示结果为0 

and

AND AL.AL对标志位的影响:
指令执行后 CF 和 OF 置零,AF无定义。
PF=1 结果操作数中1的个数为偶数时置1
PF=0 结果操作数中1的个数为奇数时置0

mov

在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
例如:
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。
       MOV [SI],[2000H];   这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。
       MOV IP,2000h;  这是错误的
(3)CS和IP不能作为目的操作数。
       MOV CS,AX;   这是错误的
(4)MOV指令中立即数不能作目标操作数。
       MOV 2000H,[SI];  这是错误的

Jmp 无条件跳转

jz ZF标志为1,跳转


本文由 布墨 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。
阅读:281

还不快抢沙发

添加新评论