[Thông báo] Chuyển diễn đàn


Diễn đàn về free Code sẽ chuyển sang ICT2.net







You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

1default LÝ THUYẾT CĂN BẢN ASSEMBLY on 29/9/2011, 8:14 pm

THPTDH

avatar
Moderator
Moderator
Loading
I. Bộ nhớ
a. Byte:
- Các thông tin xử lý được lưu trữ trên bộ nhớ --> Nhóm 8 bits kết hợp lại thành 1 byte nhớ.
- Byte nhớ được xác định bằng 1 con số Address. Byte nhớ đầu tiên có Address = 0. Các byte nhớ có địa chỉ riêng khác nhau và cố định.
- Số bits khả thi của CPU càng cao thì khả năng truy cập byte nhớ càng lớn
- Dữ liệu lưu trong byte nhớ là Content hay còn gọi là Value.
-->> Conten luôn là giá trị 8 bits, trong khi Address byte nhớ phụ thuộc vào số bits khả thi của CPU. (8086 xử dụng Address 20 bits, 80286 thì dùng 24 bits.)
-->> 1 bits có khả năng chứa 2 giá trị (0/1), như vậy với n bits ta chứa được 2n giá trị. Example: 20 bits -->>220 = 1,048,576. Con số này được xem là 1 Mega và 210 là Kilo

b. Word:
- 1 word được tạo thành từ 2 bytes.
- Address thấp hơn (lấy Address của Byte) sẽ được lấy làm Address cho Word. -->> Example: 2 bytes có Address 2,3 tạo thành Word có Address là 2.

II. Ví trị Bits trong Byte or Word:
- Vị trí bit trong Byte/Word được đánh theo thứ tự từ phải sang trái:
7 6 5 4 3 2 1 0
<<-- Vị trí bits trong Byte

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|<------Byte cao------>|<-Byte thấp->|

III. Biểu diễn số nguyên:
- Với một Byte/Word ta có 1 bit msb (Most Significant Bit) và 1 bit lsg (Least Significant Bit)
- msb là bit cuối cùng bên trái (bit 7 đối với Byte, và 15 với Word).
- lsb thì ngược lại, nằm cuối cùng bên phải.
Để biểu diễn một số nguyên ta dùng hết 1 word (16 bits) mà không cần sử dụng bit xác định dấu. Do đó con số nguyên lớn nhất ta có là 1111 1111 1111 1111 = 65535.
-->> Ở đây lsb mang giá trị 0 cho số chẳn và ngược lại.
Đối với số nguyên có dấu, ta sử dụng msb làm bit xác định dấu (0: Dương). Giá trị này lưu trên máy tính dạng số bù 2 (với số âm).
* Số bù 1: Là kết quả phép đảo bits.
0000 0000 0000 0101
--> Bù 1 1111 1111 1111 1010
* Số bù 2: Kết quả phép cộng số bù 1 và 1
--> Bù 1 1111 1111 1111 1010
+ 1
--> Bù 2 1111 1111 1111 1011
Vì sao bù 2 là biểu diễn số âm? Ta lấy con số gốc + bù 2 của nó sẽ cho kết quả là 0 vì msb sẽ bị mất do word chỉ có khả năng lưu giá trị 16 bits. Và suy ra nếu ta lấy bù 2 thêm lần nữa sẽ cho ra giá trị gốc.
***Vấn đề tiếp theo là biểu diễn Value của Bytes hay Word dưới dạng số thập phân.
- Để biểu diễn dạng không dấu đơn giản chỉ là phép tính chuyển cơ số.
- Với dạng có dấu ta chuyển tính dưới dạng bits, lấy bù 2. Con số thập phân của kết quả này là dạng biểu diễn.

-->> Các lưu ý mục này <<--

1. Như đã nói msb = 0 khi là số dương và ngược lại và qua việc test nhiều lần ta có: Các số Hex bắt đầu tứ 0-7 là dương và tiếp theo là âm.

2. Dạng biểu diễn thập phân có dấu và không dấu cho 1 word:
- 0000h-7FFFh: Thập phân có dấu = không dấu.
- 8000h-FFFFh: Có dấu bằng không dấu trừ 65536.
- và tương tự cho 1 byte.
OkAi..Đến đây tạm xong một chút về ASM…..Part tiếp theo là về các thanh ghi, offset…


