汇编语言IA32 - 将char移动到int

时间:2015-01-08 00:58:52

标签: assembly x86

CSAPP 练习3.4

src_t v;
dest_t *p;

*p = (dest_t) v;

src_tchardest_tint时,答案为

movsbl %al, (%edx)

v存储在%eax%ax%alp存储在%edx中。如果src_tchardest_tunsigned,则答案为

movsbl %al, (%edx)

movsbl类型为非负数时,为什么我们必须使用movzl而不是char

1 个答案:

答案 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,默认签名可能不同。