【问题标题】:asm usage of memory location operandsasm 使用内存位置操作数
【发布时间】:2014-11-16 02:05:26
【问题描述】:

我在定义“内存位置”时遇到了麻烦。根据“英特尔 64 和 IA-32 软件开发人员手册”,许多指令可以使用内存位置作为操作数。 例如 MOVBE(交换字节后移动数据):
指令:MOVBE m32, r32

现在的问题是如何定义内存位置; 我尝试使用 .bss 部分中定义的变量:

section .bss
    memory: resb 4          ;reserve 4 byte
    memorylen: equ $-memory

section .text
global _start

_start:
    MOV R9D, 0x6162630A
    MOV [memory], R9D
    SHR [memory], 1
    MOVBE [memory], R9D

编辑:->

    MOV EAX, 0x01
    MOV EBX, 0x00
    int 0x80

如果 SHR 被注释掉 yasm (yasm -f elf64 .asm) 编译没有问题,但执行 stdio 时显示:非法指令
如果 MOVBE 被注释掉,编译时会出现以下错误:error: invalid size for operand 1

如何为使用指令集参考中显示的“m”选项分配内存?
[CPU=x64,编译器=yasm]

【问题讨论】:

  • @CraigAnderson R9 的低 32 位。
  • 谢谢@Jester。仅供参考 - 我问 R9D 是什么,但后来删除了它。

标签: memory assembly x86 yasm


【解决方案1】:

如果这就是您的全部代码,那么您最终会掉入未初始化的区域,因此您会遇到错误。这与分配内存无关,您做得对。您需要添加代码以使用退出系统调用终止您的程序,或者至少放置一个无限循环以避免错误(使用ctrl+c 或等效方法终止您的程序)。

更新:虽然上述情况属实,但这里的illegal instruction 更可能是由于您的cpu 根本不支持MOVBE 指令,因为并非所有人都支持。如果您查看参考资料,您可以看到它说 #UD If CPUID.01H:ECX.MOVBE[bit 22] = 0. 这试图告诉您 CPUID 指令的 01 叶返回的 ECX 寄存器中的特定标志位显示支持该指令.如果你在linux上,你可以方便地检查/proc/cpuinfo是否有movbe标志。

关于无效的操作数大小:当无法从指令中推导出操作数大小时,一般应指定操作数大小。也就是说,SHR 接受所有大小(字节、字、dword、qword),所以你根本不应该得到那个错误,但你可能会得到一个意外的默认大小的操作。在这种情况下,您应该使用SHR dword [memory], 1,这也让yasm 高兴。

哦,阅读英特尔手册 +1 ;)

【讨论】:

  • 我忘记复制返回部分,但它存在于编译的代码中 - 抱歉。我会立即更新上面的代码。指定大小对 SHR 有用。感谢您的帮助!你也知道为什么 MOVBE 会显示非法指令吗?
  • 哇 - 感谢您的快速帮助。这个论坛太不可思议了。正如你所描述的,没有 >movbe
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2019-06-02
  • 1970-01-01
  • 2019-08-29
相关资源
最近更新 更多