概述
今天看书上有一段代码让我感到很迷惑: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的作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复