linux - 计算要获取的字节数,汇编

标签 linux assembly fetch disassembly

我正在计算“获取”需要多少字节。

我正在用汇编编写这段代码

jmp [2*eax]

列表文件中的命令是3个字节。

当我写这个命令时:

jmp [4*eax]

我得到了 7 个字节

有人知道为什么吗?

最佳答案

我怀疑你的汇编器很聪明,正在将 jmp [2*eax] 编码为 jmp [eax+eax] ,因为它不需要占用更少的字节需要位移。而 jmp [4*eax] 实际上等同于 jmp [4*eax+0x00000000],后者需要额外的 4 个字节用于位移。

它与 SIB(缩放索引字节)的工作有关。通常,这会以 base + index*scale + displacement 的形式对地址进行编码。 位移 是可选的,但前提是包含基数 寄存器。如果你想离开 base 寄存器,那么你必须包含一个 32 位 displacement

因此,要获得 eax*4,您需要使用 index*4 + displacement 的形式,即使您不需要那个 displacement .但是要获得 eax*2,您可以使用 base + index*scale 的形式(即 eax+eax*1),并且不必包含 位移.

关于linux - 计算要获取的字节数,汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392997/

相关文章:

assembly - defuse.ca 在线 GAS 汇编器接受 movb 和 movw 的 AT&T 语法,但不接受 movl?

javascript - `fetch` 请求未显示所需结果,`ajax` 请求显示所需结果

Git:从命名远程获取和从 URL 获取有什么区别?

linux - 如何使用 inittab 自动重启 PHP 程序?

linux - 从 Windows 客户端连接到 Ubuntu 18.04,安装的 Samba 无法正常工作

java - 从 java 执行命令时使用 bash 函数

assembly - 为什么进入保护模式后prefetch queue要失效?

c - 我如何在汇编中编写所有这些

java - Spring 数据JPA : findAll with Specification and Pageable fails on count query

python - 由于目录权限无法安装 python egg