UEFI开发基础汇编代码的使用

UEFI中使用汇编代码

EDK代码中包含一部分汇编代码,目前支持的有.S、.asm和.nasm格式的汇编(第一个是AT&T汇编,后两个是Intel汇编,只是使用的汇编样式稍有不同,.nasm是开源和免费的,更加的通用),如果是在Windows下编译,一般使用的是NASM编译器,所以会使用.nasm格式的汇编文件,而编译工具也是免费的,可以在https://www.nasm.us/下载,并放到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指定了全局的函数,可以在外部调用,当然同时也需要增加头文件:

/**
  Code for nothing.
  @param  NA
  @retval  NA
**/
VOID
EFIAPI
AsmNop (
  VOID
  );

之后就可以使用该函数了,这跟普通的函数使用没有区别。

下面是另一个例子,用于向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开发汇编代码的资料请关注我们其它相关文章!

(0)

相关推荐

  • 从汇编代码开始全面解析synchronized还原最真实的偏向锁

    目录 前言 一.TemplateTable::monitorenter() 二.lock_object(): 三.biased_locking_enter() 1).参数 2).概念 3).源码 前言 我们都知道java之所以跨平台能力强,是因为java在编译期没有被编译成机器码,而是被编译成字节码.早期的jvm会将编译好的字节码翻译成机器码解释执行,我们在jvm的源码中还可以看到早期的解释器——bytecodeInterpreter.cpp(虽然已经不再使用).对于字节码这种总数固定,解释逻辑

  • 浅析ARMv8汇编指令adrp和adr

    目录 1.概述 2.adrp 2.1.定义 2.2.测试 3.adr 3.1.定义 3.2.测试 参考资料 1.概述 在阅读Linux内核代码时,经常能碰到汇编代码,网上能查的资料千篇一律,大多都描述的很模糊.俗话说,实践是检验真理的唯一标准,我们就参考官方文档,自己写汇编代码并反汇编,探寻其中的奥妙. 2.adrp 在Linux内核启动代码primary_entry中,使用adrp指令获取Linux内核在内存中的起始页地址,页大小为4KB,由于内核启动的时候MMU还未打开,此时获取的Linux

  • ARM汇编判断之如何用汇编判断数组中正负数个数

    目录 [ARM汇编]如何判断数组中正负数个数? 写在前面: 所有判断后缀 如何用汇编实现判断数组中正负数的个数? 1.编前准备 1.1用C的伪代码表示 1.2参照正向遍历的框架 2.编写ARM汇编 2.1先给定一串数组.输出格式 2.2在循环中加入判断.计数 2.3在主函数中初始化使用的寄存器 2.4输出累计之和 2.5源代码 2.6运行结果 3.总结 [ARM汇编]如何判断数组中正负数个数? 写在前面: 在很多算法中都必须要用到if语句进行判断,前面我们提到了数组,也练习了用汇编的循环框架遍历

  • UEFI开发基础汇编代码的使用

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

  • UEFI开发基础HII代码示例

    目录 代码示例 模块 formset form subtitle oneof string numeric text checkbox goto label 代码示例 代码 https://gitee.com/jiangwei0512/edk2-beni 模块 BeniPkg\DynamicCommand\SetupDynamicCommand\SetupDynamicCommand.inf. 这里通过一个命令setup来打开图形界面.图形界面的form在Page.vfr中,还有若干的uni文件

  • UEFI开发实战用户交互界面基础说明

    目录 前言 启动 UiApp模块 字体 字符串 UI Entry 前言 本文以vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.中的代码为例说明UEFI用户交互界面的实现. 这里UEFI用户交互界面的实现载体是OVMF(使用QEMU启动),其形式如下: 它一般被叫做Front Page(后面将以该名称来称呼上述的界面),其下还包括Setup,Boot Manager,Device Manager等选项. 相比Legacy B

  • 鸿蒙开发之Button按钮类型及如何通过代码设置(HarmonyOS鸿蒙开发基础知识)

    AbilitySlice 是什么 (HarmonyOS鸿蒙开发基础知识) AbilitySlice 是什么 AbilitySlice主要用于承载Ability的具体逻辑实现和界面UI,是应用显示.运行和跳转的最小单元.AbilitySlice通过setUIContent()为界面设置布局 本文重点给大家介绍鸿蒙开发之Button按钮类型及如何通过代码设置(HarmonyOS鸿蒙开发基础知识),具体内容如下所示: Button类型分类 按照按钮的形状,按钮可以分为: 普通按钮 椭圆按钮 胶囊按钮

  • 解析四则表达式的编译过程及生成汇编代码

    1.前序这是编译原理的实验,自认为是上大学以来做过的最难的一个实验.实验用到的基础知识:C语言.数据结构.汇编(只需简单的了解).开发工具:VC 2.问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码.消除左递归后的文法:E→TE'E'→+TE' |εT→FT'T'→*FT' |εF→(E) | i消除左递归后的翻译模式:E ::=     T    {E'.i:=T.nptr}E'    {E.nptr:=E'.s}E'::=      + T  {E'1.i:=mknod

  • iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    简介 上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码. 注意 在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编. 内联汇编 汇编与C间接通信 在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令 __asm__ ,注意插入汇编有可能会被编译器忽略,因此需要加入 __volatile__ 修饰符保证汇编代码有效. 下面给出一个简单的例子,

  • UEFI开发实战用户交互界面使用说明VFR文件

    目录 1. 综述 2. 作用 3. 语法 3.1 注释 3.2 预定义 3.3 数据结构 3.4 Forms相关表达式总览 3.4.1 formset 3.4.2 formset list 3.5 Form Set List 3.5.1 变量定义 3.5.2 控制语句 3.5.3 Question语句 3.5.4 form语句 3.6 Forms表达式 3.6.1 vfrStatementImage 3.6.2 vfrStatementLocked 3.6.3 vfrStatementRules

  • UEFI开发实战SlimBootloader中调用FSP

    目录 综述 编译 PostBuild Build PostBuild FSP二进制组成分析 使用 Stage1B Stage2 综述 FSP的全称是Firmware Support Package.FSP有以下的特性: FSP提供了Intel重要组件(包括处理器.内存控制器.芯片组等)的初始化: FSP被编译成独立的二进制,并可以集成到Bootloader中,这里说的Bootloader可以是Slim Bootloader,coreboot,UEFI等等: FSP的优点有免费.方便集成.可减少开

  • Mobile Web开发基础之四--处理手机设备的横竖屏问题

    为了应对移动设备屏幕的碎片化,我们在开发Mobile Web应用时,一个最佳实践就是采用流式布局,保证最大可能地利用有限的屏幕空间.由于屏幕存在着方向性,用户在切换了屏幕的方向后,有些设计上或实现上的问题就会凸显--我们至少需要处理一下当前显示元素的宽度的适配(当然,要做的可能不仅仅是这个).很多时候,我们需要为不同的屏幕方向来设计对应的应用显示模式,这个时候,实时地获知设备的模竖屏状态就显得极为重要. window.orientation属性与onorientationchange事件 win

  • C语言中的数组和指针汇编代码分析实例

    今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

随机推荐