13
Bvi xlý 8088/8086 và lp trình hp ngx86 3.1 Thanh ghi (Re gist er) Là các phn tnhđặc bit bên trong bvi xlý. các thanh ghi luôn có kích thước  bng nhau, kích thước này cũng chính là độ rng ca data bus bên trong bxlý. 8088 là bvi xlý 16 bit do đó các thanh ghi ca 8088 đều có kích thước 16 bit. Mt stác vđặc bit như nhân hay chia, kết qubt buc phi đặt trong thanh ghi Mt sthanh ghi chdùng để xác định địa chcho bxCác tác vtrên thanh ghi nhanh hơn nhiu so vi các tác vtrên bnhớ Bvi xlý 8088 có 14 thanh ghi 16 bit chia thành nhóm theo chc năng như sau:  Nhóm thanh ghi đa dng (General registers): F E D C B A 9 8 7 6 5 4 3 2 1 0 AX AH AL BX BH BL CX CH CL DX DH DL  Nhóm thanh ghi chmc và con tr(Index & Pointer registers): F E D C B A 9 8 7 6 5 4 3 2 1 0 SI SI DI DI BP BP SP SP  Nhóm thanh ghi phân đon (Segment registers): F E D C B A 9 8 7 6 5 4 3 2 1 0 DS DS ES ES SS SS CS CS Thanh ghi chiu: F E D C B A 9 8 7 6 5 4 3 2 1 0 Flag O D I T S Z A P C Thanh ghi contrlnh (Instruction Pointer) : F E D C B A 9 8 7 6 5 4 3 2 1 0 Flag IP

Bo vi xu ly 8088-8086

Embed Size (px)

Citation preview

Page 1: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 1/13

Bộ vi xử lý 8088/8086 và lập trình hợp ngữ x86

3.1 Thanh ghi (Register)

Là các phần tử nhớ đặc biệt bên trong bộ vi xử lý. các thanh ghi luôn có kích thước

 bằng nhau, kích thước này cũng chính là độ rộng của data bus bên trong bộ xử lý.8088 là bộ vi xử lý 16 bit do đó các thanh ghi của 8088 đều có kích thước 16 bit.

Một số tác vụ đặc biệt như nhân hay chia, kết quả bắt buộc phải đặt trong thanh ghiMột số thanh ghi chỉ dùng để xác định địa chỉ cho bộ xử lýCác tác vụ trên thanh ghi nhanh hơn nhiều so với các tác vụ trên bộ nhớ Bộ vi xử lý 8088 có 14 thanh ghi 16 bit chia thành nhóm theo chức năng như sau:

 Nhóm thanh ghi đa dụng (General registers):

F E D C B A 9 8 7 6 5 4 3 2 1 0

AX AH ALBX BH BLCX CH CLDX DH DL

 Nhóm thanh ghi chỉ mục và con trỏ (Index & Pointer registers):

F E D C B A 9 8 7 6 5 4 3 2 1 0

SI SIDI DIBP BPSP SP

 Nhóm thanh ghi phân đoạn (Segment registers):

F E D C B A 9 8 7 6 5 4 3 2 1 0

DS DSES ESSS SSCS CS

Thanh ghi cờ hiệu:

F E D C B A 9 8 7 6 5 4 3 2 1 0

Flag O D I T S Z A P C

Thanh ghi contrỏ lệnh (Instruction Pointer) :

F E D C B A 9 8 7 6 5 4 3 2 1 0

Flag IP

Page 2: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 2/13

3.1.1 Nhóm thanh ghi dữ liệu (Data registers):

AX,BX,CX,DX hay là AH,AL,BH,BL,CH,CL,DH,DLĐóng vai trò chủ yếu như là các phần tử nhớ cơ bản trong các quá trình tínhtoán. Tham gia vào các tác vụ tính toán của bộ xử lý. Có thể sử dụng như là

một thanh ghi 16 bit hoặc hai thanh ghi 8 bit nối liền nhau.3.1.2 Nhóm thanh ghi chỉ mục và con trỏ (Index & Pointer registers):

SI,DI,BP,SPCó thể sử dụng như các thanh ghi đa dụng, ngoài ra còn đóng vai trò làm chỉmục khi xác dịnh địa chỉ theo offset của bộ xử lý.

- SI và DI là hai thanh ghi chỉ mục để thực hiện các tác vụ chuỗi- BP và SP là hai thanh ghi con trỏ để thao tác trên cấu trúc STACK 

