mirror of
https://github.com/MintCN/linux-insides-zh.git
synced 2026-02-11 22:36:52 +08:00
Update Booting/linux-bootstrap-2.md
This commit is contained in:
@@ -323,7 +323,7 @@ ENDPROC(memset)
|
||||
|
||||
首先你会发现,`memset`函数和`memcpy`函数一样使用了`fastcall`调用规则,因此函数的参数是通过`ax`,`dx`以及`cx`寄存器传入函数内部的。
|
||||
|
||||
就像memcpy函数一样,`memset`函数一开始将`di`寄存器入栈,然后将`biosregs`结构的地址从`ax`寄存器拷贝到`di`寄存器。接下来,使用`movzbl`指令将`dl`寄存器的内容拷贝到`ax`寄存器的滴字节,到这里`ax`寄存器就包含了需要拷贝到`di`寄存器所指向的内存的值。
|
||||
就像memcpy函数一样,`memset`函数一开始将`di`寄存器入栈,然后将`biosregs`结构的地址从`ax`寄存器拷贝到`di`寄存器。接下来,使用`movzbl`指令将`dl`寄存器的内容拷贝到`ax`寄存器的字节,到这里`ax`寄存器就包含了需要拷贝到`di`寄存器所指向的内存的值。
|
||||
|
||||
接下来的`imull`指令将`eax`寄存器的值乘上`0x01010101`。这么做的原因是代码每次将尝试拷贝4个字节内存的内容。下面让我们来看一个具体的例子,假设我们需要将`0x7`这个数值放到内存中,在执行`imull`指令之前,`eax`寄存器的值是`0x7`,在`imull`指令被执行之后,`eax`寄存器的内容变成了`0x07070707`(4个字节的`0x7`)。在`imull`指令之后,代码使用`rep; stosl`指令将`eax`寄存器的内容拷贝到`es:di`指向的内存。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user