[Programming] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
01/07/2006 08:01:38 (+0700) | #1 | 2715 |
lawlesscoder
Member
|
0 |
|
|
Joined: 29/06/2006 19:01:59
Messages: 25
Offline
|
|
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à ESI. 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.
|
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
01/07/2006 08:13:54 (+0700) | #2 | 2722 |
|
Angela_Belnett
Elite Member
|
0 |
|
|
Joined: 10/05/2003 11:21:14
Messages: 27
Location: Hà Nội
Offline
|
|
Cảm ơn anh Zombie về cái giáo trình trên nhé.
Làm ơn chỉ cho đàn em rõ thêm về cấu trúc file EXE cái? |
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
01/07/2006 08:24:55 (+0700) | #3 | 2726 |
nghelamvuon
Member
|
0 |
|
|
Joined: 28/06/2006 16:22:06
Messages: 8
Offline
|
|
Anh Zombie cho em so do va tap lenh cua P1,2... duoc khong
em cam on nhieu
Ah anh noi cho em biet cho khac nhau giua lap trinh 1 core va dual core nhe
|
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
01/07/2006 21:33:31 (+0700) | #4 | 2838 |
|
xfile
Member
|
0 |
|
|
Joined: 30/06/2006 10:30:52
Messages: 10
Offline
|
|
Đọc lý thuyết ko thế này. Mệt thật. Giá có thêm ví dụ thì hay |
|
|
|
|
[Question] Re: LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
01/07/2006 22:45:42 (+0700) | #5 | 2860 |
oqo
Member
|
0 |
|
|
Joined: 01/07/2006 11:32:08
Messages: 3
Offline
|
|
Đó là lý thuyết của con 8086. Nó khá là xưa rồi.Từ con 386 trở đi thì đã thay đổi khá nhiều.Nhiều lệnh được thêm vào.Có cơ chế phân quyền(privilege),paged và virtual memory.
Bạn có thể tham khảo ở đây : http://www.delorie.com/djgpp/doc/ug/asm/about-386.html
|
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
15/07/2006 13:15:38 (+0700) | #6 | 6904 |
channhua
Elite Member
|
0 |
|
|
Joined: 18/07/2003 04:49:28
Messages: 338
Offline
|
|
Mấy bài này toàn copy rùi paste mệt wá. bài nào mà không format thì anh comale del đi, giống rác quá.
wa đây đọc nè asm a-->z http://masm32vn.com |
|
|
|
|
[Question] Re: LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
19/07/2006 02:51:33 (+0700) | #7 | 7775 |
|
abelegreen
Member
|
0 |
|
|
Joined: 18/07/2006 15:37:01
Messages: 47
Offline
|
|
Đọc lý thuyết ko thế này. Mệt thật. Giá có thêm ví dụ thì hay
bác cũng có thể vào đây kiếm tài liệu về asm nè:
http://programmingschool.net/ |
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
20/07/2006 22:53:45 (+0700) | #8 | 8333 |
nghelamvuon
Member
|
0 |
|
|
Joined: 28/06/2006 16:22:06
Messages: 8
Offline
|
|
Em xin hoi that cac anh co anh nao biet sau ve VXL moi khong nhu tap lenh va so do chang han?khoi phai tra loi em biet la chang anh nao biet ca.Noi that voi cac anh neu ca doi chi di theo vet chan nguoi ta da nhuc roi lai con di theo vet cu rich nua chu.Luc em vao day tuong trong ma giao chuyen nay thong het(nghia hacker cua JAL noi) vay ma chang ai hay.
tuong khong co thi tim cho thay hoa ra tat ca cung chi la MS va Intel cho cai gi thi biet cai day .Ca HVA chot lai toan nguoi 20 tuoi mau nong thi nhieu ma song nhu ong cu 50 chi cam phan thoi
|
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
20/07/2006 23:21:35 (+0700) | #9 | 8344 |
|
ngoalong
HVA Friend
|
Joined: 22/03/2003 04:33:38
Messages: 111
Offline
|
|
nghelamvuon wrote:
Em xin hoi that cac anh co anh nao biet sau ve VXL moi khong nhu tap lenh va so do chang han?khoi phai tra loi em biet la chang anh nao biet ca.Noi that voi cac anh neu ca doi chi di theo vet chan nguoi ta da nhuc roi lai con di theo vet cu rich nua chu.Luc em vao day tuong trong ma giao chuyen nay thong het(nghia hacker cua JAL noi) vay ma chang ai hay.
tuong khong co thi tim cho thay hoa ra tat ca cung chi la MS va Intel cho cai gi thi biet cai day .Ca HVA chot lai toan nguoi 20 tuoi mau nong thi nhieu ma song nhu ong cu 50 chi cam phan thoi
Em muốn hỏi về VXL mới!! Vậy em muốn hỏi về dòng nào? x86, 8051,PIC,AVR,ARM ... Em muốn hỏi về tập lệnh, cách lập trình, sơ đồ ghép nối ... Cứ post lên đây anh sẽ có trách nhiệm trả lời cho em.
Nên biết khiêm tốn trong khi post bài một chút nhé em |
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
23/07/2006 08:56:54 (+0700) | #10 | 9189 |
nghelamvuon
Member
|
0 |
|
|
Joined: 28/06/2006 16:22:06
Messages: 8
Offline
|
|
Cam on anh NgoaLong anh cu doc phan tren se ro.Va cam on anh loi khuyen nua.Dung la em phai khiem ton that vi muon co duoc cai em can thi chac em phai co quan he voi Cuc Tinh Bao Cong Nghiep roi.
Em muon tim tap lenh voi so do thoi cang sat cang tot .Em thay chang bao lau nua khi gioi han cua duong truyen,thiet bi luu tru, ...ngay cang mo thi luc do la dat cua virus nen em muon the thoi.Cam on anh co le em nen hoc tieng Trung la vua. |
|
|
|
|
[Question] LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
24/07/2006 22:19:54 (+0700) | #11 | 9568 |
daiwon
Member
|
0 |
|
|
Joined: 17/07/2006 11:29:17
Messages: 7
Offline
|
|
Nè ai ơi! Tôi đang tập làm quen vơi ASM , nhưng có ai biết tài liệu về RADASM không nhi?
tiếng việt càng tôt. Không thì tiếng anh cũng được...
thank! |
|
|
[Question] Re: LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
21/03/2008 22:28:37 (+0700) | #12 | 120447 |
thanhphong2603
Member
|
0 |
|
|
Joined: 17/09/2007 15:39:53
Messages: 11
Location: Chuồng bồ cu số 12C
Offline
|
|
Các pác ơi ! assembly còn phụ thuộc vào bộ VXL của máy, có thể nói rõ hơn về vấn đề này được không ạ? Đặc biệt với các dòng VXL mới hiện nay như : Pen 3,Dual core...etc
Thank! |
|
|
[Question] Re: LÝ THUYẾT CĂN BẢN ASSEMBLY (by ZOMBIE) |
21/03/2008 22:30:58 (+0700) | #13 | 120448 |
thanhphong2603
Member
|
0 |
|
|
Joined: 17/09/2007 15:39:53
Messages: 11
Location: Chuồng bồ cu số 12C
Offline
|
|
Á nhầm cho e ơ trên là Pen4, Pen D, Dual Core... :-> |
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|