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

今天看书上有一段代码让我感到很迷惑: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 demical
	Parament: DX	the integer to be displayed
	Return :  Null
	Discription:  divide by 10 each time
	*********/
Dispsi16ByDX	PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		MOV AX, DX
		MOV CX, 0
		MOV BX, 10
		OR AX, AX
		JNS Rep1b@Dispsi16ByDX
		NEG AX
		PUSH AX
		MOV AH, 02h
		MOV DX, '-'
		INT 21h
		POP AX
Rep1b@Dispsi16ByDX:
		SUB DX, DX
		DIV BX
		ADD DX ,'0'
		PUSH DX
		INC CX
		OR AX, AX
		JNZ Rep1b@Dispsi16ByDX	
Rep2b@Dispsi16ByDX:	
     	MOV AH, 02h
		POP DX
		INT 21h
		LOOP Rep2b@Dispsi16ByDX
		POP CX
		POP BX
		POP AX
		RET
Dispsi16ByDX	ENDP


这是一段把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的作用。

  

你可能感兴趣的:(Assembly)