我是靠谱客的博主 和谐樱桃,最近开发中收集的这篇文章主要介绍汇编中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的作用。

  

最后

以上就是和谐樱桃为你收集整理的汇编中OR AX, AX 和 AND AX, AX的作用的全部内容,希望文章能够帮你解决汇编中OR AX, AX 和 AND AX, AX的作用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部