test指令

首先我们来学习test指令。
test指令在每对操作数的对应数据位之间进行隐含的“与”操作,并设置标志位,但不修改目的操作数。这点和cmp指令有点相似。 test指令与and指令的操作数格式相同。

格式:
test 寄存器,寄存器
test 寄存器,内存单元
test 寄存器,立即数
test 内存单元,寄存器
test 内存单元,立即数

test指令我们并不常用,一般用来检测相关的数值位。 例如我们判断一个字符是大写还是小写。因为我们内存中字符是以ascii码的形式存放的,所以显示的时候也是以ascii码的规则解码并显示。 那么我们举例

A的ascii码是41h。
a的ascii码是61h。

我们如何判断一个字母是大写还是小写。因为我们通过判断它是否大于40h 小于61h就可以知道它是大写了。 小写的我们判断是否大于61h 小于 7ah。

但是我们还有一种方式判断,那就是检测相应的二进制位。 我们可以自己将 41h和61h转换成相应的二进制位。
41h = 01000001B
61h = 01100001B

可以看到它们除了第5位不同,其余位都是相同的。 其余的大小写字母同样是,不信大家可以自己去试试。
那么我们只要检测到第五位到底是否为1就知道它是否是小写了。(如果是大写,第五位为0) 我们看下面的代码,因为是一个字节,我就用低8位寄存器al来标示。看代码

mov al, 'a'
test al, 00100000B
jnz msg

msg:
invoke MessageBox, NULL, '是小写', '提示', MB_OK ;大家知道是弹出消息框的意思就行了


由于我们对它做的是与运算,因为我们只有第5位为1,其余位都为0。所以如果第5位是0的话,则结果还是0,如果是1的话,则结果不为0.(与运算是两个都为1,则结果为1)

jnz依据的是标志位,如果zf = 0,则跳。 因为zf = 0,则标示结果不为0,说明是小写。 所以跳转到标号执行消息框,"是小写"。


好接下来我给大家看下相关指令依据的标志位。

检测标志位
je 等于转移 zf = 1
jne 不等于转移 zf = 0
jb 低于转移 cf = 1
jnb 不低于转移 cf = 0
ja 高于转移 cf = 0 且 zf = 0
jna 不高于则转移 cf = 1 或 zf = 1


很简单。


小作业:
1.那么今天我们主要是来深入理解下test指令以及用法,今天的作业是写一个检测字母是否是大写的例子,参考我上面的例子。
F 46h 0100 0110h
f 66h 0110 0110h

mov al 'F'
test al 0010 000h
je msg

msg:
invoke MesssgeBox, Null, "是大写","提示",MB_OK
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值