首页
社区
课程
招聘
学汇编 遇到问题
发表于: 2010-10-15 10:20 4313

学汇编 遇到问题

2010-10-15 10:20
4313
.要测试某操作时是否是1,则先把操作数取反,在进行TEST操作指令测试。

             例如测试AL寄存器第2位是否为1,如果是1则转到EXIT执行。

        MOV DL,AL

            NOT DL

           TEST DL,0000 0100B

看看这个说法,
问题1:

为什么先要取反呢
不直接TEST呢?

还有TEST和ZF标志位到底是什么关系???

我现在光知道TEST的结果要是0     ZF就是1,说明该位是0.
                             结果要是1     ZF就是0,说明该位是1
问题2
那假如  要看的是 好几位呢比如 第1 位和第5位。那样根据ZF判断的话,只能判断一位啊!

你比如:(AL)=23H
             MOV AL,23H                               0010  0011
             TEST AL,00100010                   ; 0010  0010
                                                        结果 0010  0010  22H
                                              ZF=啥?
           第1位和第5位全是1。咋判断?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
达人                    救我
2010-10-15 10:31
0
雪    币: 216
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第二个问题好像AL取反后就能判断1和5位全是1了。
2010-10-15 10:54
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1
是否取反要看后面的跳转语句,也就是你要跳转的条件是什么?如果第3位为1,并用JZ跳转那一定是要取反的,如果是JNZ则不用取反。
test逻辑与运算结果为零,就把ZF(零标志)置1;

2
运算结果为零则ZF置 1,否则为零
比如:
Test的一个非常普遍的用法是用来测试一方寄存器是否为空:  

test ecx, ecx
jz somewhere  

如果ecx为零,设置ZF零标志为1,否则结果为ecx,ZF并不置0

我也在学习中!
2010-10-15 11:03
0
雪    币: 2109
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

TEST == 不修改寄存器的 AND
ZF <- 只有结果为 0 才设定

MOV DL,AL ;0000 0100B  ; AL = 2
NOT DL    ;1111 1011B
TEST DL,   0000 0100B  ; (and)
           0000 0000B  => 为 0, ZF = 1

要同时有第1位和第5位, 其他不关心(Don't care, 有或无都可)
MOV AL,23H          ; 0010  0011
MOV DL,AL           ; 0010  0011
NOT DL              ; 1101  1100
TEST DL,00100010B   ; 0010  0010 ; 22H
                      0000  0000 ; (and 结果为 0, ZF = 1)
只有第1位和第5位
MOV AL, 22H         ; 0010  0010
MOV DL, AL
SUB DL, 22H         ; 0010  0010
                      0000  0000 ; (sub 相减结果为 0, ZF = 1)

2010-10-15 14:21
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
这么说来,TEST 如果要测试某位是否为1的话。。则必须先取反。也就是TEST NOT连用哦。
2010-10-15 14:29
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
ZF <- 只有结果为 0 才设定

1
0

0
0
结果 是1不设定?ZF不置0吗?
2010-10-15 14:33
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
要测试某位 是否 为 1 -- ?

好办吧

test  al,100B
jne  _NOT             ;若 AL 第2位为 1,则跳转到 _NOT

_NOT:

--------------

这样就可以了取反干什么?
test 就是进行 与 运算不保存结果嘛 -----
2010-10-15 14:35
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
那直接TEST DL ,00000010B  不行吗
2010-10-15 14:54
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
对啊,中山大学老师说先取反,,在测试。那是什么意思呢?
2010-10-15 14:55
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
楼主还没明白

test  al,10B
jne    @F
----------------------
not al
test al,10B
je    @F

这两段作用是 一样的 若al第1位为1则跳转-- 看那个 je 和 jne 跳转条件不一样了

与 运算 只有 1 & 1 == 1
其余 0&1  1&0   0&0  与后都是0
2010-10-15 15:48
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
ZF零标志位:运算结果为0时ZF位置1,否则为0.
TEST指令:和AND指令差不多,只是AND指令执行后会把结果送到目的操作数,而TEST却不会,只是影响标志位
汇编执行每条指令都会影响标志位.
测试某一位是否为1,不需要取反.楼主说老师让取反再测试,可能和后面的跳转命令有关。
如果用TEST命令测试多位的话,只要其中一位为1,那么ZF=0

共同学习中。。。。。。
2010-10-15 16:01
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
不是 每条指令 都影响标志位的 ---
常见的影响标志位的是:加减乘除,逻辑运算 ---
2010-10-15 16:27
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可以去网上多看看资料嘛
2010-10-16 00:43
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
谢谢 神雕大侠。白冰,enthors及所有回答问题者。我搞明白了。。谢谢各位精彩回答
2010-10-16 08:32
0
游客
登录 | 注册 方可回帖
返回