3.1.3 Nhóm thanh ghi phân đoạn (Segment registers):DS,ES,SS,CSKhông thể tham gia vào các tác vụ tính toán, thường chỉ dùng để xác định cácđịa chỉ phân đoạn.

- DS: Data segment register - ES: Extra segment register - SS: Stack segment register - CS: Code segment register 

3.1.4 Thanh ghi con trỏ lệnh (Instruction Pointer register):

IPKhông thể tham gia vào các tác vụ tính toán, không thể gán giá trị trực tiếp,cùng với CS tạo thành địa chỉ mã lệnh sẽ thực hiện của CPU

3.1.5 Thanh ghi cờ hiệu (Flag register):

FlagKhông thể tham gia vào các tác vụ tính toán, không thể gán giá trị trực tiếp,chỉ dùng để ghi nhận hoặc chỉ định các trạng thái làm việc của CPU.

3.2 Địa chỉ (Memory address)

Các lệnh của bộ xử lý thao tác trực tiếp lên các đối tượng chủ yếu là thanh ghi và bộnhớ . Các thanh ghi dược xác định bằng tên , các phần tử thuộc bộ nhớ được xác định bằng địa chỉ. Các bộ xử lý thuộc dòng họ x86 xác định địa chỉ bằng hai giá trị 16 bitgọi là segment và offset. Địa chỉ vật lý tương ứng được tính theo công thức :

Page 3: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 3/13

Memory_Address = Segment * 10h + Offset20 bit 16 bit 16 bit

Một địa chỉ vật lý có thể biểu diễn thành nhiều cặp segment và offset khác nhau.Thí dụ: 0040:006C 0000:046C 0020:026C

là các biểu diễn của dịa chỉ vật lý 20 bit 00046C.

3.2.1 Segment:

Segment là một đoạn bộ nhớ có kích thước tối đa 64KB (16 bit offset) và cóthể bắt đầu tại các địa chỉ chia chẵn cho 16 (10h) trên toàn bộ vùng nhớ 1MB(20 bit).

Trong hầu hết các tác vụ của bộ xử lý 8088, segment dược xác định gián tiếpqua các thanh ghi segment DS , ES , SS , CS . Khi cần sử dụng segment nào , phải gán giá trị tương ứng cho các thanh ghi segment . Lúc đó các địa chỉđược thể hiện thành dạng Segment:offset

Thí dụ: CS:Offset , DS:Offset

3.2.2 Offset:

Offset là một cự ly (16 bit) so với điểm đầu của một segment.Các cách mô tả offset:

[Const] , [BX] , [BP] , [SI] , [DI][BX+Const] , [BP+Const] , [SI+Const] , [DI+Const][BX+SI+Const] , [BX+DI+Const] , [BP+SI+Const] , [BP+DI+Const]

Const là một hằng số

* Nhận xét: Offset có thể mô tả bằng một tổng của : Hằng số 16 bit và cácthanh ghi chỉ mục BX, BP, SI, DI . Trong đó các cặp BX và BP , SI và DIkhông được phép cùng xuất hiện

3.3 Các lệnh cơ bản

Các lệnh của bộ vi xử lý 8088 dưới đây sẽ được mô tả theo dạng thức:Tên_Lệnh [Đích [, Nguồn]]

Đích (Dest) có thể là tên một thanh ghi (Reg) , một địa chỉ trong bộ nhớ (Mem), mộtvị trí trong chương trình (Label)

Nguồn (Src) có thể là tên một thanh ghi (Reg) , một địa chỉ trong bộ nhớ (Mem), mộthằng số (Const)

Đích và Nguồn không đồng thời là hai địa chỉ trong bộ nhớ (Mem)

Page 4: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 4/13

3.3.1 Lệnh MOVE 

MOVE <Dest>,<Src>

Giá trị của Src dược gán (assign) vào Dest

Không thể MOVE :- Hai thanh ghi segment- Hằng số vào thanh ghi segment- Bất cứ gia trị nào vào các thanh ghi IP và Flag

3.3.2 Lệnh XCHG 

XCHG <Dest>,<Src>

Giá trị của Src và Dest đổi chỗ cho nhau

 Src và Dest chỉ có thể là Reg hoặc Addr/MemKhông thể XCHG giữa các thanh ghi segment với nhau.

3.3.3 Lệnh INC , ADD và ADC 

INC <Dest>Lấy Dest cộng với 1 rồi gán kết quả vào Dest

