Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Assembly Cơ bản

Assembly là gì?

Assembly Language (hay viết tắt là ASM) là ngôn ngữ bậc thấp, thuộc thế hệ thứ 2 (2nd
generation). ASM sử dụng các từ gợi nhớ (mnemonics) để viết các chỉ thị (instructions)
lập trình cho máy tính.

Đặc điểm ASM là nó phụ thuộc vào kiến trúc CPU (ARM, x86-32, x86-64), hệ điều hành
(Linux, Windows, Mac) và các tập chỉ thị mà các nhà sản xuất phần cứng đưa ra. Ở trong
bài này ta sẽ sử dụng ASM cho kiến trúc iA-32 (Intel Architecture, 32-bit – i386).

Để có thể hiểu về ASM đầu tiên ta tìm hiểu về một số thanh ghi trong kiến trúc IA-32.

Thanh ghi

Dưới đây là bảng thanh ghi của kiến trúc IA-32

Hình 1
Hình 2

Trong đó, các thanh ghi EAX, EBX, ECX, EDX là các thanh ghi dữ liệu

- EAX: Thường được sử dụng trong các lệnh truy suất I/O, các phép toán số học,
logic và các chỉ lệnh chuyển dữ liệu.
- EBX: Được dùng như một con trỏ cơ sở để truy cập bộ nhớ. Giá trị của thanh ghi
EBX được dùng để tìm dữ liệu được yêu cầu.
- ECX: Được sử dụng như bộ đếm trong các vòng lặp, hoặc dùng cho phép dịch, đảo.
- EDX: Khá tương tự thanh ghi EAX.

Các thanh ghi khác là:

- ESI: Được sử dụng như con trỏ trỏ đến toán tử nguồn
- EDI: Được sử dụng như con trỏ trỏ đến toán tử đích
- ESP: Ghi giá trị Top của stack.
- EBP: Ghi gía trị cơ sở của stack.

Ngoài ra ta có thanh ghi EIP có chức năng là lưu địa chỉ của câu lệnh tiếp theo của
chương trình.
EFLAGS là các thanh ghi trạng thái được dùng để lưu các trạng thái của các phép toán số
học và một số trạng thái thực thi. Ví dụ, khi kết quả của lệnh add (cộng) cho ra kết quả
bằng 0 thì thanh ghi ZF được bật thành 1.

Các câu lệnh

• Tập lệnh về di chuyển di chuyển dữ liệu

- mov dest, src


Sao chép dữ liệu từ nguồn tới đích. Nguồn có thể là thanh ghi (reg) , có thể là
các địa chỉ bộ nhớ (mem) hoặc là hằng số (imm). Đích có thể là reg hoặc mem.
Không thể chuyển dữ liệu giữa mem-mem.

- lea <reg>, <mem>

Gán giá trị địa chỉ mem vào reg

- push src
Đẩy giá trị vào stack. Khi lệnh được thực thi thì thanh ghi esp sẽ giảm đi 4. Và
dest sẽ được lưu tại địa chỉ lưu trong esp ([esp]).

- pop dest
Lấy giá trị ra khỏi stack. Dest sẽ được gán bằng giá trị được lưu tại địa chỉ trong
esp. Sau đó esp sẽ được cộng thêm 4.

• Tập lệnh Số học và Logic

- add dest, src


Cộng 2 toán tử lại với nhau. Kết quả được lưu trong dest.

- sub dest, src


Dest sẽ bằng dest – src

- inc, dec dest


Cộng hoặc trừ giá trị dest đi 1.

- imul dest, src (, value)


Phép nhân 2 số dest = dest * src.
Trường hợp ta có thêm toán tử thứ 3 (value). Dest = src * value.

- idiv dest

……….

Kết quả của phép chia được lưu tại EAX. Số dư được lưu ở EDX

- and, or, xor dest, src


Thực hiện lần lượt and, or và xor. Kết quả sẽ được lưu vào dest.

- not dest
Thực hiện phép toán phủ (Lật ngược tất cả các bit của dest).

- neg dest
Thực hiện phép toán phủ định toán học.

- shr, shl dest, src


Phép dịch bit của dest qua phải hoặc qua trái src bit.

• Tập lệnh điều khiển

- jmp dest
Câu lệnh nhảy không điều kiện. Khi câu lệnh được thực thi thì chương trình sẽ
nhảy đến địa chỉ dest.

- cmp dest, src


Câu lệnh này thực hiện so sánh dest và src rồi dựa vào đó thay đổi các
EFLAGS. Bản chất câu lệnh này giống câu lệnh sub tức là lấy dest – src.

- je, jne, jz, jg, jge, jl, jle dest


Câu lệnh này là câu lệnh nhảy nhưng khác với jmp, các câu lệnh trên phải đáp
ứng điều kiện mới được thực hiện. Thường sẽ được dựa vào EFLAGS.

- call dest
Thực hiện gọi 1 hàm. Khi câu lệnh được gọi thì địa chỉ câu lệnh hiện tại sẽ được
push vào stack và sau đó chương trình sẽ nhảy không điều kiện tới dest.

- ret
Khi câu lệnh được gọi thì việc đầu tiên đó là lấy dữ liệu (pop) ra khỏi stack. Sau
đó chương trình sẽ nhảy tới giá trị vừa được lấy ra khỏi stack.

Lưu ý: dest trong các trường hợp trên (trừ lệnh cmp) đều là label (nhãn).

Tự nhận xét:

- Việc phân bố thời gian của bản thân em chưa hợp lý. Dẫn đến việc hoàn thành bài
report không được trọn vẹn.
- Bài báo cáo còn sơ sài chưa thực sự chi tiết.
- Ở trong phần trên có phần em chưa thực sự hiểu là phần câu lệnh idiv. Em vẫn
thắc mắc về cách thực hiện ở lệnh này nên ở phần trên chỉ ghi …
- Còn 1 phần trong em có nghiên cứu qua, do chưa thực sự hiểu về 2 cái là Caller và
Calle nên không để vào bài.
- Một số phần do em không biết nên dịch từ tiếng Anh qua tiếng Việt sao cho đúng
nên có thể khi ghi vào gây khó hiểu hoặc hiểu nhầm.

You might also like