我是靠谱客的博主 激情凉面,最近开发中收集的这篇文章主要介绍使用test指令判断变量是否为0使用test指令判断变量是否为0,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用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所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部