ADD <Dest>,<Src>Lấy Dest cộng với Src rồi gán kết quả vào Dest

ADC <Dest>,<Src>Lấy Dest cộng với Src và cộng thêm 1 nếu CF=1 rồi gán kết quả vào Dest

3.3.4 Lệnh DEC , SUB và SBB 

DEC <Dest>Lấy Dest trừ đi 1 rồi gán kết quả vào Dest

SUB <Dest>,<Src>Lấy Dest trừ đi Src rồi gán kết quả vào Dest

SBB <Dest>,<Src>Lấy Dest trừ đi Src và trừ tiếp 1 nếu CF=1 rồi gán kết quả vào Dest

Page 5: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 5/13

3.3.5 Lệnh MUL 

MUL <Reg_8bit/Mem_8bit>

Lấy AL nhân với Reg_8bit hoặc Mem_8bit

Kết quả (16 bit) gán vào AXMUL <Reg_16bit/Mem_16bit>

Lấy AX nhân với Reg_16bit hoặc Mem_16bit Kết quả (32 bit) gán vào DX,AX (Theo thứ tự DH,DL,AH,AL)

3.3.6 Lệnh DIV 

DIV <Reg_8bit/Mem_8bit>

Lấy AX chia cho Reg_8bit hoặc Mem_8bit Kết quả (8 bit) gán vào AL , số dư (8 bit) gán vào AH

DIV <Reg_16bit/Mem_16bit>

Lấy DX,AX (32 bit) chia cho Reg_8bit hoặc Mem_8bit Kết quả (16 bit) gán vào AX , số dư (16 bit) gán vào DX

3.3.7 Lệnh IMUL và IDIV 

Giống MUL và DIV, nhưng thực hiện trên các giá trị có dấu và cho ra kết quảcó dấu

3.3.8 Lệnh AND , OR , XOR và NOT 

ADD <Dest>,<Src>OR <Dest>,<Src>XOR <Dest>,<Src>

Lấy Dest AND/OR /XOR với Src rồi gán kết quả vào Dest

NOT <Dest>

Lấy NOT của Dest gán vào Dest

Page 6: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 6/13

3.3.9 Lệnh SHL , SHR  

SHL/SHR <Reg/Mem>,1

Đẩy các bit của thanh ghi sang trái (SHL)hoặc sang phải(SHR) 1 cột

(Nhân/Chia với 2)SHL/SHR <Reg/Mem>,CL

Đẩy các bit của thanh ghi sang trái (SHL) hoặc sang phải (SHR) n cột, với n làgiá trị chứ a trong CL (Nhân/Chia với 2n )

Kết thúc lệnh , cờ hiệu CF chứa bit cuối cùng lọt ra ngoài.

Trước khi SHL SHL AL,1 SHL AL,1

1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0CF = 1 CF = 0

Trước khi SHR  SHR AL,1 SHR AL,11 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0

CF = 1 CF =1

3.3.10 Lệnh RCL , RCR  

RCL/RCR <Reg/Mem>,1

Quay các bit của thanh ghi và CF sang trái hoặc sang phải 1 cột

RCL/RCR <Reg/Mem>,CL

Quay các bit của thanh ghi và CF sang trái hoặc sang phải n cột, với n là giátrị chứ a trong CL

Trước khi RCL RCL AL,1 RCL AL,11 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1

CF = 0 CF = 1 CF = 0

Trước khi RCR  RCR AL,1 RCR AL,11 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0

CF = 0 CF = 1 CF =1

Page 7: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 7/13

3.3.11 Lệnh ROL , ROR  

ROL/ROR <Reg/Mem>,1

Quay các bit của thanh ghi sang trái (ROL) hoặc sang phải (ROR) 1 cột

ROL/ROR <Reg/Mem>,CL

Quay các bit của thanh ghi sang trái (ROL) hoặc sang phải (ROR) n cột, với nlà giá trị chứ a trong CL

Trước khi ROL ROL AL,1 ROL AL,11 0 0 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0

Trước khi ROR  ROR AL,1 ROR AL,11 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0

3.4 Các lệnh so sánh và chuyển điều khiển cơ bản

3.4.1 Lệnh JMP 

JMP <Label>CPU chuyển đến thực hiện lệnh tại <Label>.

3.4.2 Lệnh CMP và TEST 

CMP <Dest>,<Src>

Thực hiện phép trừ Dest cho Src, kết quả không được giữ lại, các cờ hiệu bịthay đổi.