Register
Các thanh ghi là nơi lưu giữ thông tin của bộ xử lý. Chúng được phân loại theo chức năng tương ứng (tổng cộng 13 thanh ghi)

I. Thanh ghi dữ liệu: AX, BX, CX, DX (Với Windows được mở rộng thành EAX, EBX, ECX, EDX với 32 bits):
- Như tên gọi chúng sử dụng vào việc thao tác dữ liệu (thực hiện nhanh hơn so với thao tác trực tiếp trên bộ xử lý).
- Các thanh ghi được chia thành 2 byte cao/thấp tương ứng H/L (như AL là byte thấp, AH byte cao).

1. AX – Accumulator Register:
- Thực hiện các lệnh số học, login, chuyển dữ liệu và tạo ra mã máy ngắn nhất.
- Với các thao tác nhân/chia đa phần các toán hạng đa phần được lưu ở đây. Như MUL BX --> AX = AX * BX
- Việc Input/Output cũng được sử dụng với thanh ghi này.

2. BX – Base Register:
- Thanh ghi được dùng cho việc ghi địa chỉ. Sẽ nói rõ hơn ở các phần sau.

3. CX – Count Register:
- Sử dụng làm biến đếm cho vòng lập, dịch, xoay bit.

4. DX – Data Register:
- Sử dụng cho việc nhân/chia hoặc In/Output.

5. Các thanh ghi đoạn CS, DS, ES, SS:
- Code, Data, Stack được nạp vào các đoạn bộ nhớ gọi là Code Segment, Data Segment, Stack Segement.
- Các thanh ghi CS, DS, SS chứa địa chỉ Code Segment, Data Segment, Stack Segement. Còn ES (Extra Segment) được sử dụng cho việc truy cập đến Code Segment thứ 2.

6. Các thanh ghi con trỏ và chỉ số SP, BP, SI, DI:
- Được sử dụng nhằm trỏ tới các ô nhớ, tương ứng việc chứa offset ô nhớ.
- Ngoài ra còn được dùng cho tính toán số học và một số việc khác.
a. SP – Stack Pointer: Kết hợp với Register SS nhằm truy trỏ đến đoạn ngăn xếp.
b. BP – Base Pointer: Chủ yếu nhằm việc truy cập dữ liệu ngăn xếp ngoài ra còn có thể truy cập dữ liệu trong các đoạn khác. (SP chỉ truy cập ngăn xếp).
c. SI – Source Index: Trỏ đến ô nhớ trong Code Segment chỉ định bằng DS.
d. DI – Destination Index: Tương tự SI.
SI, DI được sử dụng trong các thao tác dời chuỗi. Trong đó SI trỏ chuỗi nguồn, DI trỏ chuỗi đích.

7. Thang ghi con trỏ lệnh IP:
- Sử dụng trong việc truy cập đến các lệnh (CS chứa Address đoạn lệnh tiếp theo, IP chứa Offset).
- Một lệnh sau khi được thực hiện xong, thanh ghi cập nhật lại giá trị để trỏ tiếp đến lệnh next.
- Vì tính quan trọng trong việc trỏ đến các lệnh sẽ được xử lý, do đó IP không sử dụng được trong các lệnh thông thường.

II. Các thanh ghi cờ (Flag):
Mục đích các Registers này như tên chúng nói lên nhằm quản lý các trạng thái của bộ xử lý (0/1)
Ý nghĩa các cờ sẽ được nói đến ở next part .

Extension
- Với bộ xử lý 8086 ta có 20 bits Physical Address tương ứng 220 = 1048576 bytes (1 Megabyte)
- Các Address này thường được biểu diễn dưới dạng số Hex. Chẳng hạn 00001…FFFFFh.
Ta thấy Address lớn nhất là FFFFFh quá lớn để có thể đặt vào các Register 16 bit. Do đó bộ xử lý sẽ chia bộ nhớ này thành các đoạn (Segments)

