重复mov指令x86

时间:2015-07-03 22:24:44

标签: assembly x86 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

此代码(如源注释中所述,将引导加载程序复制到新位置)并继续执行 go rep 后跟 movs 应该这样做(复制部分),而是使用指令 mov {w}

rep
movw

在x86的每本参考书中,我看到 rep 与字符串指令一起使用。

rep 可以与所有数据传输指令一起使用,也可以只使用字符串表示,如果是,为什么在参考手册中没有提到它?

1 个答案:

答案 0 :(得分:4)

这很可能只是代码编写的特定汇编程序实现此指令的方式,尽管它确实很奇怪。由于movsb是英特尔的符号,因此更常见的是movswmovslmovs

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

<强>更新

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