重复mov指令x86

Mr.*_*der 5 x86 assembly data-transfer

我是程序员的新手,我正在尝试了解Linux 0.01引导程序代码,但我被困在这部分(非常开始:)):

.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text

BOOTSEG = 0x07c0
INITSEG = 0x9000
SYSSEG  = 0x1000            | system loaded at 0x10000 (65536).
ENDSEG  = SYSSEG + SYSSIZE

entry start
start:
    mov ax,#BOOTSEG
    mov ds,ax
    mov ax,#INITSEG
    mov es,ax
    mov cx,#256
    sub si,si
    sub di,di
    rep
    movw
    jmpi    go,INITSEG
Run Code Online (Sandbox Code Playgroud)

此代码(如源解释评论份)的bootloader到新的位置,并从继续执行.rep后跟mov应该这样做(复制部分),而是使用指令mov {w}.

rep
movw
Run Code Online (Sandbox Code Playgroud)

在每个x86的参考书中,我看起来rep与字符串指令一起使用.

可以代表与所有数据传输指令,或只是字符串的人使用,如果是这样,为什么不正是在参考手册中提到?

Dav*_*zer 6

这很可能就是编写代码的特定汇编器实现该指令的方式,尽管它确实很奇怪。更常见的情况是movsbmovswmovslsincemovs是英特尔的表示法。

事实上,这就是移动一个“字符串”,尽管它只是一组任意字节。更具体地说,您可能已经注意到了mov cx,256这一点。该操作码movw将移动 16 位字,更有效地移动 512 字节引导扇区。

更新:

你的问题让我非常好奇,因为我还没有遇到过以这种方式编码的指令。有趣的是,我发现一个论坛条目似乎表明它rep movw是 AS86 格式,并且实际上可以汇编为rep movsw.