Test <Dest>,<Src>Thực hiện phép AND Dest với Src, kết quả không được giữ lại, các cờ hiệu bị thay đổi.

Hai tác vụ này được phối hợp cùng với các lệnh chuyển điều khiển theo điềukiện.

3.4.3 Các lệnh chuyển điều khiển theo điều kiện

Lệnh chuyển điều khiển theo điều kiện có dạng thức chung như sau :

<Jump_command> <Label>

<Label> là một tên nhãn đánh dấu một vị trí trong chương trình. Khi điềukiện kiểm tra là đúng, CPU sẽ chuyển đến thực hiện lệnh tại vị trí <Label> ,nếu điều kiện kiểm tra là sai CPU sẽ thực hiện lệnh kế tiếp

Page 8: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 8/13

Lệnh chuyển điều khiển theo điều kiện so sánhSố không dấu Số có dấu So

sánh

JA JG >JAE , JNB JGE , JNL >=JE , JZ JE , JZ =JBE , JNA JLE , JNG <=JB JL <JNE , JNZ JNE , JNZ <>

Lệnh chuyển điều khiển theo cờ hiệu Lệnh làm thay đổi cờ hiệu trực tiếpLệnh Điều kiện Lệnh Điều kiện

JC CF = 1 STC CF = 1

JNC CF = 0 CLC CF = 0JZ ZF = 1 STD DF = 1JNZ ZF = 0 CLD DF = 0JO OF = 1 STI IF = 1JNO OF = 0 CLI IF = 0JP PF = 1JNP PF = 0JS SF = 0JNS SF = 0JNS SF = 0JCXZ CX = 0

Các lệnh chuyển điều khiển theo điều kiện thường đi theo sau lệnh CMPCác lệnh chuyển điều khiển không làm thay đổi giá trị của các cờ hiệu.

3.4.4 Lệnh LOOP 

LOOP <Label>

<Label> là một tên nhãn đánh dấu một vị trí trong chương trình.Đoạn lệnh tương đương:

SUB CX,1CMP CX,0JNE <Label>

Mỗi lần thực hiện LOOP , CX giảm đi 1 , sau đó nếu CX=0 CPU sẽ thực hiệnlệnh tiếp theo , nếu CX>0 CPU sẽ chuyển đến thực hiện lệnh tại <Label>. Nên dùng LOOP khi cần phải thực hiện các chu trình có số lần lặp đã biếttrước.

Page 9: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 9/13

3.5 Viết chương trình với Assembler 86

3.5.1 Thí dụ 1

Code segmentassume cs,ds,es:codeorg 0100h

Main proc near

; Day la ghi chu; Sau dau cham phay la ghi chu

mov ah,1 ; ah=1 , Read char functionint 021h ; chờ nhấn một phím

int 020h ; kết thúc chương trình và quay lại; dấu đợi lệnh

Main endp

Code endsend Main

Có thể viết các chương trình đầu tiên bằng cách dùng thí dụ 1 làm mẫu, chỉ cần thay thế các các dòng lệnh màu xanh bằng phần chương trình của mình

3.5.2 Thí dụ 2

Code segment

assume cs,ds,es:codeorg 0100h

Main proc near

lea dx,chuoi ; nạp địa chỉ của chuoi vào dxmov ah,9 ; ah=9 , Print stringint 021h ; In chuoi ra màn hìnhint 020h ; kết thúc chương trình và quay lại

; dấu đợi lệnhMain endp

chuoi db 'Chao ban', '$'

Code endsend Main

Page 10: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 10/13

3.5.3 Khai báo và sử dụng bộ nhớ:

Chương trình viết cho bộ vi xử lý 8088 là một tập hợp các byte vừa mã lệnhvừa dữ liệu. Người viết chương trình phải tự tổ chức và sắp xếp để khi chươngtrình được thực hiện bộ vi xử lý không nhầm lẫn giữa dữ liệu và mã lệnh.

Ta có thể khai báo một vùng nhớ trong chương trình dùng để lưu trữ dữ liệu bằng các dòng lệnh như sau:

db 1,2,3,4 ; Mô tả 4 byte lần lượt có giá trị là 1,2,3,4db 'a', 'b' ; Mô tả 2 byte mã ASCII của ký tự a và bdb 1,2,'a'

db 'chao' ; Mô tả 4 byte của chuỗi ‘chao’

dw 0,1 ; Mô tả 2 word (4 byte) 0 và 1dd 0,1 ; Mô tả 2 dword (8 byte) 0 và 1

 

