首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MOVZBL指令在IA-32 AT&T语法中做什么?

MOVZBL指令在IA-32 AT&T语法中做什么?
EN

Stack Overflow用户
提问于 2012-02-16 19:38:55
回答 2查看 85.5K关注 0票数 47

这个指令到底是做什么的?

代码语言:javascript
运行
复制
movzbl  0x01(%eax,%ecx), %eax
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-16 19:44:52

AT&T语法将英特尔指令助记符划分为不同源大小的不同助记符(movzbmovzw)。在Intel语法中,它是:

代码语言:javascript
运行
复制
movzx eax, byte ptr [eax+ecx+1]

也就是说,从eax+ecx+1的内存加载一个字节,零扩展到完全寄存器.

顺便说一句,大多数GNU工具现在都有一个开关或配置选项来选择Intel语法。(例如objdump -Mintelgcc -S -masm=intel,尽管后者会影响编译内联-asm时使用的语法)。如果你不为生活做AT&T装配,我当然会建议你去调查一下。有关更多的文档和指南,请参见x86标记wiki。

票数 50
EN

Stack Overflow用户

发布于 2015-06-29 11:56:32

极小示例

代码语言:javascript
运行
复制
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */

mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */

带有断言的Runanble GitHub上游

助记符是:

  • MOV
  • 零扩展
  • 字节(8位)
  • 到长(32位)

也有其他尺寸的版本:

  • movzbw:字节(8位)到字(16位)
  • movzwl:字(16位)到长(32位)

与大多数GAS指令一样,您可以在处理寄存器时省略最后一个大小字符:

代码语言:javascript
运行
复制
movzb %bl, %eax

但我不明白为什么我们不能省略前一封信,例如:

代码语言:javascript
运行
复制
movz %bl, %eax

当操作数是寄存器时,为什么不从操作数的大小来推断它,比如mov和Intel语法?

如果使用错误大小的寄存器,则无法编译,例如:

代码语言:javascript
运行
复制
movzb %ax, %eax
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9317922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档