gpt4 book ai didi

assembly - Linux内核0.01引导加载程序使用rep movw,而不是rep movsw?这实际上是重复普通的 MOV 吗?

转载 作者:行者123 更新时间:2023-12-03 06:41:41 26 4
gpt4 key购买 nike

我是汇编新手,我试图理解 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 可以与所有数据传输指令一起使用还是仅与字符串指令一起使用,如果可以,为什么引用手册中没有提及?

最佳答案

这很可能就是编写代码的特定汇编器实现该指令的方式,尽管它确实很奇怪。由于 movs 是 Intel 的表示法,因此更常见的是 movsbmovswmovsl。/p>

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

更新:

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

关于assembly - Linux内核0.01引导加载程序使用rep movw,而不是rep movsw?这实际上是重复普通的 MOV 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214837/

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