Bài viết này mình sẽ chia sẻ các bạn file bài tập ôn tập lập trình hệ thống của Trường ĐH Công nghệ thông tin (UIT).
File tải mình để ở cuối bài viết nhé.
Bài 1. Thực hiện các phép chuyển đổi và tính toán.
a. Chuyển các số hexa sang hệ nhị phân:
- 0x39A7F816
- 0xD5E4C16
b. Chuyển số nhị phân sang hệ hexa (16):
- 1100100101110112
- 1001101110011101101012
c. Thực hiện tính toán:
- 0x506 + 0x12
- 0x503C – 0x42 = 0x4FFA
- 0x6653 + 98 = 0x6653 + 0x62
Bài 2. Cho đoạn chương trình.
/* Biến val gồm 4 byte đánh thứ tự từ 1 đến 4 */
int val = 0x87564321;
/* pointer trỏ đến ô nhớ lưu trữ biến val */
byte_pointer valp = (byte_pointer) &val;
/* A. hàm trả về byte thứ 1 kể từ địa chỉ ô nhớ */
show_bytes(valp, 1);
/* B. hàm trả về byte thứ 2 kể từ địa chỉ ô nhớ */
show_bytes(valp, 2);
Kết quả trả về của 2 hàm show_bytes() sẽ khác nhau như thế nào trong trường hợp chạy trên hệ thống sử dụng little-endian và big-endian?
Bài 3. Giả sử có các giá trị sau đang được lưu trong các ô nhớ và các thanh ghi:
a. Hãy điền vào hình minh hoạ bên dưới các địa chỉ và giá trị tương ứng của các ô nhớ.
b. Giả sử ta có câu lệnh movl [toán hạng x], %ebx để lấy giá trị dựa trên toán hạng x và đưa vào %ebx. Dựa vào các giá trị trong ô nhớ và thanh ghi ở trên, điền các giá trị sẽ lấy được nếu sử dụng các toán hạng sau:
- %eax
- 0x104
- $0x108
- (%eax)
- 4(%eax)
- 9(%eax, %edx)
- 0xFC(,%ecx,4)
- (%eax, %edx, 4)
c. Điền vào chỗ trống ảnh hưởng của những câu lệnh dưới đây, bao gồm thanh ghi/ô nhớ nào bị thay đổi giá trị và giá trị đó là bao nhiêu?
Câu lệnh | Thanh ghi/ô nhớ bị thay đổi | Giá trị |
addl %ecx, (%eax) | Ô nhớ có địa chỉ 0x100 | 0xFF + 0x1 = 0x100 |
lmull $16, (%eax, %edx, 4) | Ô nhớ có địa chỉ ………. | ………… |
sub %edx, %eax | Thanh ghi %eax | ………… |
movl (%eax, %edx, 4), %eax | Thanh ghi %eax | ………… |
leal (%eax, %edx, 4), %eax | Thanh ghi %eax | ………… |
Bài 4. Giả sử người lập trình mong muốn tạo ra mã assembly của hàm C sau:
int shift_left2_rightn (int x, int n) {
x <<= 2;
x >>= n;
return x;
}
Cho đoạn mã assembly bên dưới thực hiện việc dịch bit và đưa giá trị cuối cùng của x vào thanh ghi %eax. Biến x và n được đặt ở các vị trí %ebp + 8 và %ebp + 12. Hãy điền các câu lệnh assembly còn thiếu để thực hiện đúng chức năng của hàm C trên.
- movl 8(%ebp), %eax // %eax = x //x=x<<2
- ………… // %ecx = n
- movl 12(%ebp), %ecx. // do sarl chỉ hỗ trợ thanh ghi 8-bit, %cl là phiên bản thanh ghi 8
- .……….
bit của %ecx đang chứa giá trị của n
Và một số bài tập khác trong file bên dưới.