---
# System prepended metadata

title: 'linux2021: bitter-bits'

---

# linux2021: bitter-bits

## 測驗 $\alpha - 1$

延伸問題 2. x86_64 指令集具備 rotr 和 rotl 指令，上述 C 程式碼經過編譯器最佳化 (例如使用 gcc) 後，能否運用到這二個指令呢？

Ans: The generated assembly code shows `ror{bwlq}` and `rol{bwlq}` are used
```asm=
rotr64:
    pushq	%rbp
       :
    rorq	%cl, %rdx
       :
    ret

rotl64:
    pushq	%rbp
       :
    rolq	%cl, %rdx
       :
    ret
```
The command:
```sh=
gcc -S -o asm.s alpha.c
```

## 測驗 $\beta - 1$

延伸問題 1. 說明上述程式碼的運作原理

```c=
    uintptr_t mask = alignment - 1;
    if ((alignment & mask) == 0) {
        return (sz + mask) & !mask;
    }
    return (((sz + mask) / alignment) * alignment);
```

Ans: 當對齊值與「對齊值減去 1」的 AND 運算之後的結果為零，表示「對齊值」是 2 的零或正整數次方，比如 2^5^ 的例子：

```
  0010 0000 (十進位的 32)
& 0001 1111 (32 - 1 = 31)
= 0000 0000
```
接下來的

```
(sz + mask) & !mask
```

將 sz 加上 mask (右側全為 1) 強迫進一位，再用 !mask (左側全為 1 ，右側全為 0) 清除該右側的全部位元。
:::warning
TODO: 思考二補數原理，寫出功能相等的程式碼
:notes: jserv
:::
