Professional Documents
Culture Documents
OnTap CK 2022
OnTap CK 2022
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
3
Nội dung
Các nội dung ôn tập:
Các thành phần của hệ thống
4
Các thành phần của hệ thống
CPU
Bộ tính toán ALU
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ả
source
%esi %si index
destination
%edi %di index
%esp %sp
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
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
11
Lệnh mov với định dạng AT&T
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
14
leal vs movl
Với Src là 1 biểu thức tính toán địa chỉ
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
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)
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
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
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
yđ
ổ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
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
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ớ
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)
2
a b bytes c d 3 bytes e f 4 bytes
0 4 6 8 16 17 20 24 28 32
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
42
43