c
for (SrcY = SourceY, DstY = DestinationY;
SrcY < (Height + SourceY);
SrcY++, DstY++)
{
Offset = (DstY * Configure->PixelsPerScanLine) + DestinationX;
Offset = Configure->BytesPerPixel * Offset;
Destination = Configure->FrameBuffer + Offset;
if (Configure->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
Source = (UINT8 *)BltBuffer + (SrcY * Delta) + SourceX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
} else {
for (IndexX = 0; IndexX < Width; IndexX++) {
Blt =
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)(
(UINT8 *)BltBuffer +
(SrcY * Delta) +
((SourceX + IndexX) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
);
Uint32 = *(UINT32 *)Blt;
*(UINT32 *)(Configure->LineBuffer + (IndexX * Configure->BytesPerPixel)) =
(UINT32)(
(((Uint32 << Configure->PixelShl[0]) >> Configure->PixelShr[0]) &
Configure->PixelMasks.RedMask) |
(((Uint32 << Configure->PixelShl[1]) >> Configure->PixelShr[1]) &
Configure->PixelMasks.GreenMask) |
(((Uint32 << Configure->PixelShl[2]) >> Configure->PixelShr[2]) &
Configure->PixelMasks.BlueMask)
);
}
Source = Configure->LineBuffer;
}
CopyMem (Destination, Source, WidthInBytes);
}
nasm
global InternalMemCopyMem
InternalMemCopyMem:
push rsi
push rdi
mov rsi, rdx ; rsi <- Source
mov rdi, rcx ; rdi <- Destination
lea r9, [rsi + r8 - 1] ; r9 <- End of Source
cmp rsi, rdi
mov rax, rdi ; rax <- Destination as return value
jae .0
cmp r9, rdi
jae @CopyBackward ; Copy backward if overlapped
.0:
mov rcx, r8
and r8, 7
shr rcx, 3
rep movsq ; Copy as many Qwords as possible
jmp @CopyBytes
@CopyBackward:
mov rsi, r9 ; rsi <- End of Source
lea rdi, [rdi + r8 - 1] ; esi <- End of Destination
std ; set direction flag
@CopyBytes:
mov rcx, r8
rep movsb ; Copy bytes backward
cld
pop rdi
pop rsi
ret
print 在屏幕上的输出通过把数据写入显存实现
rep movsq 是一条硬件级内存块拷贝指令
rep :重复前缀,表示重复执行后续指令直到 RCX 寄存器为 0
movsq :移动四字,每次拷贝 8 字节
寄存器隐式依赖
| 寄存器 | 角色 | 说明 |
|---|---|---|
RCX |
计数器 | 要重复的次数 |
RSI |
源地址 | 数据从哪里拷贝 |
RDI |
目标地址 | 数据拷贝到哪里 |
DF 标志 |
方向 | 0=递增(默认),1=递减 |