Khai báo kiểu dữ liệu (db,dw,dd ) mô tả các ô nhớ và giá trị được gán trongchương trình. Số lượng các ô nhớ được xác định bằng số lượng các giá trịđược liệt kê ngay sau khai báo kiểu dữ liệu.Kiểu dữ liệu db ấn định mỗi phần tử dữ liệu có kích thước 1 byteKiểu dữ liệu dw ấn định mỗi phần tử dữ liệu có kích thước 2 byteKiểu dữ liệu dd ấn định mỗi phần tử dữ liệu có kích thước 4 byte

Để có thể sử dụng được các vùng dữ liệu đã khai báo trong chương trình,người ta “đánh dấu” các vị trí đó bằng cách đặt các nhãn ngay trước khai báokiểu:

chuoi db 'chao'

tongso db 0dayso db 5,6,7,8

Sau đó có thể khai thác các vùng nhớ này như sau:

Gán địa chỉ (offset) của chuoi vào thanh ghi dx:mov dx, offset chuoi

hoặclea dx, chuoi

Gán giá trị đang lưu tại ô nhớ tongso (1 byte) vào thanh ghi al:

mov al, byte ptr tongsoGán giá trị trong al vào ô nhớ tongso (1 byte):

mov byte ptr tongso,al

Gán giá trị của ô nhớ thứ 1 trong dayso vào al:mov al, tongso[0] ; AL sẽ bằng 5

Gán giá trị của ô nhớ thứ 2 trong dayso vào al:mov al, tongso[1] ; AL sẽ bằng 6

Page 11: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 11/13

Khi tham chiếu đến một vùng nhớ, nên mô tả tường minh về loại dữ liệu bằngchỉ định byte ptr hoặc word ptr . Nếu không mô tả thì trình hợp dịch sẽlấy theo kiểu dữ liệu đã khai báo.

3.5.4 Sử dụng các chức năng hệ thống:

Có nhiều đoạn mã lệnh dùng để điều khiển các thiết bị được thiết kế sẵn trongBIOS hoặc OS. Các chương trình viết cho PC thường dùng các đoạn mã lệnhnày hơn là phải thực hiện lại từ đầu. Cách thức này được gọi là sử dụng cácchức năng của hệ thống.

*Một số chức năng hệ thống đơn giản của DOS:

Chờ đọc một phím, có in lại phím này ra màn hìnhmov ah,1

int 021h

Sau khi thực hiện AL = mã ASCII của phím được gõ vàoIn một ký tự ra màn hình

mov dl,<ky_tu_can_in>mov ah,2

int 021h

In một chuỗi ký tự ra màn hìnhmov dx,offset <chuoi_can_in>mov ah,9

int 021h

Chuỗi ký tự phải kết thúc bằng ký tự $,

Một số các ký tự điều khiển có ảnh hưởng đến chức năng in như sau:

7 : Bell beep một tiếng8 : Back Space (BS) xóa ký tự bên trái10 : Line Feed (LF) xuống hàng13 : Carriage Return (CR) về đầu dòng

*Một số chức năng hệ thống đơn giản của BIOS:

Chờ đọc một phím, không in lại phím này ra màn hìnhmov ah,0

int 016h

Sau khi thực hiện AL = mã ASCII của phím được gõ vàoAH = scan code của phím

AL bằng 0 khi một số các phím chức năng được bấm

Page 12: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 12/13

Đọc trạng thái của bàn phímmov ah,2

int 016h

Sau khi thực hiện AL = byte trạng thái của bàn phím

In chuỗi ký tự với thuộc tính màu, bắt đầu tại vị trí row và col :mov ax,01301h

mov bh,0

mov bl,<color_code>mov bp,offset <chuoi_can_in>mov cx,<So_ky_tu_trong_chuoi>mov dh,<row > ; 0 - 24

mov dl,<col> ; 0 - 79

int 010h

Màn hình PC trong text mode có 25 dòng, mỗi dòng 80 ký tự.

Màu của ký tự được tạo thành từ màu nền (Background color) và màu ký tự(Foreground/Text color) theo công thức sau:Color_code = Foreground_Color + 16*Background_Color 

 Hãy dùng Tech Help để tham khảo các chức năng của BIOS và DOS 

Page 13: Bo vi xu ly 8088-8086

8/3/2019 Bo vi xu ly 8088-8086

http://slidepdf.com/reader/full/bo-vi-xu-ly-8088-8086 13/13