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

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

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

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

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