这篇文章主要讲解了“UEFI开发基础汇编代码如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“UEFI开发基础汇编代码如何使用”吧!
UEFI中使用汇编代码
EDK代码中包含一部分汇编代码,目前支持的有.S、.asm和.nasm格式的汇编(第一个是AT&T汇编,后两个是Intel汇编,只是使用的汇编样式稍有不同,.nasm是开源和免费的,更加的通用),如果是在Windows下编译,一般使用的是NASM编译器,所以会使用.nasm格式的汇编文件,而编译工具也是免费的,可以下载,并放到C:\Nasm目录,之后就可以在EDK代码中使用。
下面是一个示例,它是一个库模块:
首先创建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
。
汇编代码编写:
SECTION .text;------------------------------------------------------------------------------; VOID; EFIAPI; AsmNop (; VOID; );;------------------------------------------------------------------------------global ASM_PFX(AsmNop)ASM_PFX(AsmNop): nop ret
SECTION .text
指定了代码段,之后的就是汇编代码了。
global ASM_PFX
指定了全局的函数,可以在外部调用,当然同时也需要增加头文件:
VOIDEFIAPIAsmNop ( VOID );
之后就可以使用该函数了,这跟普通的函数使用没有区别。
下面是另一个例子,用于向Legacy串口输出一个字符:
global ASM_PFX(AsmSerialIo)ASM_PFX(AsmSerialIo): mov dx, 03f3h mov eax, 0loop: 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开发基础汇编代码如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!