微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ARMv8 AARCH64 - 错误:立即超出范围

如何解决ARMv8 AARCH64 - 错误:立即超出范围

我开始为 ARMv8 编写程序集,但在比较值以创建条件代码时遇到错误

第一种方法

#include <AsmMacroIoLibV8.h>

var1 .8byte 0xdedededef1f1f1f1

ASM_FUNC(CompareValues)
  ldr    x1,=var1

  cmp x1,#dedededef1f1f1f1
  b.ne  error
  mov   x0,#0             
  ret

error:
  mov x0,x1
  ret

但是当我开始编译代码时,我收到了消息:“错误:立即超出范围”。

我还更改了代码以从 cmp 指令中删除立即数,如下所示:

第二种方法

#include <AsmMacroIoLibV8.h>

var1 .8byte 0xdedededef1f1f1f1
var2 .8byte 0xdedededef1f1f1f1

ASM_FUNC(CompareValues)
  ldr    x1,=var1
  ldr    x2,=var2

  cmp x1,x2
  b.ne  error
  mov   x0,x1
  ret

在这方法中,我可以编译代码,但是当我运行代码时,我得到的值不为零(0xF03730B4)。这是我的C 代码

/** @file
 * EntryPoint.c
 * Poc ASM application  
 **/
#include <Uefi.h>
#include <Library/UefiLib.h>

UINT64 CompareValues();

/** Entry point for the application.
 *
 * @param[in] ImageHandle    The firmware allocated handle for the EFI image.
 * @param[in] SystemTable    A pointer to the EFI System Table.
 *
 * @retval EFI_SUCCESS       The entry point is executed successfully.
 * @retval other             Some error occurs when executing this entry point.
 **/
EFI_STATUS
EFIAPI
PocAsm_EntryPoint 
(
  IN EFI_HANDLE        ImageHandle,IN EFI_SYstem_TABLE* SystemTable
)
{
  UINT64 CmpVal = 0;

  CmpVal = CompareValues();
  Print(L"Result: %llx\n",CmpVal);
  return EFI_SUCCESS;
}

最后,如果我在第一种方法中使用像 #0xff 这样的小立即数,一切正常。有什么办法可以使这种比较有效吗?如果我遗漏了什么,我不会。

谢谢各位。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。