使用x86 mov指令实现C转换

时间:2015-04-08 14:10:01

标签: c assembly casting x86 mov

我正在读这本书"计算机系统:程序员的视角"。现在我不确定我何时理解何时使用不同的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号:我​​在博客作者使用movsbl时使用movzbl。在这种情况下,我不理解movzbl vs movsbl的推理...如果char是否定的,你最终会以错误的数字结束,有人可以澄清为什么movsbl在这里是正确的选择吗?

1 个答案:

答案 0 :(得分:1)

  

回想一下,当执行涉及尺寸变化的演员表时   并且在C中改变“签名”,操作应该改变   首先签署(第2.2.6节)。

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

该规则意味着,从signed char:

开始
  • signed char
  • - > unsigned char
  • - > unsigned int

因此,大小转换是从unsigned char到unsigned int,因此movz是合适的。据推测,规则是错误的(与C实际指定的不匹配),movs确实是C编译器将使用的。

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