【问题标题】:Achieve C casting using x86 mov instructions使用 x86 mov 指令实现 C 转换
【发布时间】: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


【解决方案1】:

回想一下,当执行一个涉及大小变化的演员表时 和 C 中“签名”的变化,操作应该改变 签名优先(第 2.2.6 节)。

除非我看错了,否则这句话似乎与他给出的正确答案相冲突。

这条规则意味着,从signed char开始:

  • 签名字符
  • -> 无符号字符
  • -> 无符号整数

所以大小转换是从 unsigned char 到 unsigned int,所以movz 是合适的。大概规则是错误的(与 C 实际指定的不匹配),movs 确实是 C 编译器会使用的。

Jester 的评论说 -1 char 值的 unsigned int 值必须是 0xffffffff,所以看起来练习题的最后一句关于转换符号和大小的顺序是问题。

【讨论】:

  • 图书勘误表:练习题 3.4。问题陈述的最后一句应该说明“......操作应该先改变大小......”
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多