x86指令“MOVB $ 5中,分别为(1)“

问题描述 投票:3回答:1

我读的AT&T语法x86汇编的tutorial,我遇到了这个指令

movb $5, var(,1) - 值5存储到在位置变种字节。

什么(,1) var指示后?什么是这样的后缀一般语法?

assembly x86 att
1个回答
3
投票

这是标新立异的风格,至少可以说,我从来没有见过任何人,之前写的,用于解决静态标签没有寄存器。


这可能是试图指示SIB字节(无基座或索引),而不是允许汇编使用较短的编码,只需ModRM字节。

(是的,这是可能的。32位寻址模式具有2点冗余的方式来编码[disp32]绝对地址。X86-64重新定义了较小者做为RIP相对寻址参见rbp not allowed as SIB base?

但是,目前的天然气忽略它,并对其进行编码一样只是var

因此,也许这是提醒你,这是内存操作,像往常一样在Intel的语法,而不是[var](这是英特尔的语法MASM风格的味道,如GNU mov var, al有效的,但不是NASM)使用.intel_syntax的尝试。

什么是这样的后缀一般语法?

或者,也许他们只是在做它总是使用存储器操作数的disp(basereg, idxreg, scale)语法,省略未利用部分的一致性。


测试来源:

var:                  # this won't be in writeable memory, it will assemble but not run
movb  $5, var
movb  $5, var(,1)
movb  $5, (var)      # turns out this is valid, too!

#movb $5, var(%rip)  # RIP-relative is x86-64 only, but it's recommended when available.

# movb  $5, var()     # Error: junk `()' after expression
# movb  $5, (var,,1)  # also invalid
# movb  $5, (var,%ecx,1)       # also invalid.
# movb  $5, (var+%eax,%ecx,1)  # also invalid.

as --version打印GNU assembler (GNU Binutils) 2.31.1我的系统上。

$ gcc -m32 -no-pie -nostdlib foo.s
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008049000
 # I just wanted a linked binary with real addresses filled in, not to run it.
 # entry = start of the .text section is fine.

$ objdump -drwC -Mintel a.out

08049000 <var>:
 8049000:       c6 05 00 90 04 08 05    mov    BYTE PTR ds:0x8049000,0x5
 8049007:       c6 05 00 90 04 08 05    mov    BYTE PTR ds:0x8049000,0x5
 804900e:       c6 05 00 90 04 08 05    mov    BYTE PTR ds:0x8049000,0x5

锵7.0内置的汇编程序还接受所有3个变型气体确实,使得相同的二进制文件。 (至少我在拆卸.text部分;在另一部分可能是一些差异的地方。)


因此,或许cmp $1, (var)是使存储器操作数显式的好办法?但它不是很大,因为与英特尔的语法,你不能只是增加寄存器的是,你必须移动var的括号内。

© www.soinside.com 2019 - 2024. All rights reserved.