Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 41

LẬP TRÌNH HỆ

THỐNG
ThS. Đỗ Thị Hương Lan
(landth@uit.edu.vn)

1
Ôn thi cuối kỳ

2
Nội dung
 Các nội dung ôn tập:
 Các thành phần của hệ thống

 Assembly Instruction (AT&T)

 Lập trình mức máy tính

 Giải đáp các bài tập

3
Nội dung
 Các nội dung ôn tập:
 Các thành phần của hệ thống

 Assembly Instruction (AT&T)

 Lập trình mức máy tính

 Giải đáp các bài tập

4
Các thành phần của hệ thống
 CPU
 Bộ tính toán ALU

 Thanh ghi (Register)

 Bộ nhớ cache (L1, L2, L3)

 Bộ nhớ chính
 Ổ đĩa: SSD, HDD

CPU Memory
Addresses
Registers
Code
Data
PC Data
Condition Stack
Codes
Instructions

5
Các thanh ghi IA32 – 8 thanh ghi 32 bit
%eax %ax %ah %al Kết quả

%ecx %cx %ch %cl counter


Mục đích chung

%edx %dx %dh %dl data

%ebx %bx %bh %bl base

source
%esi %si index

destination
%edi %di index

%esp %sp

%ebp %bp base pointer

Các thanh ghi 16-bit ảo


(tương thích ngược) 6
Các thanh ghi trong x86-64

%rax %eax %r8 %r8d

%rbx %ebx %r9 %r9d

%rcx %ecx %r10 %r10d

%rdx %edx %r11 %r11d

%rsi %esi %r12 %r12d

%rdi %edi %r13 %r13d

%rsp %esp %r14 %r14d

%rbp %ebp %r15 %r15d

16 thanh ghi 64 bit


7
Một vài thanh ghi đặc biệt

%rip %eip Program Counter


Instruction pointer
%rflag %eflag

CF ZF SF OF

Condition codes

8
Nội dung
 Các nội dung ôn tập:
 Các thành phần của hệ thống

 Assembly Instruction (AT&T)

 Lập trình mức máy tính

 Giải đáp các bài tập

9
Khác biệt giữa các định dạng
AT&T vs Intel
 Khác biệt giữa 2 định dạng assembly: AT&T vs Intel
AT&T Intel
Thứ tự toán
movl source, dest mov dest, source
hạng
Có % trước tên thanh ghi Không có prefix trước tên thanh ghi
Thanh ghi
%eax eax
Có suffix Không có suffix
Lệnh mov
movl, movlq, movb… mov
Địa chỉ ô nhớ 8(%ebp) [ebp + 8]
gcc: option –masm=att (mặc
• IDA Pro
Có thể thấy ở định)
• gcc: option –masm=intel
đâu? objdump: option –M att (mặc
• objdump: option –M intel
định)

10
Lệnh mov với định dạng AT&T

Source Dest Src,Dest C Analog

Reg movl $0x4,%rax temp = 0x4;


Imm
Mem movl $-147,(%rax) *p = -147;

Reg movl %rax,%rdx


movq Reg
Mem movl %rax,(%rdx) *p = temp;

Mem Reg movl (%rax),%rdx temp = *p;

11
Lệnh mov với định dạng AT&T

Instruction hợp lệ Instruction không hợp lệ

movl Imm, Reg


movl Reg, Imm
movl Imm, Mem
movl Mem, Imm
movl Reg, Reg
movl Imm, Imm
movl Reg, Mem
movl Mem, Mem
movl Mem, Reg

• Imm: hằng số, có ký hiệu $ phía trước


• Reg: thanh ghi hỗ trợ trên hệ thống, có ký hiệu % phía trước
• Mem: địa chỉ ô nhớ, có thể là địa chỉ cụ thể như 0x100 hay (0x100), hoặc
là biểu thức biểu diễn Imm(Reg1, Reg2, Imm)

12
Lưu ý: Suffix cho lệnh trong AT&T
 Quyết định số byte dữ liệu sẽ được xử lý, ví dụ lệnh mov
 movb 1 byte
 movw 2 bytes
 movl 4 bytes
 movq 8 bytes (dùng với các thanh ghi x86_64)
 mov Số bytes tuỳ ý (phù hợp với tất cả số byte ở trên)

 Lưu ý: Các thanh ghi dùng trong lệnh mov cần đảm bảo phù
