深入理解计算机系统题目:

1
2
3
4
arc_t *sp; // 使用typedef声明的数据类型
dest_t *dp;
我们想使用适当的数据传送指令来实现下面的操作
*dp = (dest_t) *sp;

假设 sp 和 dp 的值分别存储在寄存器 %rdi 和 %rsi 中。对于表中的每个表项,给出实现指定数据传送的两条指令。其中第一条指令应该从内存中读数,做适当的转换,并设置寄存器 %rax 的适当部分。然后,第二条指令要把 %rax 的适当部分写到内存。在这两种情况中,寄存器的部分可以是 %rax、%eax、%ax 或 %al,两者可以互不相同。

记住,当执行强制类型转换既涉及大小变化又涉及 C 语言中符号变化时,操作应该先改变大小。

src_t dest_t 指令 解释
long long movq (%rdi), %rax
movq %rax, (%rsi)
long是八个字节,也就是四个双字,所以用q
char int movsbl (%rdi), %eax
movl %eax, (%rsi)
char转化成int需要进行字节长度拓展,而且char是有符号的,有符号拓展成有符号类型时,需要进行符号拓展
char unsigned movsbl (%rdi), %eax
movl %eax, (%rsi)
char有符号数拓展成无符号型类型的数据时,需要注意,先进行符号拓展,然后转化成无符号数时,只是解释发生改变,机器数并不变
unsigned char long movzbl (%rdi), %eax
movq %rax, (%rsi)
无符号数进行零拓展
int char movl (%rdi), %edx
movb %al, (%rsi)
有符号数截断
unsigned unsigned char movl (%rdi), %al
movb %al, (%rsi)
截断是直接截断,机器数都是一样的,有无符号只是解释不同
char short movsbw (%rdi), %ax movw %ax, (%rsi) 符号拓展