汇编语言 IA32 - 将 char 转换为 int
Assembly language IA32 - move char to int
在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)
也是。
当 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 运行,默认签名可能不同。
在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)
也是。
当 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 运行,默认签名可能不同。