hợp với suffix
 Số byte dữ liệu sẽ được move

movl %eax, %ebx


? Có bao nhiêu lệnh mov hợp lệ trong movb $123, %bl
các lệnh bên? movl %eax, %bl
movb $3, (%ecx)
mov (%eax), %bl
13
Các chế độ đánh địa chỉ bộ nhớ đầy đủ
 Dạng tổng quát nhất
D(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]+ D]
 D: Hằng số “dịch chuyển” 1, 2, hoặc 4 bytes
 Rb: Base register: Bất kỳ thanh ghi nào được hỗ trợ
 Ri: Index register: Bất kỳ thanh ghi nào, ngoại trừ %rsp hoặc
%esp
 S: Scale: 1, 2, 4, hoặc 8

 Các trường hợp đặc biệt


(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]]
D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D]
(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]]

14
leal vs movl
 Với Src là 1 biểu thức tính toán địa chỉ

 movl Src, Dst


 Tính toán địa chỉ ô nhớ dựa trên biểu thức tính toán ở Src
 Truy xuất đến ô nhớ có địa chỉ tính toán được để lấy dữ liệu
 Đưa dữ liệu lấy được vào Dst

 leal Src, Dst


 Tính toán địa chỉ ô nhớ dựa trên biểu thức tính toán ở Src
 Không truy xuất ô nhớ
 Gán trực tiếp địa chỉ tính toán được cho Dst
 Ứng dụng: tính toán các biểu thức toán học

15
Một số lệnh assembly toán học

16
Nội dung
 Các nội dung ôn tập:
 Các thành phần của hệ thống

 Assembly Instruction (AT&T)

 Lập trình mức máy tính

 Giải đáp các bài tập

17
Chuyển đổi từ mã nguồn sang file thực thi

printf.o

Pre-
hello.c hello.i Compiler hello.s Assembler hello.o Linker hello
processor
(cc1) (as) (ld)
(cpp)
Source Modified Assembly Relocatable Executable
program source program object object
(text) program (text) programs program
(text) (binary) (binary)

High-level Programming Assembly Machine Language


Language Language

18
Hiểu các chương trình assembly
 Ngôn ngữ assembly (chi tiết ở mục trước)
 Lập trình mức máy tính (machine-level)

 Kiểu dữ liệu
 Điều khiển luồng (rẽ nhánh, vòng lặp,…)
 Thủ tục/Hàm và Stack
 Mảng, Structure, Union
 Linking

 Các topic liên quan đến ATTT

 Reverse engineering
 Buffer overflow
 Truy xuất ngoài mảng

19
Lập trình mức máy tính (1)
 Kiểu dữ liệu

C Data Type Typical 32-bit Typical 64-bit x86-64

char 1 1 1
short 2 2 2
int 4 4 4
long 4 8 8
float 4 4 4
double 8 8 8
long double − − 10/16

pointer 4 8 8

20
Lập trình mức máy tính (2)
 Điều khiển luồng (rẽ nhánh, vòng lặp…)

%rflag %eflag

CF ZF SF OF
cmpl a,b tha

