UEFI实战UEFI中使用汇编代码

Posted jiangwei0512

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI实战UEFI中使用汇编代码相关的知识,希望对你有一定的参考价值。

UEFI中使用汇编代码

EDK代码中包含一部分汇编代码,目前支持的有.S、.asm和.nasm格式的汇编(第一个是AT&T汇编,后两个是Intel汇编,只是使用的汇编样式稍有不同,.nasm是开源和免费的,更加的通用),如果是在Windows下编译,一般使用的是NASM编译器,所以会使用.nasm格式的汇编文件,而编译工具也是免费的,可以在https://www.nasm.us/下载,并放到C:\\Nasm目录,之后就可以在EDK代码中使用。

下面是一个示例,它是一个库模块:

  1. 首先创建inf文件:
[Defines]
  INF_VERSION                       = 0x00010005
  BASE_NAME                         = AsmLib
  FILE_GUID                         = 2A3061AF-740E-4B62-B900-FC24AF9B072E
  MODULE_TYPE                       = BASE
  VERSION_STRING                    = 1.0
  LIBRARY_CLASS                     = AsmLib

#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES              = IA32 X64 IPF EBC
#

[Sources.X64]
  X64/AsmLib.nasm

[Packages]
  MdePkg/MdePkg.dec
  BeniPkg/BeniPkg.dec

这里的代码跟普通inf没有区别,只是指定的源文件Sources稍有不同,通常会去指定时Ia32还是X64

  1. 汇编代码编写:
  SECTION .text

;------------------------------------------------------------------------------
; VOID
; EFIAPI
; AsmNop (
;   VOID
;   );
;------------------------------------------------------------------------------
global ASM_PFX(AsmNop)
ASM_PFX(AsmNop):
  nop
  ret

SECTION .text指定了代码段,之后的就是汇编代码了。

global ASM_PFX指定了全局的函数,可以在外部调用,当然同时也需要增加头文件:

/**
  Code for nothing.

  @param  NA

  @retval  NA

**/
VOID
EFIAPI
AsmNop (
  VOID
  );
  1. 之后就可以使用该函数了,这跟普通的函数使用没有区别。

下面是另一个例子,用于向Legacy串口输出一个字符:

global ASM_PFX(AsmSerialIo)
ASM_PFX(AsmSerialIo):

  mov dx, 03f3h
  mov eax, 0
loop:
  in  al, dx
  bt  eax, 5
  jnc loop      ; Wait until ready

  mov dx, 03f8h
  mov ax, cx    ; cx is the input parameter
  out dx, ax    ; Output the character
  ret

测试代码可以在BeniPkg\\DynamicCommand\\TestDynamicCommand\\Test.c中找到。

以上是关于UEFI实战UEFI中使用汇编代码的主要内容,如果未能解决你的问题,请参考以下文章

UEFI实战SlimBootloader集成UEFI Payload

UEFI实战SlimBootloader集成UEFI Payload

UEFI实战HII之代码示例

UEFI实战HII之代码示例

UEFI实战SlimBootloader使用

UEFI实战SBL中的OsLoader代码分析