重复 mov 指令 x86
repeating mov instruction x86
我是汇编新手,我正在尝试理解 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 可以与所有数据传输指令一起使用还是仅与字符串指令一起使用,如果可以,为什么参考手册中没有提到它?
这很可能就是编写代码所针对的特定 assembler 实现此指令的方式,尽管它确实很奇怪。更常见的是 movsb
、movsw
或 movsl
,因为 movs
是英特尔的符号。
这实际上是在移动一个 "string",尽管它只是一组任意字节。更具体地说,您可能已经注意到前面的 mov cx,256
。此操作码是 movw
,它将移动 16 位字,更有效地移动 512 字节引导扇区。
更新:
你的问题让我非常好奇,因为我没有 运行 跨越以这种方式编码的指令。有趣的是,我发现 forum entry 似乎表明 rep movw
是 AS86 格式,实际上 assemble 到 rep movsw
.
我是汇编新手,我正在尝试理解 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 可以与所有数据传输指令一起使用还是仅与字符串指令一起使用,如果可以,为什么参考手册中没有提到它?
这很可能就是编写代码所针对的特定 assembler 实现此指令的方式,尽管它确实很奇怪。更常见的是 movsb
、movsw
或 movsl
,因为 movs
是英特尔的符号。
这实际上是在移动一个 "string",尽管它只是一组任意字节。更具体地说,您可能已经注意到前面的 mov cx,256
。此操作码是 movw
,它将移动 16 位字,更有效地移动 512 字节引导扇区。
更新:
你的问题让我非常好奇,因为我没有 运行 跨越以这种方式编码的指令。有趣的是,我发现 forum entry 似乎表明 rep movw
是 AS86 格式,实际上 assemble 到 rep movsw
.