a. Đoạn bộ nhớ (Memory Segment):
- Mỗi đoạn bộ nhớ chứa 216 byte = 64 KB ô nhớ liên tiếp nhau được xác định bằng một địa chỉ segment tương ứng. Bắt đầu từ địa chỉ 0.
- Cũng tương ứng trên ta có địa chỉ đoạn lớn nhất là FFFFFh.
- Bên trong mỗi đoạn, các ô nhớ được gán địa chỉ gọi là Offset tính từ đầu đoạn và là con số 16 bit và max là FFFFh.

b. Segment: Offset
Qua trên ta thấy để trỏ đến 1 ô nhớ ta thông qua Segment để đến đoạn và Offset đến ô nhớ cần tìm. Và để tìm ngược lại Physical Address 20bits của ô nhớ đó ta dịch trái 4 bit cho địa chỉ đoạn (tương ứng nhân 10h) và cộng Offset
Các thanh ghi cờ - Flag Register

Các cờ được phân thành 2 loại tương ứng công việc.
a. Cờ trạng thái: Phản ánh công việc đang thực thi của bộ xử lý.
b. Cờ điều khiển: Quản lý việc thực thi một thao tác nào đó nhằm cho phép hoặc không cho.

Biểu diễn thanh ghi cờ trong bộ nhớ:


CODE
15 14 13 11 10 9 8 7 6 5 4 3 2 1 0
O D I T S Z A P C


Tuy nhiên bạn không nhất thiết nhớ vị trí của chúng mà có thể dùng một số lệnh ASM để set cờ.

I. Cờ trạng thái:
1. Carry Flag – CF: Được set 1 khi có việc nhớ bit msb. Nói cách khác CF là cờ nhận biết trong phép toán cộng trừ có sự vay mượn không? Ngoài ra các lệnh quay dịch bit cũng tác động CF.

2. Parity Flag – PF: Cho biết số bit 1 trong kết quả byte thấp các phép toán học là số chẳn (1) or lẻ (0). Chẳng hạn kết quả phép toán cho ra FFFEh (byte thấp FE = 11111110, có 7 bit 1 là lẽ -->> PF = 0).

3. Auxiliary Flag – AF: Tương tự CF nhưng phản ánh cho bit 3-4. Công dụng khác của CF được dùng trong thao tác với thập phân mã hóa sang nhị phân (BCD).

4. Zero Flag – ZF: Tên cờ đã nói lên ý nghĩa nó phản ánh kết quả toán học có bằng 0 hay not. ZF = 1 khi bằng không và ngược lại.

5. Sign Flag – SF: Cờ dấu cho biết kết quả toán học có âm (1) hay không (0). Như đã biết trên bit msb cũng con số cho biết dấu số do đó SF có thể xem bản sao của msb này.

6. Overflow Flag – OF: Cờ tràn được set 1 khi xảy ra việc tràn số.

II. Cờ điều khiển:
1. Direction Flag – DF: Tác động bởi các lệnh chuyển dữ liệu như: MOVS, CMPS…1 = up và ngược lại.

Programmer có thể set DF qua các lệnh STD và CLD.
2. Interrupt Flag – IF: Có cho phép xảy ra việc chặn ngắt hệ thống or not. 1 = Enable và ngược lại.

3. Trap Flag – TF: Sử dụng như để set breakpoint để pause hệ thống lại. 1 = on và ngược lại. Ngắt INT 3 dùng set cờ này.


Extension
Nói thêm và việc tràn số

Chẳng hạn cộng 2 số 2 byte:

CODE
1111 1111 1111 1111
+
0000 0000 0000 0001
=
10000 0000 0000 0000

|
Bit này vượt khỏi khả năng chứa 2 byte -->> Tràn OF = 1
..Ngoài ra khi tràn còn tính tràn không dấu hay tràn cho có dấu tương ứng việc ta dùng con số là có dấu hay không. 2 việc tràn này hoàn toàn độc lập.
Như ở trên nếu là con số có dấu thì kết quả là 0 --> đúng.

Tràn không dấu: Có thể nhận biết qua việc bit msg có nhớ 1 msb và tương ứng là thiếu 1 bit msg cho phép trừ.
Tràn có dấu: Nhận biết khi kết quả nhận được khác dấu 2 số hạng tham gia phép toán.

CODE
0111 1111 1111 1111
+
0111 1111 1111 1111
=
1111 1111 1111 1110


Ở đây tràn có dấu vì kết quả cho số là -2 khác dấu 2 toán hạng tham gia. Nhưng với không dấu là số 65534 là đúng -->> không tràn.

Bộ xử lý thực hiện set cờ dựa trên:
Nếu phép toán có nhớ vào msb mà msb không nhớ ra hay ngược lại có nhớ ra nhưng không nhớ vào msb thì tràn xuất hiện và set OF = 1. Ví dụ


CODE
101 0000
+
101 0000
=
1010 0000
|>> Ở đây không nhớ 1 vào cho msb
|>> Nhưng ở đây thì lại nhớ ra 1 cho msb
>> Tràn .

Một số lệnh toán học
Cộng hai toán hạng, rồi lấy kết quả cộng tiếp với giá trị cờ Carry.
- ADD – Addition: Cộng hai toán hạng.
- AND – Phép toán logic: AND từng bit tương ứng hai toán hạng.
- CALL – Call a procedure: Đưa vào Stack lệnh next. Sử dụng cho việc gọi hàm.
- CLC – Clear Carry Flag: Set cờ CF = 0
tương tự cho CLD – Clear Direction Flag, CLI – Clear Interrupt Flag.
- CMP – Compare: So sánh hai toán hạng. Việc so sánh này được thực hiện qua việc trừ toán hạng nguồn với đích nhằm set cờ tương ứng. Các toán hạng sau khi CMP không thay đổi giá trị.
- CMPS, CMPSB, CMPSW, CMPSD – Compare String: So sánh chuỗi được trỏ đến trong bộ nhớ bởi DS:SI và ES I. B,W,D tương ứng: Byte, Word, Double. SI, DI tăng giảm tùy thuộc DF (1 giảm) tương ứng với việc CMP String từ trái qua phải or ngược lại.
- CMPXCHG – Compare And Exchange: CMP EAX và toán hạng đích. Nếu bằng nhau thì toán hạng nguồn sẽ được Copy sang đích và ngược lại.d
- DEC – Decrement: Trừ 1 cho toán hạng. CF không bị ảnh hưởng.
- INC – InCrement: Cộng 1.
- DIV – Divide (UnSinged): Thực hiện phép chia không dấu. EAX chứa kết quả không tính số dư. EDX chứa số dư: vd: DIV 6, 4 (EAX=1, EDX=2).
- IDIV – Signed Integer Division: Thực hiện phép chia có dấu
- MUL và IMUL: Phép nhân không/có dấu.

Bảng các lệnh nhảy Condition và ASCII bảng nhỏ ...
http://zombie.thehot50.com/Crack/Tuts/JumpCon_ASCsmall.zip
Lưu ý..Down về đổi thành .rar và dùng WinRar Extract.

2default Re: LÝ THUYẾT CĂN BẢN ASSEMBLY on 30/9/2011, 6:07 pm

thanh_nguyenduc

avatar
Super Moderator
Super Moderator
Loading
thấy bảo Assembly này đang đc chuộng....mà khó nhuốt nhỉ....
đọc đc mấy dòng đầu chẳng muốn đọc nữa
đọc hết xong hình như....đang loạn bộ nhớ roài.... lol! lol! lol!

3default Re: LÝ THUYẾT CĂN BẢN ASSEMBLY on 30/9/2011, 9:01 pm

THPTDH

avatar
Moderator
Moderator
Loading
try.tui cung chua hieu het may thu nay``.

4default Re: LÝ THUYẾT CĂN BẢN ASSEMBLY on 3/10/2011, 10:02 am

Founder

avatar
Admin
Admin
Loading
nice man hoho.thanks

5default Re: LÝ THUYẾT CĂN BẢN ASSEMBLY on 3/10/2011, 9:31 pm

THPTDH

avatar
Moderator
Moderator
Loading
admin đã viết:nice man hoho.thanks
:207: :207: :207: :207:

Sponsored content


Loading

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

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