UEFI开发基础汇编代码的使用
<h2>UEFI中使用汇编代码</h2><p>EDK代码中包含一部分汇编代码,目前支持的有.S、.asm和.nasm格式的汇编(第一个是AT&T汇编,后两个是Intel汇编,只是使用的汇编样式稍有不同,.nasm是开源和免费的,更加的通用),如果是在Windows下编译,一般使用的是NASM编译器,所以会使用.nasm格式的汇编文件,而编译工具也是免费的,可以在https://www.nasm.us/下载,并放到C:\Nasm目录,之后就可以在EDK代码中使用。</p>
<p>下面是一个示例,它是一个库模块:</p>
<p>首先创建inf文件:</p>
<div class="jb51code"><pre class="brush:plain;">
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
#
X64/AsmLib.nasm
MdePkg/MdePkg.dec
BeniPkg/BeniPkg.dec
</pre></div>
<p>这里的代码跟普通inf没有区别,只是指定的源文件<code>Sources</code>稍有不同,通常会去指定时<code>Ia32</code>还是<code>X64</code>。</p>
<p>汇编代码编写:</p>
<div class="jb51code"><pre class="brush:plain;">SECTION .text
;------------------------------------------------------------------------------
; VOID
; EFIAPI
; AsmNop (
; VOID
; );
;------------------------------------------------------------------------------
global ASM_PFX(AsmNop)
ASM_PFX(AsmNop):
nop
ret
</pre></div>
<p><code>SECTION .text</code>指定了代码段,之后的就是汇编代码了。</p>
<p><code>global ASM_PFX</code>指定了全局的函数,可以在外部调用,当然同时也需要增加头文件:</p>
<div class="jb51code"><pre class="brush:plain;">/**
Code for nothing.
@paramNA
@retvalNA
**/
VOID
EFIAPI
AsmNop (
VOID
);
</pre></div>
<p>之后就可以使用该函数了,这跟普通的函数使用没有区别。</p>
<p>下面是另一个例子,用于向Legacy串口输出一个字符:</p>
<div class="jb51code"><pre class="brush:plain;">global ASM_PFX(AsmSerialIo)
ASM_PFX(AsmSerialIo):
mov dx, 03f3h
mov eax, 0
loop:
inal, dx
bteax, 5
jnc loop ; Wait until ready
mov dx, 03f8h
mov ax, cx ; cx is the input parameter
out dx, ax ; Output the character
ret
</pre></div>
<p>测试代码可以在BeniPkg\DynamicCommand\TestDynamicCommand\Test.c中找到。</p>
<p>以上就是UEFI开发基础汇编代码使用的详细内容,更多关于UEFI开发汇编代码的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>UEFI开发实战用户交互界面基础说明</li><li>UEFI开发实战用户交互界面使用说明UNI文件</li><li>UEFI开发实战用户交互界面使用说明VFR文件</li><li>UEFI开发基础HII代码示例</li><li>UEFI开发实战SlimBootloader中调用FSP</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]