Errata for CS:APP3e and its Instructors Manual
http://csapp.cs.cmu.edu/3e/errata.html
习题3.3
第一行错误的原因,答案解释是 cannot use %ebx as address register 。
解释是:从后面几行可以看出来,这是一台64位机器。当你知道你的地址在32位范围内时,在64位机器上使用32位寄存器寻址是可以的。但通常情况下,堆栈不是,因此(%ebx)是危险的。
参考资料: https://stackoverflow.com/questions/31633075/error-moving-a-constant-byte-value-into-ebx
习题3.4
练习mov指令,熟悉数据强制类型转换的操作。
当执行强制类型转换既涉及大小变化又涉及C语言中符号变化时,操作应先改变大小。
符号变化指unsigned变化,大小变化指字节大小变化。
unsigned char -> long
第一个是无符号数,第二个是有符号数,第一个是一字节,第二个是4字,根据上面的原则应该先改变大小,
movzbq (%rdi),%rax movq %rax,(%rsi)
而答案是
movzbl(%rdi),%eax movq %rax,(%rsi)
问了助教,说两种都可以。网上有一种说法是,因为movzbl movzbq的效率不同,所以为了优化cpu效率,选择了第二种答案。