# 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