关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]
Posted
技术标签:
【中文标题】关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]【英文标题】:Question regarding converting assembly to c -- specifically what the movzbl instruction does? [duplicate] 【发布时间】:2020-10-15 22:02:06 【问题描述】:我试图弄清楚汇编中的 this 在 C 中的含义:
movq 16(%rdi), %rdx
movq 16(%rsi), %rax
movzbl (%rdx), %edx
我很困惑 movzbl (%rdx), %edx 会做什么。谢谢!
【问题讨论】:
好吧,这就是movq
所做的:***.com/a/3852919/8658157,而这对于movzbl
:***.com/a/9318005/8658157
movzbl (%rdx), %edx
从内存地址 [rdx] 读取单个字节,零扩展字节,使其为 32 位宽,高 24 位设置为零,并将其存储在 EDX 中。同样,它还将 32 位 EDX 寄存器扩展到整个 RDX 寄存器(它将 RDX 的高 32 位设置为 0),因为在 64 位模式下,当目标寄存器是 32 位寄存器时,高 32-相应的 64 位寄存器的位由 CPU 自动设置为零。本质上,它从 [RDX] 中读取一个字节,并将 RDX 的低字节设置为读取的字节,并确保高 56 位为零。
【参考方案1】:
这是AT&T syntax 的movzx
指令。它从%rdx
中包含的地址中取出一个字节,将其零扩展为32 位,并将结果存储在%edx
中。
与写入 32 位寄存器的每条 x86-64 指令一样,the high half of the corresponding 64-bit register %rdx
is also zeroed. 因此,您也可以将此指令视为将 8 位值零扩展为 64 位。
【讨论】:
我认为值得一提的是,RDX 的高 32 位也由 CPU 自动设置为零,因为目标 (EDX) 是一个 32 位寄存器。最终结果确实是RDX的低8位设置为字节读取,高56位设置为0以上是关于关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章