Memory asm内存位置操作数的使用
我对“内存位置”的定义有问题。根据《英特尔64和IA-32软件开发人员手册》,许多指令可以使用内存位置作为操作数。 例如MOVBE(交换字节后移动数据):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
说明: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<标志。