Memory asm内存位置操作数的使用

Memory asm内存位置操作数的使用,memory,assembly,x86,yasm,Memory,Assembly,X86,Yasm,我对“内存位置”的定义有问题。根据《英特尔64和IA-32软件开发人员手册》,许多指令可以使用内存位置作为操作数。 例如MOVBE(交换字节后移动数据): 说明:MOVBE m32、r32 现在的问题是如何定义内存位置; 我尝试使用.bss部分中定义的变量: section .bss memory: resb 4 ;reserve 4 byte memorylen: equ $-memory section .text global _start _star

我对“内存位置”的定义有问题。根据《英特尔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

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

更新:尽管上述情况属实,但此处的
非法指令
更可能是由于您的cpu不支持
MOVBE
指令,因为并非所有指令都支持。如果您查看引用,您可以看到它在CPUID.01H:ECX.MOVBE[bit 22]=0时显示为
#UD。
它试图告诉您
CPUID
指令的
01
叶返回的
ECX
寄存器中的特定标志位表示支持此指令。如果您在linux上,您可以方便地检查
/proc/cpuinfo
是否具有
movbe
标志

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


哦,还有+1用于阅读英特尔手册;)

@CraigAnderson
R9
的低位32位。谢谢@Jester。供大家参考-我问什么是R9D,但后来删除了它。我忘记复制返回部分,但它存在于编译的代码中-对此表示抱歉。我会立即更新上面的代码。指定大小对SHR起作用。谢谢你的帮助!你也知道为什么MOVBE会出现非法指令吗?哇-谢谢你的快速帮助。这个论坛令人难以置信。如您所述,没有>movbe<标志。