ổi (
testl a,b tườ
ng
min
h)
Condition sử dụng bởi jX
ầm) codes setX
i (ng
y đổ
tha
Lệnh toán học

21
Lập trình mức máy tính (3)
 Điều khiển luồng (rẽ nhánh, vòng lặp…): Từ C sang assembly
 Code C  Goto Version  Assembly

 Điều khiển luồng (rẽ nhánh, vòng lặp…): Từ assembly sang C


 Rẽ nhánh: các điều kiện so sánh, các đoạn code tương ứng với trường hợp
đúng/sai
 Vòng lặp: điều kiện dừng, cập nhật, than vòng lặp...

22
Lập trình mức máy tính (4)
 Thủ tục/Hàm và stack
 Stack: %ebp và %esp
 Push/Pop
Caller Frame
 Call
 Ret Arguments
 Return address?
Return Addr
 Vị trí các tham số/biến cục bộ Frame pointer Old %ebp
 IA32 và x86_64 khác nhau như thế nào? %ebp
Saved
Registers
+
Local
Variables

Argument
Stack Build
pointer
23
Lập trình mức máy tính (5)
 Mảng, Structure, Union
 Mảng 1 chiều/2 chiều
 Căn chỉnh trong structure
 Cách xác định vị trí của các thành phần trong mảng/structure/union
 Kích thước tổng của mảng/structure/union

int val[5]; 1 5 2 1 3
x x+4 x+8 x + 12 x + 16 x + 20

24
Lập trình mức máy tính (6)
 Linking
 Thành phần trong chương trình nào được xem xét là symbol?
 Các kiểu symbol: global, external, local
 Luật phân giải symbol trùng tên: strong hay weak symbol
 Tái định vị (relocation)
 Một số section trong cấu trúc ELF: .text, .data, .bss, .symtab

25
Lập trình mức máy tính (7)
 Các topic liên quan đến ATTT
 Reverse Engineering (Dịch ngược)
 Buffer overflow (Tràn bộ đệm)
 Truy xuất bên ngoài mảng

26
HẾT NỘI DUNG ÔN THI :>

27
Nội dung
 Các nội dung ôn tập:
 Các thành phần của hệ thống

 Assembly Instruction (AT&T)

 Lập trình mức máy tính

 Giải đáp các bài tập

28
Bài tập 7 (Tuần 05)
 Alice mới học code assembly cơ bản và mong muốn chuyển đoạn mã C
dưới đây thành một đoạn mã assembly:
1. int func5(char* str) - str là một số có 2 chữ số ở dạng chuỗi, ví dụ
2. { ‘12’
3. int a = str[0] – ‘0’; - Hàm func5 tính tổng của các chữ số trong str
4. int b = str[1] – ‘0’; - Tham số đầu vào (ở vị trí ebp + 8) là địa chỉ
5. return a + b; lưu chuỗi str trong bộ nhớ
6. } - Ký tự ‘0’ có mã ASCII là 48 (0x30)
 Đoạn code assembly được viết bên dưới có chỗ chưa đúng, hãy chỉ ra và
1. movl - Lệnh8(%ebp),
2 có movl (4 bytes) không phù hợp với %al (1 byte).
đề xuất cách sửa?
%eax //địa chỉ của str - Lệnh 3: trừ ‘0’ thì cần trừ mã ascii là 48 hoặc 0x30.
2. movl (%eax), %al - Lệnh 4, 5: do lệnh 5 trừ %ebx cho ‘0’ (trừ 1 byte thấp) thì lệnh 4
// str[0]
cần mov ký tự tại 1(%eax) vào %bl.
3. subl $0x48,- %eax
Lệnh 2 thay //đổi %al, tức thay đổi luôn %eax không còn là địa chỉ
str[0] – ‘0’ 1.str, nên lệnh 4 dùng %eax movl 8(%ebp),
để truy xuất ký tự%edx
là sai. //địa chỉ
của str
4. mov 1(%eax), %bh //
2. movb (%edx), %al // str[0]
str[1]
3. subl $48 , %eax // str[0]
5. subl $’0, %ebx – ‘0’ //
str[1] – ‘0’ 4. mov 1(%edx), %bl // str[1]
6. addl %ebx, %eax
5. subl $’0, %ebx //
29
Assignment 1 – Machine programming Basic
0x2
Hãy điền vào bảng giá trị của các thanh
ghi, địa chỉ ô nhớ có giá trị bị thay
đổi, và giá trị thay đổi đó sau khi thực
thi từng câu lệnh trên?

Câu Thanh ghi thay Giá trị Địa chỉ ô nhớ Giá trị
Giải thích
lệnh đổi giá trị thanh ghi thay đổi giá trị ô nhớ

Gán giá trị hằng số 2 vào ô nhớ có địa chỉ bằng


1 - - 0xF0 2
(%ebp – 16) = 0xF0
Gán giá trị hằng số 3 vào ô nhớ có địa chỉ bằng
2 - - 0xF4 3
(%ebp – 12) = 0xF0
Gán giá trị hằng số 1 vào ô nhớ có địa chỉ bằng
3 - - 0xFC 1
(%ebp – 4) = 0xFC
Gán giá trị lưu trong ô nhớ có địa chỉ (%ebp – 4) =
4 %eax 1 - -
0xFC, là giá trị 1 vào thanh ghi %eax

5 %eax 0 - - Trừ giá trị tại thanh ghi %eax 1 đơn vị


Tính toán địa chỉ ô nhớ %ebp + 4*%eax – 16 =
6 %eax 2 - -
0xF0, lấy giá trị tại ô nhớ là 2 đưa vào %eax
Dịch trái giá trị tại %eax 3 lần, tức là nhân với 8: 2 *
7 %eax 16 -
8 = 16
Gán giá trị của %eax là 16 vào ô nhớ có địa chỉ
8 - - 0xF8 16
(%ebp – 8) = 0xF8
30
Assignment 2 – Chuyển thành for
Chuyển đoạn code assembly bên dưới thành vòng lặp for trong C?
Gợi ý: vị trí 1 số biến:
// x at %ebp+8, max at %ebp+12
%ebp – 4: result
1. example:
%ebp – 8: i
2. movl $0, -4(%ebp) # result  Khởi tạo?
3. movl 8(%ebp), %eax
4. movl %eax, -8(%ebp) # i result = 0
5. .L3: i=x
6. movl -8(%ebp), %eax  Điều kiện dừng?
7. cmpl 12(%ebp), %eax
8. jge .L2 i >= max
9. movl -8(%ebp), %eax  Cập nhật?
10. andl $1, %eax
11. movl %eax, -12(%ebp)
i=i+2
12. movl -12(%ebp), %eax  Body?
13. addl %eax, -4(%ebp)
result += i & 1
14. addl $2, -8(%ebp)
15. jmp .L3
 Viết vòng lặp for?
16..L2: int result = 0;
17. movl -4(%ebp), %eax # return for (int i = x; i < max; i+=2)
result += i & 1; 31
Bài tập bonus
Giả sử ta có đoạn mã assembly như bên dưới
x at %ebp+8, n at %ebp+12
1. movl 12(%ebp), %ecx // Trả lời các câu hỏi sau:
n 1. Instruction thứ 3 (lệnh xor) có tác dụng gì?
2. movl 8(%ebp), %edx // xor 1 thanh ghi với chính nó có tác dụng
x gán giá trị 0 thanh ghi đó (a xor a = 0)
3. xorl %eax, %eax 2. Instruction thứ 5 & 7 thực hiện dịch trái (sall
4. addl $1, %eax
và sarl) với số bit cần dịch lưu trong thanh
5. sall %ecx, %eax
ghi %ecx, tuy nhiên đang bị lỗi. Lý giải
6. andl %edx, %eax
7. sarl %ecx, %eax nguyên nhân bị lỗi và sửa lại cho đúng?
8. andl $1, %eax Lệnh assembly chỉ cho phép lưu số bit cần
dịch trong thanh ghi %cl, nên đổi thành
3. Viết hàm C tương ứng sall %cl, %eax
int func3(int x, int n)
sarl %cl, %eax
{
int result = 0;
result += 1;
result = (result << n) & x;
result = (result >> n) & 1;
return result;
}
Đoạn mã có chức năng lấy về giá trị bit thứ n của số x 32
Procedure (IA32) – Bài tập 4a
Code assembly Giả sử:
- Khi mới bắt đầu thực thi proc (dòng 1):

a. Giá trị của %ebp sau dòng lệnh thứ 3 (có


giải thích)?
- Sau dòng lệnh 2, %esp bị trừ đi 4:
%esp = 0x800040 – 4 = 0x80003C
- Sau dòng lệnh 3, %ebp được gán bằng %esp:
%ebp = %esp = 0x80003C
b. Giá trị của %esp sau dòng lệnh thứ 4 (có
Code C giải thích)?
- Sau dòng lệnh 2, %esp = 0x80003C
- Dòng lệnh 3 không làm thay đổi %esp
- Sau dòng lệnh 4, %esp bị trừ đi 40 (0x28):
%esp = 0x80003C – 0x28 = 0x800014
35
Procedure (IA32) – Bài tập 4b
Code assembly Giả sử:
- Khi mới bắt đầu thực thi proc (dòng 1):

c. Đoạn code truyền tham số và gọi scanf? Giải


thích?
- Dòng 5 đến 9 chuẩn bị tham số, dòng 10 gọi hàm.
- scanf() cần 3 tham số, các dòng 6, 8, 9 đưa 3 giá trị
vào các vị trí 8(%esp), 4(%esp), (%esp) là đủ 3 tham số
(dòng 5 chuẩn bị giá trị cho dòng 6).
d. Xác định vị trí lưu của x và y? Giải thích?
- Dựa vào vị trí so với %esp, thứ tự các tham số cho
scanf() sẽ là:
Code C o 8(%esp) là tham số thứ 3, địa chỉ lưu x: %ebp – 4 =
0x80003C – 4 = 0x800038
o 4(%esp) là tham số thứ 2, địa chỉ lưu y: %ebp – 8 =
0x80003C – 8 = 0x800034
o (%esp) là tham số đầu tiên, .LC0 - địa chỉ chuỗi định
dạng
36
Procedure (IA32) – Bài tập 4c
Code assembly Giả sử:
- Khi mới bắt đầu thực thi proc (dòng 1):

e. Vẽ stack sau khi scanf trả về.

0x800060 ebp

0x800040 esp
0x800060 (ebp)
0x80003C ebp esp
// biến
// địa x x
chỉ lưu
ebp – 4 =
ebp – 8 = // biến
// địa y y
chỉ lưu 0x800038
0x800034

Code C
0x800038 (ebp – 4)
0x800034 (ebp – 8)

0x800014 .LC0 esp


37
Mảng: Bài tập 1
Cho 2 mảng 2 chiều mat1, mat2 với các hằng số M, N và đoạn mã
assembly bên dưới của hàm sum_element.
Thử phân tích mã assembly và tìm 2 giá trị cụ thể của M, N?
int mat1[M][N] - Tính toán địa chỉ và truy xuất
int mat2[N][M] phần tử mat1[i][j]:
int sum_element(int i, int j) { • Dòng 3, 4, 5 và 8
return mat1[i][j] + mat2[j][i]; • Địa chỉ tính được:
} mat1 + 4*(7*i + j)
 mat1[M][7]
1. movl 8(%ebp), %ecx  N=7
2. movl 12(%ebp), %edx
- Tính toán địa chỉ và truy xuất
3. leal 0(,%ecx,8), %eax
4. subl %ecx, %eax phần tử mat2[j][i]:
5. addl %edx, %eax • Dòng 6, 7 và 9
6. leal (%edx,%edx,4), %edx • Địa chỉ tính được:
7. addl %ecx, %edx
8. movl mat1(,%eax,4), %eax mat2 + 4*(5*j + i)
9. addl mat2(,%edx,4), %eax  mat2[7][5]
 M=5 38
Structure & Alignment: Bài tập
Cho định nghĩa cấu trúc như sau được biên dịch trên 1 máy Windows
32 bit và có yêu cầu alignment. struct {
char *a;
short b;
double c;
a. Xác định vị trí (offset) của từng trường trong char d;
structure này? float e;
void *f;
} foo;

2
a b bytes c d 3 bytes e f 4 bytes

0 4 6 8 16 17 20 24 28 32

b. Tổng kích thước của structure?


32 bytes

39
Structure & Alignment: Bài tập
Cho định nghĩa cấu trúc như sau được biên dịch trên 1 máy Windows
32 bit và có yêu cầu alignment. struct {
c. Sắp xếp lại vị trí các trường để hạn chế tối thiểu char *a;
short b;
không gian trống? Offset của các trường và tổng kích
double c;
thước sau khi sắp xếp lại? struct { char d;
double c; float e;
char *a; void *f;
float e; } foo;
void *f;
short b;
char d;
} new_foo;

c a e f b d 1
byte

0 8 12 16 20 22 23 24

Tổng kích thước của structure sau khi sắp xếp:


24 bytes
40
Nội dung
 Các chủ đề chính:
1) Biểu diễn các kiểu dữ liệu và các phép tính toán bit
2) Ngôn ngữ assembly
3) Điều khiển luồng trong C với assembly
4) Các thủ tục/hàm (procedure) trong C ở mức assembly
5) Biểu diễn mảng, cấu trúc dữ liệu trong C
6) Một số topic ATTT: reverse engineering, bufferoverflow
7) Linking trong biên dịch file thực thi
8) Phân cấp bộ nhớ, cache (tự tìm hiểu)
 Lab liên quan
 Lab 1: Nội dung 1  Lab 4: Nội dung 1, 2, 3, 4, 5, 6
 Lab 2: Nội dung 1, 2, 3  Lab 5: Nội dung 1, 2, 3, 4, 5, 6
 Lab 3: Nội dung 1, 2, 3, 4, 5, 6  Lab 6: Nội dung 1, 2, 3, 4, 5, 6
41
Giáo trình

42
43

You might also like