汇编语言 IA32 - 将 char 转换为 int

Assembly language IA32 - move char to int

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)

也是。

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

扩展指令的选择反映了字符类型的符号。

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