assembly Linux内核0.01引导装载程序使用了rep movw,而不是rep movsw?这真的重复了普通的MOV吗?

brccelvz  于 2022-11-13  发布在  Linux
关注(0)|答案(1)|浏览(160)

我是汇编的新手,我正在尝试理解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

这段代码(如源代码注解中所述)将引导加载程序复制到一个新位置,并从go继续执行。
rep后跟movs应该执行此操作(复制部分),但使用的是指令mov{w}

rep
movw

在每一本x86的参考书中,我都看到rep与字符串指令一起使用。Intel's manual entry for the prefix也是如此。
rep可以与所有数据传输指令一起使用还是只与字符串指令一起使用?如果可以,为什么参考手册中没有提到它?

bgtovc5b

bgtovc5b1#

这很可能就是为之编写代码的特定汇编程序实现该指令的方式,尽管这很奇怪。更常见的是movsbmovswmovsl,因为movs是英特尔的表示法。
实际上,这是移动一个“字符串”,尽管它只是一组任意字节。更具体地说,你可能已经注意到了前面的mov cx,256。这个操作码是movw,它将移动一个16位的字,更有效地移动512字节的 Boot 扇区。

更新日期:

你的问题让我非常好奇,因为我还没有遇到过以这种方式编码的指令。有趣的是,我发现了一个forum entry,它似乎表明rep movw是AS86格式,实际上确实汇编成rep movsw

相关问题