gpt4 book ai didi

assembly - 为什么 repe 和 repne 在 movsb 之前做同样的事情?

转载 作者:行者123 更新时间:2023-12-04 18:59:51 26 4
gpt4 key购买 nike

我很快就有了一个组装测试,在准备的时候,我注意到了一些奇怪的事情。repe movsb在 ZF=0 时重复,我被告知 repe应该在 CX 不等于 0 和 ZF=1 时重复。
我做了一些测试,发现之前movsb , rep , repe , 和 repne指令工作相同。
对此有何解释?

编辑:
这是代码:

.model small
.data
A db ' This is a test '
N db 27
.stack 10h
.code
mov ax,@data
mov ds,ax
mov es,ax
cld
mov al,' '
mov cl,N
xor ch,ch
mov di,offset A
next: repe scasb
jcxz cont ; jump if cx=0
dec di
inc cx
xchg si,di ; swap between si and di
push cx
push di
repe movsb
pop di
pop cx
repne scasb
mov si,di
jmp next
cont: .exit
end

最佳答案

在机器码中,实际上只有两个不同的前缀字节。

  • 0xF3当与 MOVS/LODS/STOS/INS/OUTS(不影响标志的指令)一起使用时被称为 REP
  • 0xF3与 CMPS/SCAS 一起使用时称为 REPE 或 REPZ
  • 0xF2与 CMPS/SCAS 一起使用时称为 REPNE 或 REPNZ,并且没有记录在其他说明中。

  • 英特尔 insn reference manual REP entry只有文件 F3 MOVS 的 REP,而不是 F2 前缀。恭喜,您已经找到了一种未公开的 REP MOVSB 编码,至少在您测试过的任何 CPU 上都是如此。 :)
    另见 this appendix of the NASM manual其中包括其他未记录的操作码,但不包括此 F2 A4 REPNE MOVSB。 (链接自 标签维基)。

    通常,不影响指令的前缀会被忽略,所以我希望 REPNE MOVSB 与 MOVSB 运行相同。例如 TZCNT被编码为 REP BSF,并且在不支持 BMI1 的 CPU 上,它简单地作为 BSF 执行。 (做同样的事情,除非源为零。)
    类似地,REP RET 是引入填充的常用技巧 to work around a limitation of AMD K8/K10 branch predictors , 运行方式与 RET 相同。
    但英特尔警告说,这种行为是不能保证的,因为新指令可以使用一种编码,该编码曾经是带有忽略前缀的不同指令。例如LZCNT(编码为 REP BSR)产生与 BSR 相反的结果,因此由于某种原因包含 REP BSR 的旧代码将停止在新 CPU 上工作。
    请注意,在原始 8086 上, rep mul/imul negates the result !!所以从历史上看,它并不总是被完全忽略,这可能就是为什么英特尔只在向后兼容性实际上有用时才记录对特定情况的忽略(例如 rep nop = pause ,诸如 HLE 和 BND 前缀之类的东西,如以及非零输入的 TZCNT = BSF。)另请参阅我和其他关于 retrocomputing Q&A 的答案.

    关于assembly - 为什么 repe 和 repne 在 movsb 之前做同样的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40219519/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com