# 2018q3 第 9 週測驗題 (上)
### 測驗 `1`
假設 `%rax` 暫存器內含值為 `0x100`,而且 `%rbx` 暫存器內含值為 `0x10`,那麼在 `movq 2(%rax,%rbx,4), %rcx` 這道指令執行後,`%rcx` 暫存器內含值應該為何?
==作答區==
Q2 = ?
* `(a)` 0x142
* `(b)` 0x112
* `(c)` 0x124
* `(d)` 存於記憶體位址 `0x124` 的 64-bit 數值
* `(e)` 存於記憶體位址 `0x142` 的 64-bit 數值
* `(f)` 存於記憶體位址 `0x112` 的 64-bit 數值
* `(g)` 沒有固定結果
### 測驗 `2`
考慮以下組合語言程式:
```
leaq (%rax, %rbx), %rcx
subq %rax, %rcx
subq %rbx, %rcx
```
當執行後,狀態碼 ZF 和 SF 的可能數值為何?
==作答區==
Q5 = ?
* `(a)` ZF = 0, SF = 0
* `(b)` ZF = 1, SF = 0
* `(c)` ZF = 0, SF = 1
* `(d)` ZF = 1, SF = 1
## 測驗 `3`
考慮以下 C 程式:
```C
long foo(long x, long y) {
while (x >= 0) {
y -= 2; x += y;
}
return x;
}
```
在忽略 integer overflow/underflow 的前提,在下方找出可能的組合語言輸出。
- [ ] X
```
foo:
cmpq $0, %rdi
jl end
subq $2, %rsi
addq %rsi, %rdi
jmp foo
end:
movq %rdi, %rax
ret
```
- [ ] Y
```
foo:
cmpq $0, %rdi
jge end
start:
subq $2, %rsi
addq %rsi, %rdi
jge start
end:
movq %rdi, %rax
ret
```
- [ ] Z
```
foo:
addq $0, %rdi
jmp middle
start:
subq $2, %rsi
addq %rsi, %rdi
middle:
jge start
end:
movq %rdi, %rax
ret
```
==作答區==
Q3 = ?
* `(a)` X Y
* `(b)` X Z
* `(c)` Y Z
* `(d)` Y