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. Thanh 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(mở rộng): - 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 BÀI HỌC BỔ SUNG Nguyenthehung Mình cũng biết tí ti về Assembly, Zombie cho mình bổ sung 1 chút nhé: +Biểu diễn ký tự trên máy tính. Ngoài các con số máy tính còn có xu hướng làm việc với các ký tự. Ký tự được mã hóa trong máy tính thành dạng nhị phân để máy tính có thể xử lý. Kiểu mã hóa thông dụng nhất hiện nay là mã ASCII ( Amercan Standard Code for Information Interchange ). Code ;ASCII mov ah,2 mov dl,0 print: int 21h inc dl cmp dl,255 jne print +Lập trình với ASM chúng ta luôn phải xử lý các số ở hệ đếm này nhưng có thể lại phải viết ra ở 1 hệ đếm khác nên việc chuyển đổi giữa các hệ đếm là khá cần thiết: 1. Chuyển đổi từ hệ cơ số 2 ( binary ), hệ cơ số 16 ( hexademical ) sang hệ cơ số 10 ( demical ). Ví dụ: 10110b = 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 22 23Dh = 2*16^2 + 3*16^1 + D*16^0 = 317 Tổng quát: Có 1 số ở hệ cơ số x có các chữ số từ phải qua trái là a[1], a[2], a[n] thì ở hệ cơ số 10 nó có giá trị: a[n]*x^(n-1) + a[n-1]*x^(n-2) + a[2]*x^1 + a[1]*x^0 2. Chuyển từ hệ cơ số 10 sang hệ 2 và 16. Ví dụ: 698 = 43*16 + 10 ( Ah ) 43 = 2*16 + 11 ( Bh ) 2 * 0*16 + 2 Viết liên tiếp các phần dư từ dưới lên trên ta được số cần tìm: 2BAh Với hệ cơ số 2 chúng ta cũng làm tương tự. 3. Chuyển đổi giữa hệ 2 và 16. Ví dụ: chuyển 5D6Ch sang hệ cơ số 2. 5h = 101b Dh = 1101b 6h = 110b Ch = 1100b Nên 5D6Ch = 10111011101100b Để chuyển từ hệ cơ số 2 sang hệ cơ số 16 ta làm ngược lại. THẢO LUẬN Soc_Lau Minh da tim thay mot chuong trinh de chuyen doi tu hex >dec >bin la cai chuong trinh o tai day ne: http://occcsa.com/hex.htm neu bac nao luoi doi thi lay chuong trinh nay ve xai. minh tim trong box nay thi thay mot bai ve asm32 cua bac Deux rat hay neu ai chua doc qua thi nen tham khao: http://www.hvaonline.net/forum/showtopic_18969.html .html Zombie http://zombie.thehot50.com/Temporary/MathApp.zip > Convert các hệ số Zombie mới code Mấy bác thử xem Có error gì cho bít he Aladdin To Zombie : A required file - MSCOREE.DLL was not found. Hic, bác nào lười thì tự mình viết chương trình chuyển đổi chứ đi xài của người khác thì càng lười hơn ! Rongchaua RCA: Trong Win nào cũng có thằng Calculator để chuyển đổi giữa các hệ số cả mà. Thằng Science Calculator đó, nó sử dụng rất tốt mà. Zombie 1. hehe Code = .NET nên mấy cái require DLL hơi bị phiền hà 2. hihi Tự code mà xài vẫn vui hơn Tiện thể ôn cách convert các hệ số lun . đổi giữa hệ 2 và 16 . Ví dụ: chuyển 5D6Ch sang hệ cơ số 2. 5h = 10 1b Dh = 11 01 b 6h = 11 0b Ch = 11 00 b Nên 5D6Ch = 10 111 01 1 1 01 1 00 b Để chuyển từ hệ cơ số 2 sang hệ cơ số 16 ta làm ngược lại 1. Chuyển đổi từ hệ cơ số 2 ( binary ), hệ cơ số 16 ( hexademical ) sang hệ cơ số 10 ( demical ). Ví dụ: 10 1 10 b = 1* 2^4 + 0* 2^3 + 1* 2^2 + 1* 2 ^1 + 0* 2 ^0 = 22 23Dh = 2 *16 ^2 + 3 *16 ^1 + D *16 ^0. a[n -1] *x^(n-2) + a[2]*x ^1 + a [1] *x ^0 2. Chuyển từ hệ cơ số 10 sang hệ 2 và 16 . Ví dụ: 6 98 = 43 *16 + 10 ( Ah ) 43 = 2 *16 + 11 ( Bh ) 2 * 0 *16 + 2 Viết liên tiếp các phần dư từ dưới lên trên ta