汇编中OR AX, AX 和 AND AX, AX的作用

来源:互联网 发布:mac下好用的ftp工具 编辑:程序博客网 时间:2024/06/05 19:26

今天看书上有一段代码让我感到很迷惑:OR AX, AX。 这不是啥也没干嘛?!AX压根就没变啊!这样做有啥意义啊!与之类似的还有AND AX, AX。

     然后我就查了一下,发现自己还是太Naive。

     OR AX, AX的目的是为了改变标志位。书上讲指令的时候提到了,OR和ADD指令,可以根据结果设置SF,ZF和PF,CF = 0,OF = 0,AF无定义。这就是OR  AX, AX或者是 AND AX, AX的目的。在不改变AX的情况下,影响标志位,从而进行下一步判断。一般写了OR AX, AX后,后面就是一句条件转移指令。

      举个栗子:

Comment/************Function: Display an integer in demicalParament: DXthe integer to be displayedReturn :  NullDiscription:  divide by 10 each time*********/Dispsi16ByDXPROC NEARPUSH AXPUSH BXPUSH CXMOV AX, DXMOV CX, 0MOV BX, 10OR AX, AXJNS Rep1b@Dispsi16ByDXNEG AXPUSH AXMOV AH, 02hMOV DX, '-'INT 21hPOP AXRep1b@Dispsi16ByDX:SUB DX, DXDIV BXADD DX ,'0'PUSH DXINC CXOR AX, AXJNZ Rep1b@Dispsi16ByDXRep2b@Dispsi16ByDX:     MOV AH, 02hPOP DXINT 21hLOOP Rep2b@Dispsi16ByDXPOP CXPOP BXPOP AXRETDispsi16ByDXENDP


这是一段把DX中的补码数按十进制输出的代码。其中两处用到了OR AX, AX。第一次OR AX, AX,影响了SF位,是为了判断是不是负数,如果是,JNS就不转移,就要输出一个负号。第二次OR AX, AX,影响了ZF位,为了判断AX是不是为零。这里用AND AX, AX也是一样的。

     其实用CMP也是可以的。第一处可以替换成 CMP AX, 0  ,后面的转移改成  JGE Rep1b@Dispsi16ByDX;第二处可以替换成 CMP AX , 0  ,后面转移条件不用改。

     以上就是OR AX, AX或者是AND AX, AX的作用。