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效率,選擇了第二種答案。
