关于将程序集转换为 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 指令的作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将 C 代码转换为 x86-64 程序集

将 MIPS 程序集转换为 C

将 C 代码转换为 x86-64 位程序集?

C ++会首先转换为程序集吗?

关于C语言的问题。设计一个程序,根据用户的选择,将1、日期转换为天数2、将天数转换为日期。

将代码从基数R转换为dplyr,特别是添加变量