在 CSAPP 练习3.4
中src_t v;
dest_t *p;
*p = (dest_t) v;
当src_t
为char
且dest_t
为int
时,答案为
movsbl %al, (%edx)
(v
存储在%eax
或%ax
或%al
,p
存储在%edx
中。如果src_t
为char
而dest_t
为unsigned
,则答案为
movsbl %al, (%edx)
太
当movsbl
类型为非负数时,为什么我们必须使用movzl
而不是char
?
答案 0 :(得分:2)
扩展指令的选择反映了字符类型的符号。
gcc可让您控制字符的签名,这样您就可以轻松查看为每种可能性产生的转化次数。
来源:
unsigned char_to_int(char *s) {
return *s;
}
默认输出:
movl 4(%esp), %eax
movsbl (%eax), %eax
ret
使用-funsigned-char
输出:
movl 4(%esp), %eax
movzbl (%eax), %eax
ret
使用-fsigned-char
输出:
movl 4(%esp), %eax
movsbl (%eax), %eax
ret
请记住,这仅仅是一个平台上一个编译器的输出。对于不同的编译器或在不同平台上运行的gcc,默认签名可能不同。