OVMF Print 输出

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=递减
相关推荐
铜豌豆_Y34 分钟前
【实用】GDB调试保姆级教程|常用操作|附笔记
linux·c语言·驱动开发·笔记·嵌入式
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]file
linux·笔记·学习
superman超哥2 小时前
仓颉锁竞争优化深度解析
c语言·开发语言·c++·python·仓颉
其美杰布-富贵-李3 小时前
Python 反射完整学习笔记
笔记·python·学习·反射
charlie1145141913 小时前
快速在WSL上开发一般的C++上位机程序
开发语言·c++·笔记·学习·环境配置·工程
jimmyleeee3 小时前
人工智能基础知识笔记二十八:几款有用的LLM管理工具
人工智能·笔记·python
qq_401700413 小时前
const 指针:内存安全锁
c语言
superman超哥3 小时前
仓颉语言中包与模块系统的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
客梦4 小时前
数据结构-线性表
数据结构·笔记
W.KN4 小时前
关于论文如何开始的学习笔记
人工智能·笔记·学习