【发布时间】:2015-06-13 13:19:32
【问题描述】:
我正在阅读《计算机系统:程序员的视角》一书。现在我不确定我是否理解何时使用不同的 mov 指令。这是练习:
练习题 3.4
假设变量 v 和 p 声明了类型
src_t v;
dest_t *p;
其中 src_t 和 dest_t 是使用 typedef 声明的数据类型。我们希望 使用适当的数据移动指令来实现 操作
*p = (dest_t) v;
其中 v 存储在寄存器 %eax 的适当命名部分中 (即 %eax、%ax 或 %al),而指针 p 存储在寄存器 %edx 中。
对于以下src_t和dest_t的组合,写一行 进行适当传输的汇编代码。回想一下,当 执行一个涉及尺寸变化和变化的演员表 C中的“签名”,操作应首先更改签名 (第 2.2.6 节)。
我正在对照 this blog post 检查我的解决方案,但我不太确定我是否理解问题 3:
src_t dest_t My Solution Blog's Solution
char unsigned movzbl %al, (%edx) movsbl %al, (%edx)
第 3 点:我使用 movzbl,而博客作者使用 movsbl。在这种情况下,我不明白 movzbl 与 movsbl 的推理......如果 char 是负数,那么无论哪种方式,你最终都会得到一个错误的数字,任何人都可以澄清为什么 movsbl 是正确的选择吗?
【问题讨论】:
-
这完全取决于
char是签名还是未签名。这是实现定义的,因此在匹配实现的情况下,两种解决方案同样正确。 -
@Jester 我认为
char在这种情况下是签名的,其他问题有unsigned char所以我认为缺少它意味着这个是签名的。 -
如果
char被签名,则需要使用movsbl签名扩展。例如,如果您的 char 值为-1,您希望unsigned int值为0xffffffff(这是 C 标准规定的)。 -
我明白了……我不太清楚这种情况下的规则是什么。感谢您的帮助
标签: c assembly casting x86 mov