究竟是什么指示
movzbl 0x01(%eax,%ecx),%eax
Run Code Online (Sandbox Code Playgroud)
呢?
Igo*_*sky 38
AT&T语法将movzx
英特尔指令助记符分成不同的助记符,用于不同的源大小(movzb
vs. movzw
).在Intel语法中,它是:
movzx eax, byte ptr [eax+ecx+1]
Run Code Online (Sandbox Code Playgroud)
即从eax + ecx + 1的内存加载一个字节,并将零扩展到完整寄存器.
顺便说一句,大多数GNU工具现在都有一个开关或配置选项来选择英特尔语法.(例如,objdump -Mintel
或者gcc -S -masm=intel
,虽然后者影响编译inline-asm时使用的语法).如果你不做AT&T组装生活,我肯定会建议调查一下.有关更多文档和指南,另请参阅x86标记wiki.
Cir*_*四事件 20
最小的例子
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */
mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */
Run Code Online (Sandbox Code Playgroud)
助记符是:
还有其他尺寸的版本:
movzbw
:字节(8位)到Word(16位)movzwl
:字(16位)到长(32位)与大多数GAS指令一样,在处理寄存器时可以省略最后一个大小字符:
movzb %bl, %eax
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么我们不能省略前一封信,例如以下失败:
movz %bl, %eax
Run Code Online (Sandbox Code Playgroud)
为什么不在它们是寄存器mov
和英特尔语法的情况下从操作数的大小推导出它?
如果您使用错误大小的寄存器,则无法编译,例如:
movzb %ax, %eax
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52910 次 |
最近记录: |