的存储器位置的操作数的asm用法(asm usage of memory location oper

2019-10-21 06:53发布

我在与定义“存储位置”的麻烦。 按照“英特尔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

<-edit
如果SHR被注释掉YASM(YASM -f ELF64 .ASM)编译没有问题,但执行标准输入输出显示了当: 非法指令
如果MOVBE被注释掉编译时会出现以下错误: 错误:无效的大小操作数1

我该如何要使用由指令集参考所示的“M”选项分配内存?
[CPU = 64,编译= YASM]

Answer 1:

如果这是所有的代码,你是在年底为未初始化区域脱落,所以你会得到一个错误。 这已无关,与分配的内存,你做得对。 您需要添加代码,使用exit系统调用来终止程序,或至少把一个死循环,所以你避免故障(使用杀你的程序ctrl+c或同等学历)。

更新:虽然上述为真,则illegal instruction这里更可能的事实,你的cpu根本不支持造成MOVBE指令,因为不是所有的事。 如果您在参考看看,你可以看到它说#UD If CPUID.01H:ECX.MOVBE[bit 22] = 0.这是想告诉你的是,在一个特定的标志位ECX寄存器中返回的01叶在CPUID指令表明支持该指令。 如果你是在Linux上,你可以方便地检查中/proc/cpuinfo你是否有movbe标志或没有。

而对于无效数大小:通常应指定操作数的大小,当它不能从指令推断。 这就是说, SHR接受所有的大小(字节,字,双字,四字),所以你应该真的不得到这个错误在所有,但你可能会得到意想不到的默认大小的操作。 您应该使用SHR dword [memory], 1在这种情况下,这也使得yasm高兴。

哦,1用于读取英特尔手册)



文章来源: asm usage of memory location operands