这是什么movsbl指令?
问题描述:
相关:what does movsbl instruction do?
在拆卸程序,我发现一个非常奇特的指令:
0x0000000000401106: movsbl (%rbx,%rax,1),%ecx
我想我知道什么movs BL确实:它基本上扩展了一个字节并将其中的前导(扩展符号)添加到寄存器中。
但是我完全不知道它在上面的上下文中使用它时会发生什么。
任何照亮这条指令的灯光都将非常感谢!
答
指令
movsbl <%rbx,%rax,1>,%ecx
读取从由所述第一操作数寻址的存储器位置的一个字节,符号扩展字节到32位,并且将结果存储在寄存器ecx
。
现在到<%rbx,%rax,1>
。这只是表示通过将rbx
和rax
的值相加形成的存储器地址。如果您想知道,1
是适用于rax
的乘数。
答
该指令从地址rbx+rax
加载一个字节,并将符号扩展为ecx
。请注意,符号扩展会将源的最重要位复制到目标的最高位,因此它并不总是“前导位”。这是因为当解释为2的补码有符号数时,该值不会改变。
哪个反汇编?我假设''应该是'('和')',它只是一个普通的“地址为RBX + RAX的符号扩展字节* 1到32位并存储在RCX中”指令。 – Brendan
注意:具有讽刺意味;数据移入ECX导致RCX的高32位被清零;所以这条指令实际上会从8位扩展到32位,然后从32位扩展到64位...... :-) – Brendan