36得票4回答
如何计算跳转目标地址和分支目标地址?

我对汇编语言还很陌生。我正在阅读关于MIPS架构的资料,但是我对跳转目标地址和分支目标地址以及如何计算它们感到困惑。

35得票3回答
如何阅读英特尔操作码符号表示法

我正在阅读一些材料,引用了Intel的vol.2 SDM x86手册关于操作码和汇编指令的机器代码编码,但我不明白像cw、cd、/2、cp或/3这样的内容跟随操作码字节后面是什么意思。 这是一些x86汇编语言中的CALL指令的不同形式。它们允许程序跳转到一个子程序(或函数)并在完成后返回到调...

20得票3回答
如何在x86中编码相对较短的jmp

假设我想要使用EB操作码进行短跳转,jmp rel8表示短跳转Intel手册中的相关条目: EB CB 或 JMP rel8 "短跳转,RIP = RIP + 8位位移符号扩展到64位" (其中CB是一个有符号的字节,表示与EIP寄存器中方向相关的相对偏移量) 在这个短...

18得票2回答
有没有一种x86指令,可以将一个立即字节移动到一个直接的内存位置(不使用寄存器)?

有没有一种方法可以将特定的立即字节大小的数字移动到直接内存位置中?例如:MOV 10h,ffffh 我需要将值16写入内存地址65535,应该使用哪个操作码?还是需要先将内存地址存储到寄存器中再进行操作?

13得票3回答
x86-64的jmpq指令为什么只需要32位长度地址?

当我使用objdump -D来反汇编一个二进制文件时,典型的jmpq代码如e9 7f fe ff ff,用于表示负偏移量。但是,x86-64的地址是64(48)位(据我所知),那么这个32位的地址7f fe ff ff如何表示64位绝对地址的负偏移量? 此外,是否有其他像jmp和jmpq一样...

13得票1回答
CPU如何区分'CALL rel16' (E8 cw)和'CALL rel32' (E8 cd)?

CPU如何区分CALL rel16(E8 cw)和CALL rel32(E8 cd)? 根据this site所述,参照英特尔架构手册,CALL rel16和CALL rel32的操作码分别为E8 cw和E8 cd。 这让我想知道,CPU如何区分这些操作码,因为E8 cw可能是E8 cw的...

12得票7回答
如何确定x86指令的长度?

我在研究汇编语言中的不同指令,但对于如何确定不同操作数和操作码的长度感到困惑。 这是一些需要通过经验来了解的东西吗?还是有办法找出哪种操作数/运算符组合占用了多少字节? 例如:push %ebp ; takes up one byte mov %esp, %ebp ; takes up t...

10得票2回答
如何根据十六进制机器码确定x86指令的操作数大小?

例如,给定一个十六进制数:83 E4 F0 通过查看Intel开发者手册,我可以得出 83 表示 and ,F0表示-16。观察E4,可以解码源/目的地寄存器是SP或ESP。 因此,我可以得出结论,该十六进制数表示and $-16,% ESP 或and $-16,% SP 。但是,在手册中...

9得票1回答
指令解码器如何区分前缀和主操作码?

我正试图理解x86指令编码格式。我读过的所有来源仍然让这个主题很困惑。我开始有点明白了,但我遇到了一个难以理解的问题,那就是CPU指令解码器如何区分操作码前缀和操作码。 我知道指令的整个格式基本上取决于操作码(当然,在操作码中定义了额外的位字段)。有时指令没有前缀,而操作码是第一个字节。解码...

8得票1回答
x86的XOR操作码差异

查看http://ref.x86asm.net/coder32.html,我发现有两个与语句 xor eax,eax 匹配的操作码: 1) 操作码31 XOR r/m16/32 r16/32 2) 操作码33 XOR r16/32 r/m16/32 这两...