概述
使用test指令判断变量是否为0
问题描述
- 平台、环境:
- x86指令集,32bit
- win10操作系统
- C+ASM编程
- 问题
- 判断eax是否为0,要使用test eax,0还是test eax,eax
- test指令如何影响标志位寄存器
- 如何读取标识寄存器并获取标识位(例如ZF标识位)
关于test指令
- test
- test指令实际上就是与(and)操作
- 与and指令的不同在于
- 不保存与运算结果
- and eax,0 将与运算结果0存入eax寄存器
- test eax,0 不把运算结果保存在eax寄存器中,eax寄存器值不变
- 用test可以实现对某个变量是否为0的判断,而and指令不行
- 虽然and和test都会影响标识寄存器中的ZF标志位,但是只用and指令无法判断出变量是否为0
- 不保存与运算结果
- test eax,0
- 不能够判断eax是否为0
- 因为eax和0作与,无论eax是否为零,结果都是0,都会是ZF标志位置1
- 这种写法使用test和and对标识位的影响是一样的
- test eax,eax
- 能够判断eax是否为0
- 当且仅当eax为0时,eax & eax = 0。因为eax & eax = eax,所以只有eax等于0时,ZF标识位才为1,其余都是0。
标识寄存器读取
- pushf
- pushf、pushfd指令可以将flags寄存器入栈,pushf用于16位flags寄存器,pushfd用于32位flags寄存器
- pushfd,pop eax,即可把标识寄存器内容存入eax寄存器
- setz x
- 又sete x
- 将ZF标识位存给x寄存器,x长度应为16位
- setz al,之后需要将eax高位(ah)清零
- 使用VC6.0,__asm编程,如果写setz eax,编译器会报warning,实际二进制可执行文件的汇编代码自动变成了setz al
- 其他set指令可以读取其他的标识位
- 例1,如果ebx为0则说明eax不为0,如果ebx为40h这说明eax为0
test eax, eax
pushfd
pop ebx
and ebx, 40h
- 例2,如果bl为0,则说明eax不为0,如果bl为1,则说明eax为0
test eax, eax
mov ebx, 0
setz bl
最后
以上就是激情凉面为你收集整理的使用test指令判断变量是否为0使用test指令判断变量是否为0的全部内容,希望文章能够帮你解决使用test指令判断变量是否为0使用test指令判断变量是否为0所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复