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=递减
相关推荐
我叫洋洋5 小时前
C ++ [ hello world ]
c语言·c++·算法
天空'之城6 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
圣光SG6 小时前
Servlet学习笔记
笔记·学习·servlet
奋发向前wcx7 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
@Mike@8 小时前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习
六点_dn9 小时前
RabbitMQ学习笔记-定义与作用
笔记·学习·rabbitmq
Scott9999HH10 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
天空'之城11 小时前
C 语言工业级通用组件手写 06:固定块内存池
c语言·嵌入式开发·内存池·底层优化
香辣牛肉饭11 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
迷途呀11 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp