Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Assembly Fundemental !, Cơ bản về assembly

2 posters

Go down

Assembly Fundemental !, Cơ bản về assembly Empty Assembly Fundemental !, Cơ bản về assembly

Bài gửi  HaVietAnh(I92C) 21/9/2010, 10:08

Bài viết này nhằm mục đích chủ yếu là overview cấu trúc IA32 của In và giới thiệu một chút về Assembly. Nên xem bài viết mang tính chất tham khảo khi mới bắt đầu với Assembly.
Bài viết này có tham khảo tài liệu Intel .
Khi tìm hiểu về Assemly, chắc hẳn rất mệt nhọc .Nếu bạn biết trước một chút về phần cứng máy tính thì rất tốt ngoài ra thì không cần gì cả vì Assembly là cơ bản nhất, ngôn ngữ bậc thấp rồi.
Tại mọi người thấy nó là ngôn ngữ biên dịch ( Gõ dòng lệnh nào chạy dòng đó ) và giao diện xấu nên ít học ( trừ khi bị bắt học) và nó cũng có ít áp dụng nên ít được nói đến.
Tuy nhiên nếu bạn muốn viết về Virus hay là nghiên cứu viết các phần mềm anti Virus thì việc nghiên cứu Assembly là tất yếu.
Muốn tìm hiểu asm trước hết cần phải tìm hiểu về con 80386.
---------------Bắt đầu từ CPU 386----------------------
CPU là thiết bị thực hiện hàng loạt những chuỗi lệnh.Những lệnh mà CPU thực hiện rất đơn giản.Những lệnh này cần thanh ghi làm toán hạng của nó.
386 có 8 thanh ghi đa dụng:
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
Tất cả thanh ghi đa dụng đều dài 32 bit
EAX,EBX,ECX,EDX có thể chia ra đoạn 16,và 8 bit
chẳng hạn như :
31 7 0
+--------------------------------------------------------------------+
EAX + | AH | AL +
+--------------------------------------------------------------------+
AX
Trong thanh ghi EAX sẽ được chia thành hai đoạn :

Thanh ghi đoạn:
CS,SS,DS,ES,FS,GS dài 16 bit
Thanh ghi floatting point:
8 thanh ghi từ ST0->ST7 dài 80 bit.
Ngoài ra các CPU sau này có thêm 8 thanh ghi mm0->mm7 dài 64 bit của MMX
và 8 thanh ghi xmm0 -->xmm7 dài 128 bit của SSE.
Những thanh ghi này chủ yếu dùng để move dữ liệu vòng quanh bộ vi xử lí.
Là toán hạng cho các instruction.
Các thanh ghi đa dụng giống như biến trong C nó có thể lưu số nguyên .Nó có thề lưu địa chỉ giống như con trỏ.
Các thanh ghi floating point dùng để thực hiện phép toán dấu chấm động.
Thanh ghi EFLAGS và EIP.Tác dụng của thanh ghi này sẽ bàn đến sau.
-------------------Chế độ thực (real mode )-----------------
TRong chế độ này ,bộ nhớ bị giới hạn 1 MB bộ nhớ (2^20 bytes) địa chỉ bộ nhớ từ 00000 -->FFFFF.Địa chỉ bộ nhớ này cần 20 bit mà 8086 không có thanh ghi nào dài đến 20 bit cả .nó giải quyết bằng cách sử dụng hai thanh ghi để diễn đạt 20 bit.Thanh ghi thứ nhất gọi là selector,thanh ghi thứ 2 gọi là offset.Nên địa chỉ vật lý có thể xác định bằng :
selector*16+offset
Nhân 16 trong số hex khá dễ vì chỉ thêm số 0 bên phải selector .Giá trị selector thường nằm trong thanh ghi CS.
Một selector có thể đánh địa chỉ cho 64KB bộ nhớ.Diều gì sẽ xảy ra khi chương trình cần hơn 64KB bộ nhớ.Giá trị CS không thể sử trong suốt chương trình.Chương trình trong bộ nhớ bị cắt ra nhiều đoạn (segment) nhỏ hơn 64KB.Khi chương trình chạy giá trị CS sẽ thay đổi.Điều này có thể gây khó chịu.
Mỗ i byte trong bộ nhớ thực sự không có một địa chỉ duy nhất.Ví dụ địa chỉ vật lý 04808 có ba cách diễn đạt 047C:0048 ,047E:0028,047B:0058.Diều này gây ra sự phức tạp khi so sánh địa chỉ.
--------------------Chế độ bảo vệ 16bit 286(protect mode)-----------------------
Trong chế độ bảo vệ 286 ,những thanh ghi đoạn không dùng để định địa chỉ nữa như real mode nữa.Trong real mode nó dùng làm định địa chỉ vật lý theo đoạn.Trong protect mode,nó là con trỏ trỏ đến desciptor table.Ở cả hai chế độ,chương trình vẫn bị chia thành nhiều đoạn.Tuy nhiên trong protect mode những đoạn này không cố định trong bộ nhớ vật lý .Thực tế nó không phải lúc nào cũng ở trong bộ nhớ .Nó có cơ chế bộ nhớ ảo.Nghĩa là giữ một phần bộ nhớ của chương trình được lưu trên đĩa cứng ,phần còn lại trong bộ nhớ RAM để chạy chương trình.
trong protect mode,mỗi đoạn có một descriptor chứa những thông tin về chính nó.Những thông tin này gồm :nó hiện diện trong bộ nhớ không,access permission,địa chỉ vật lý của nó.Điều làm cho các chương trình không thể ghi đè lên nhau trong bộ nhớ được và nó bảo vệ vùng nhớ hđh.Điều này rất khác so với CPU đời trước đó.
Nhưng nó vẫn còn nhược điểm rất lớn.Offset của nó vẫn là 16 bit
---------------------------32 bit protect mode----------------------
Có hai điểm khác biệt lớn giữa 386 32bit protect mode và 286 16 bit protect mode:
1.Offset mở rộng ra 32 bit.Vì thế một đoạn có thể mở rộng lên 4GB
2. Đoạn có thể chia thành 4K đơn vị gọi là page.Bộ nhớ ảo hoạt động với trang thay vì đoạn.Điềy có nghĩa một phần của đoạn trong bộ nhớ có thể nằm trong ổ cứng.TRong 286 ,toàn bộ đoạn phải nằm trong bộ nhớ hoặc trên ổ cứng khi paging.Mà điều này thì rất vô lý trong 386 protect mode.
Hiện nay đa số các hệ điều hành điều hành chạy trong protect mode .Linux và Window đều chạy ở protect mode .
--------------------------Ngôn ngữ Assembly------------------------------------------------------------------
Chương trình Assembly(Asm) thì lưu ở dạng text cao hơn ngôn ngữ máy.Mỗi chỉ lệnh (instruction) là một chỉ lệnh của máy(machine instruction). Ví dụ :
add eax,ebx
chỉ lệnh này có opcode là 03 ,clocks = 2
Từ "add" là một mnemonic cho chỉ lệnh của máy. Câu lệnh asm có cú pháp chung chung như sau:
mnemonic toán_hạn_1,toán_hạn_2
có thể có chỉ lệnh 1-2-3 toán hạn hoặc không có toán hạn nào hết.
Trình biên dịch sẽ convert mã text asm --> mã máy (machine code).Những ngôn ngữ lập trình bậc cao sẽ phức tạp hơn khi biên dịch vì mỗi lệnh không tương đương với một chỉ lệnh mã máy.
Toán hạn có thể là thanh ghi (register) , địa chỉ ô nhớ(memory), giá trị trực tiếp(immediate) và giá trị bao hàm trong chỉ lệnh.
Ví dụ : inc eax
Toán hạng là thanh ghi eax,giá trị bao hàm trong chỉ lệnh là 1 vì chỉ lệnh này sẽ cộng 1 vào eax.
Đối với Intel syntax :
câu lệnh mov sẽ có cú pháp : mov dest , src
dữ liệu trong src sẽ copy vào dest .Sơ đồ : src-->dest

Chương trình ASM đơn giản. Chương trình asm này thực hiện việc cộng hai số.
---------simple.asm----------
%include "asm_io.inc"
segment .data
l1 db "So thu nhat : ",0
l2 db "So thu hai : ",0
l3 db "Tong hai so la :",0
segment .bss
temp resd 1
segment .text
global _asm_main
asm_main:
enter 0,0
pusha
mov eax, l1
call print_string
call read_int
mov [temp], eax
mov eax, l2
call print_string
call read_int
add eax,[temp]
mov ebx,eax
mov eax, l3
call print_string
mov eax,ebx
call print_int
popa
leave
ret
----------end------------------


HaVietAnh(I92C)

Tổng số bài gửi : 62
Join date : 14/09/2010

Về Đầu Trang Go down

Assembly Fundemental !, Cơ bản về assembly Empty Re: Assembly Fundemental !, Cơ bản về assembly

Bài gửi  VuThanhLongI92 21/9/2010, 10:10

Đọc bài này hoa cả mắt, khó hiểu kinh Mad Shocked

VuThanhLongI92

Tổng số bài gửi : 64
Join date : 14/09/2010
Age : 40
Đến từ : HCMC

http://www.msao.vn

Về Đầu Trang Go down

Assembly Fundemental !, Cơ bản về assembly Empty Re: Assembly Fundemental !, Cơ bản về assembly

Bài gửi  HaVietAnh(I92C) 21/9/2010, 10:14

Thì Assembly là phải khó hiểu rùi...ngôn ngữ của cấu trúc máy tính mà.....mình cũng chỉ bít sơ sơ thui ..^_^

HaVietAnh(I92C)

Tổng số bài gửi : 62
Join date : 14/09/2010

Về Đầu Trang Go down

Assembly Fundemental !, Cơ bản về assembly Empty Re: Assembly Fundemental !, Cơ bản về assembly

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết