Kỹ thuật vi xử lý và lập trình Assembly
Kỹ thuật vi xử lý và lập trình Assembly
+ Nhắc lại kiến trúc máy tính:
CPU, Ram(ngẫu nhiên, tắt -> mất), Rom(đọc tuần tự), Hiển thị( + bàn điều khiển), ADC(và DAC)( chuyển tín hiệu từ tương tự sang số và ngược lại), vào ra tín hiệu số( chỉ khác là giao tiếp với ngoại vi số)
1, DRam, DDRam(nhân đôi), làm bộ nhớ chính(hay off-chip..)
còn 1 loại bộ nhớ catch( nhanh,ít năng lượng, kích thước nhỏ, giá đắt) nhận dữ liệu trước khi vào CPU
2, Kênh hệ thống:
+ kênh địa chỉ: địa chỉ hóa các thành phần để phân biệt...
+ kênh dữ liệu: trao đỗi dữ liệu CPU với các tp khác
+ kênh điều khiển: điều khiển, đồng bộ tất cả các thao tác, hoạt động bên trong hệ vi XL(từ CPU,Ram,.....vào ra tín hiệu số)
=> 3 kênh hoạt động đồng thời đồng bộ
3, Kênh thông tín:
+ cổng 3 trạng thái:E(enable), IN(vào), OUT(ra), (phụ thuộc E)
điều khiển E, IN, OUT thông qua điện 2 điện trở nối tiếp R1,R2
E=1: R1,R2 không đồng thời = vô cùng.....
E=0: R1,R2 đều vô cùng, trở kháng cao không phụ thuộc
+ tổ chức kênh thông tin: mô đun nào làm việc thì cổng 3 trạng thái mở, không thì ngược lại, đương nhiên để đóng mở cổng này sử dụng kênh điều khiển
4, Bộ nhớ trung tâm
+ phương pháp quản lý:
- Yêu cầu: tích hợp cao, độ tin cậy cao, cấu trúc đơn giản
=> tổ chức bộ nhớ theo kiểu ma trận sẽ tiết kiệm rất nhiều ...
nếu có m+n bít vào => thường sẽ có 2^(m+n) dây đầu ra => ma trận chỉ có 2^m + 2^n đầu ra
5, Bộ nhớ Rom
+ A0,A1,...: bus địa chỉ + D0,D1,...: bus dữ liệu
........................
A0,A1 đều =0 => AND0= 0 => D0=0, còn lại bằng 1..
+ IC của ROm( chip)
Vpp: chân điện áp(12V) Vcc: chân nguồn(5V)
/PGN: cho phép nạp ct(=0) /CS: chọn chíp
/OE: ........đọc A0-A12: đc D0-D7: dl=> q lý 8kb
6, Bộ nhớ Ram:
+ Ram gồm ram tĩnh và ram động
+ IC của Ram( 6264):
/CS1, CS2:chọn chíp /WE : cho phép ghi
/OE: cho phép đọc 13 chân địa chỉ,8 dữ liệu
7, Tổ chức bộ nhớ trung tâm
+ ghép song song các IC nhớ ( 2764)
vd: Hệ vxl dung lượng 64kb, kenh dữ liệu 64 bit, IC 2764
1 IC: kênh dữ liệu có độ rộng 8 bit => cần 8 IC ghép song song (mỗi IC có chân địa chỉ: A12-A0: quản lý 2^13 ngăn nhớ = 8KB)
+ ghép nối tiếp các IC nhớ
vd: Hệ vxl dung lượng 64kb, kenh dữ liệu 8 bit, IC 2764
1 IC: kênh dữ liệu có độ rộng 8 bit => cần 8 IC ghép nối tiếp
+ ghép hỗn hợp song song và nối tiếp
Chương 2: bộ vxl 80x86 intel
1 Giới thiệu
+ tốc độ xung nhịp tối đa 16MHz( tần số)
+ địa chỉ hóa 16Mb bộ nhớ vật lý, 1GB bộ nhớ trung tâm
+ 2 chế độ lv: thực và ảo
+ có khả năng làm việc với các bộ đồng xử lý
2 Tổ chức phần cứng của bộ vxl 80286 ( gồm 68 chân tín hiệu)
+ Sơ đồ chức năng: BU: khối ghép kênh, AU: khối địa chỉ, ALU: số học, logic EU: thực hiện lệnh, IU: lệnh, giải mã lệnh
+ BU gồm:
1 khối đồng xử lý: tăng tốc cho CPU, thực hiện 1 lớp nhỏ bt chuyên dụng, kết nối với CPU qua : chân PEREQ và /PEACK
2 khối ghép kênh địa chỉ: tập các tín hiệu đk đồng bộ tất cả các thao tác :các chân quan trọng: INTR(yc ngắt), /Ready( ngoại vi sẵn sàng), /HOLD, HLDA (phục vụ chế độ xâm nhập trực tiếp DMA), /S0,S1/( kết hợp vs th != để quy định chu trình máy), ......
3 Khối ghép kênh dữ liệu: 16 bit D15-D0: là kênh 2 chiều 3 trạng thái
Khối đệm lệnh: chứa các kênh chưa đk giải mã => giúp song song hóa quá tình đọc lệnh và thực hiện lệnh ( k trúc đường ống)
+ Khối IU: khối lệnh, giải mã lệnh từ tệp đẹm rồi đưa vào tệp chờ
+ Khối EU: khối thực hiện lệnh gồm 3 khối:
1 khối điều khiển bên trong: bộ não của MP( hệ vxl)
2 ALU: tính toán logic, số học
3 AU: chuyển địa chỉ logic hoặc ảo => địa chỉ vật lý( thực) => đưa ra khối ghép kênh địa chỉ
3 Các thanh ghi của bộ VXL ( 16 thanh 16 bit)
- Nhóm thanh ghi đa năng : AX, BX, CX, DX: (mỗi thanh gồm 2 thanh 8 bít) : AX, DX( dùng cho các lệnh nhân chia, vào ra DL), BX( dùng chứa địa chỉ cơ sở của 1 CTDL), CX(tạo ra bộ đếm mềm(đếm số vòn lặp)
vd: AX= 10 -> AL=10, AH=0
- Nhóm thanh gi con trỏ, chỉ số: BP: (tương tự BX), SP( ngăn xếp), IP( con trỏ lệnh), SI,DI( chỉ số để truy cập vào CTDL, trong đó: SI là chỉ số đầu, DI là chỉ số cuối)
- Nhóm thanh ghi quản lý mảng nhớ: dung lượng mảng: 2^16 byte
+ CS: ql mảng mã lệnh DS:.. mảng dữ liệu SS: .... ngăn xếp
ES: ...... mảng dữ liệu phụ ( thanh ghi mở rộng)
- Nhóm thanh ghi điều khiển và trạng thái
+ Thanh ghi cờ F:
1 CF: =1 có nhớ, mượn ( phép -), (ví dụ: gán AL= 265=> AL= 9, AH=1, => tràn => CF=1)
2 PF= 1: 8 bít thấp của kết quả có chứa 1 số chẵn bit 1
3 IF=1: cho phép ngắt kích hoạt
4 PF=0: hướng dương( chiều tăng địa chỉ trong ô nhớ),...
5 OF=1: tràn( thanh ghi đích ko chứa đk địa chỉ)
6 TF=1: cho phép debug chương trình
7 AF=1: hiệu chỉnh thập phân ở 4 bít thấp nhất của AL có nhớ
( hiệu chính tp: vd: hc 10 = 0, 11=1,... 9=9 )
8 IOPL: 2 bít đặc quyền cổng vào ra( ở chế độ ảo)
9 NT: báo hiệu 1 số nv có thể trùng nhau( .......ảo)
10 ZF=1: khi kết quả phép tính =0 ( cờ zero)
11 SF=1: kết quả âm ( cờ dấu)
+ Thanh ghi MSW: trạng thái máy
PE: cho phép chế độ bảo vệ MP: đang lv với bộ đồng xl
EP: mô phỏng bộ đồng xl TS: báo hiệu chuyển nv, khi có Bộ đồng xl != cùng làm việc
3 Hoạt động của bộ VXL
3.1 Kênh nội bộ và kênh hệ thống
+ bộ tạo dao động:
+ Kênh nội bộ:
3.2 Các chíp bổ trợ cho hoạt động của bộ vxl
a, Bộ tạo dao động 82284
b, Bộ điều khiển kênh 82288
/INTA /IORC /IOWC /MRDC /MWTC
1 trong 5 chân trên =0 thì 4 chân còn lại =1
DT/R: điều khiển hướng dữ liệu ( ra ngoài hay nhận vào)
DEN: data enable, ALE: chốt địa chỉ, MCE: ...
3.3 Hoạt động của bộ vxl
+ Chu kỳ lệnh: tg hoàn tất 1 lệnh của chương trình
+ Chu kỳ máy: tg ..............1 chức năng cơ bản của lệnh
4 chu kỳ máy: đọc/ghi từ Bộ nhớ/Cổng vào ra
+ Các trạng thái chuyển tiếp của bộ vxl khi hđ:
Ti: trạng thái nghỉ Ts: phát các tín hiệu mã chu kỳ máy
Tc: .... thực hiện lệnh Th: trạng thái treo của kênh
+ Hình ảnh chu kỳ ghi thông tin
4 Quản lý bộ nhớ thực
4.1 Quản lý địa chỉ thực: 80286 dùng cặp thanh ghi mảng/ offset
+ Chế độ thực: 80286 dùng 20 chân địa chỉ=> q lý 2^20 ngăn nhớ
2, Phương pháp địa chỉ hóa
+ trực tiếp: vd: Mov Cx, 0FF0H: 0AC00H; bắt đầu bằng số 0 để trình dịch hiểu đây là 1 số
+ Gián tiếp qua thanh ghi offset=( SI,DI, BX)
vd: Mov AX, [DI]; tự động thêm DS vào thành [DS: DI]
+ Địa chỉ tương đối: offset= BX, BP + giá trị dịch chuyển
vd: Mov DX, [BX + 12h]
+ Địa chỉ hóa theo chỉ số: offset= BX, BP + dịch chuyển
vd: Mov DX, [SI + 0FH]
+ Địa chỉ tương đối theo chỉ số: offset= BX,BP + SI,DI
vd: Mov AX, [BX + DI]
+ Hỗn hợp: vd: Mov CX, [BX + DI + 16H]
CHƯƠNG 3: Lập trình Assembly cho hệ VXL
II Các thành phần của ngôn ngữ Assembly
1 File nguồn( .a; .asm)
2 Bộ ký tự, từ khóa, tên
+ Không phân biệt chữ hoa, chữ thường
3 Cấu trúc lệnh và chỉ dẫn
+ Lệnh: vd: Back: Mov AX,08h; nhãn back có thể bỏ nếu ko lặp
+ Chỉ dẫn: PortA EQU 220h; cổng A có địa chỉ 220h
4 Các khai báo trong Assembly
+ Định nghĩa tên tượng trưng: EQU hoạc '=' là như nhau
vd: b EQU AX; biến b có giá trị bằng giá trị thanh ghi AX
+ Khai báo DL: 1byte ( DB); 2byte(DW); 4byte(DD)
vd: a DB 10h; biến a có giá trị 10h, dung lượng nhớ 1 byte
a DB 100h; a= 00h vì ngoài phạm vi ô nhớ
+ Khai báo DL có cấu trúc lặp: toán tử DUP
vd: Table DB 500 DUP(0); bảng Table gồm 500 phần tử, mỗi phần tử 1byte, tất cả các phần tử đều có giá trị bằng 0
vd2: MSG DB= "HVC"; cấp phát vừa đủ số phần tử
+ Khai báo mảng và chương trình con:
1 Mảng:tênmảng Seqment(bắt đầu) ......tênmảng Ends(kết thúc)
2 CT con: name PROC(bd) ............. name Endp(kt)
III Tập lệnh của bộ vxl 80286
1 Nhóm lệnh dịch chuyển
+ Mov th1,th2; (th1= th2) th1 là thanh ghi, ngăn nhớ, th2 có thể thêm số,,, 2 toán hạng không thể cùng là ngăn nhớ
+ PUSH th1; đẩy giá trị th1 vào Stack
+ POP th2; lấy giá trị từ Stack vào th2
2 Lệnh so sánh CMP
CMP th1, th2; lấy th1-th2 và không lưu kq ở đâu hết, mà lấy thông tin qua thanh ghi cờ
ZF=1 : th1=th2 ( kq cờ zero bằng 0)
CF=1: kq âm : th1<th2
CF=0: kq dương........
3 Nhóm lệnh lặp
+ LOOP Label ; lặp lại nhãn Label và giảm CX đi 1 đơn vị đến khi CX=0 thì dừng
4 Lệnh gọi chương trình con
Call Lebel hoặc Call Target ; cho đến khi gặp RET thì kết thức
5 Lệnh tính toán số học
+ ADD dest, source ( dest= dest+ source)
+ ADC ................... ( dest= dest+ source+ CF) ; cộng có nhớ
+ SUB .....................(.......... dest- source)
+ INC dest; dést += 1
+ DEC dest; dest-= 1
6 Nhóm lênh dịch chuyển, xoay vòng
+ Lệnh SHL ( shift logical left) : dịch trái
ct: SHL dest, CL ( CL là số bít dịch chuyển, có thể thay = số thực); kq: bít MSB được chuyển vào cờ CF, bít trống đk thay =0
vd: Mov AL, 0111 1001B
Mov CL, 3
SHL AL, CL
=> kq: AL= 1100 1000B ,, CF= 0
+ SHR : dịch phải: tương tự nhưng CF= LSB
+ ROL(rotate left) (CF= MSB): lấy CL bít đầu chuyển về cuối
vd: Mov CL,3
Mov AL, 0111 1001B
ROL AL, CL
=> kq: CF=0 AL = 1100 1 011
+ ROR : tương tự CF= LSB
7 Nhóm lệnh thực hiện phép tính logic: AND, OR, XOR, NOT
bản chất phép xor là cộng modulo2: 1 số chẵn + 1 số lẻ = số lẻ
8 Nhóm lệnh vào ra dữ liệu
+ DX: chứa địa chỉ cổng vào ra
+ AX(nếu bus DL 16 bít) ,AL(8 bít) : chứa dữ liệu
IN AL, DX( bus dl 8 bít); đọc DL từ cổng có địa chỉ DX vào AL
OUT DX, AL; ghi DL từ AL ra cổng có địa chỉ là DX
9 Nhóm lệnh nhảy
a, Không điều kiện: JMP Label
b, Có điều kiện
+ JC Label: nhảy nếu cờ CF=1
JNC ......: nhảy nếu cờ CF= 0
+ JZ ..............................ZF =1
JNZ.............................ZF=0
..................................................
Bài tập
bài 2: viết chương trình chuyển dữ liệu dạng mã Hex từ cổng 8bit có địa chỉ 300h => Buffer Ram sau khi đã đổi thành mã ascii
với điều kiện:
a, Số lượng byte nhận được là 1024 byte
b, Cổng trạng thái 8 bít có đc: 301h, có chức năng nhận trạng thái DL,, bít D0=1 báo là có DL, D0=0 là ngược lại
bài 3: Viết chương trình cho hệ vxl điều khiển khóa số tự động
+ Bảng mã số 10byte được cài trong bộ nhớ của hệ vxl
+ mỗi byte được mã hóa bằng mã ascii
+ mở khóa phải bấm số đúng trình tự, và đưa qua cổng 300h,,, mở khóa bằng bit D0 của cổng 302h
+ Nếu không đúng => báo động qua bit D0 của cổng 303h
+ Biết : cổng trạng thái 8 bít có địa chỉ 301h có chức năng xác nhận trạng thái phím bấm D0=1 : có dữ liệu, D0=0, không có dữ liệu
Cgroup GROUP code_seq, data_seq; nhom 2 mang
portdata EQU 300h
portstatus EQU 301h
LockOpen EQU 302h
LockPic EQU 303h
code_seq, SEGMENT; khai bao mang
ASSUME CS: Cgroup, DS: Cgroup; 2 thanh ghi nay quan ly Cgrou
ORG 100h
ThuTucChinh PROC
Call ELOCK; goi chuong trinh con
ThuTucChinh Endp
+ ELOCK PROC
push Ax
push Bx
push Cx
push Dx
Mov Bx, offsetKey
Mov Cx,10
Mov AL, 00h; khoi tao trang thai: ko mo khoa, khong bao dog
Mov Dx, LockOpen
Out Dx,AL
Mov Dx, LockPic
Out Dx,Al
Next:
Call Inport; goi thu tuc nhan byte tu cong
AND AL,7Fh; loc bo bit parity ( MSB)
CMP AL,[Bx]
JNZ Pic; nhay den bao dong
INC Bx;
LOOP Next
OpenIt:
Mov Dx,LockOpen
Mov AL, 01h
Out Dx, AL
JMP END
Pic:
Mov DX, Lockpic
Mov AL, 01h
Out Dx,AL; bao dong
End:
Pop DX ...CX...BX....AX
RET
ELOCK End
+ Inport PROC NEAR
push Dx
Mov Dx, portStatus
Read Again:
IN AL, DX; doc cong trang thai
And AL, 01h; loc bit D0
JZ Read_Again; chua co du lieu thi doc lai
Mov Dx, PortData
IN AL, DX; co du lieu roi thi truyen
Pop Dx
Ret
InPort EnpP
Code Seq EndS; dong mang code Seq
Data_Seq SEGMENT
KEY
DB 30h; ma ascii ung voi byte thu 1 ( so 0)
................
DB 39h;..........................................10 ( so 9)
Date_Seq EndS
END ThuTucChinh
+ Nhắc lại kiến trúc máy tính:
CPU, Ram(ngẫu nhiên, tắt -> mất), Rom(đọc tuần tự), Hiển thị( + bàn điều khiển), ADC(và DAC)( chuyển tín hiệu từ tương tự sang số và ngược lại), vào ra tín hiệu số( chỉ khác là giao tiếp với ngoại vi số)
1, DRam, DDRam(nhân đôi), làm bộ nhớ chính(hay off-chip..)
còn 1 loại bộ nhớ catch( nhanh,ít năng lượng, kích thước nhỏ, giá đắt) nhận dữ liệu trước khi vào CPU
2, Kênh hệ thống:
+ kênh địa chỉ: địa chỉ hóa các thành phần để phân biệt...
+ kênh dữ liệu: trao đỗi dữ liệu CPU với các tp khác
+ kênh điều khiển: điều khiển, đồng bộ tất cả các thao tác, hoạt động bên trong hệ vi XL(từ CPU,Ram,.....vào ra tín hiệu số)
=> 3 kênh hoạt động đồng thời đồng bộ
3, Kênh thông tín:
+ cổng 3 trạng thái:E(enable), IN(vào), OUT(ra), (phụ thuộc E)
điều khiển E, IN, OUT thông qua điện 2 điện trở nối tiếp R1,R2
E=1: R1,R2 không đồng thời = vô cùng.....
E=0: R1,R2 đều vô cùng, trở kháng cao không phụ thuộc
+ tổ chức kênh thông tin: mô đun nào làm việc thì cổng 3 trạng thái mở, không thì ngược lại, đương nhiên để đóng mở cổng này sử dụng kênh điều khiển
4, Bộ nhớ trung tâm
+ phương pháp quản lý:
- Yêu cầu: tích hợp cao, độ tin cậy cao, cấu trúc đơn giản
=> tổ chức bộ nhớ theo kiểu ma trận sẽ tiết kiệm rất nhiều ...
nếu có m+n bít vào => thường sẽ có 2^(m+n) dây đầu ra => ma trận chỉ có 2^m + 2^n đầu ra
5, Bộ nhớ Rom
+ A0,A1,...: bus địa chỉ + D0,D1,...: bus dữ liệu
........................
A0,A1 đều =0 => AND0= 0 => D0=0, còn lại bằng 1..
+ IC của ROm( chip)
Vpp: chân điện áp(12V) Vcc: chân nguồn(5V)
/PGN: cho phép nạp ct(=0) /CS: chọn chíp
/OE: ........đọc A0-A12: đc D0-D7: dl=> q lý 8kb
6, Bộ nhớ Ram:
+ Ram gồm ram tĩnh và ram động
+ IC của Ram( 6264):
/CS1, CS2:chọn chíp /WE : cho phép ghi
/OE: cho phép đọc 13 chân địa chỉ,8 dữ liệu
7, Tổ chức bộ nhớ trung tâm
+ ghép song song các IC nhớ ( 2764)
vd: Hệ vxl dung lượng 64kb, kenh dữ liệu 64 bit, IC 2764
1 IC: kênh dữ liệu có độ rộng 8 bit => cần 8 IC ghép song song (mỗi IC có chân địa chỉ: A12-A0: quản lý 2^13 ngăn nhớ = 8KB)
+ ghép nối tiếp các IC nhớ
vd: Hệ vxl dung lượng 64kb, kenh dữ liệu 8 bit, IC 2764
1 IC: kênh dữ liệu có độ rộng 8 bit => cần 8 IC ghép nối tiếp
+ ghép hỗn hợp song song và nối tiếp
Chương 2: bộ vxl 80x86 intel
1 Giới thiệu
+ tốc độ xung nhịp tối đa 16MHz( tần số)
+ địa chỉ hóa 16Mb bộ nhớ vật lý, 1GB bộ nhớ trung tâm
+ 2 chế độ lv: thực và ảo
+ có khả năng làm việc với các bộ đồng xử lý
2 Tổ chức phần cứng của bộ vxl 80286 ( gồm 68 chân tín hiệu)
+ Sơ đồ chức năng: BU: khối ghép kênh, AU: khối địa chỉ, ALU: số học, logic EU: thực hiện lệnh, IU: lệnh, giải mã lệnh
+ BU gồm:
1 khối đồng xử lý: tăng tốc cho CPU, thực hiện 1 lớp nhỏ bt chuyên dụng, kết nối với CPU qua : chân PEREQ và /PEACK
2 khối ghép kênh địa chỉ: tập các tín hiệu đk đồng bộ tất cả các thao tác :các chân quan trọng: INTR(yc ngắt), /Ready( ngoại vi sẵn sàng), /HOLD, HLDA (phục vụ chế độ xâm nhập trực tiếp DMA), /S0,S1/( kết hợp vs th != để quy định chu trình máy), ......
3 Khối ghép kênh dữ liệu: 16 bit D15-D0: là kênh 2 chiều 3 trạng thái
Khối đệm lệnh: chứa các kênh chưa đk giải mã => giúp song song hóa quá tình đọc lệnh và thực hiện lệnh ( k trúc đường ống)
+ Khối IU: khối lệnh, giải mã lệnh từ tệp đẹm rồi đưa vào tệp chờ
+ Khối EU: khối thực hiện lệnh gồm 3 khối:
1 khối điều khiển bên trong: bộ não của MP( hệ vxl)
2 ALU: tính toán logic, số học
3 AU: chuyển địa chỉ logic hoặc ảo => địa chỉ vật lý( thực) => đưa ra khối ghép kênh địa chỉ
3 Các thanh ghi của bộ VXL ( 16 thanh 16 bit)
- Nhóm thanh ghi đa năng : AX, BX, CX, DX: (mỗi thanh gồm 2 thanh 8 bít) : AX, DX( dùng cho các lệnh nhân chia, vào ra DL), BX( dùng chứa địa chỉ cơ sở của 1 CTDL), CX(tạo ra bộ đếm mềm(đếm số vòn lặp)
vd: AX= 10 -> AL=10, AH=0
- Nhóm thanh gi con trỏ, chỉ số: BP: (tương tự BX), SP( ngăn xếp), IP( con trỏ lệnh), SI,DI( chỉ số để truy cập vào CTDL, trong đó: SI là chỉ số đầu, DI là chỉ số cuối)
- Nhóm thanh ghi quản lý mảng nhớ: dung lượng mảng: 2^16 byte
+ CS: ql mảng mã lệnh DS:.. mảng dữ liệu SS: .... ngăn xếp
ES: ...... mảng dữ liệu phụ ( thanh ghi mở rộng)
- Nhóm thanh ghi điều khiển và trạng thái
+ Thanh ghi cờ F:
1 CF: =1 có nhớ, mượn ( phép -), (ví dụ: gán AL= 265=> AL= 9, AH=1, => tràn => CF=1)
2 PF= 1: 8 bít thấp của kết quả có chứa 1 số chẵn bit 1
3 IF=1: cho phép ngắt kích hoạt
4 PF=0: hướng dương( chiều tăng địa chỉ trong ô nhớ),...
5 OF=1: tràn( thanh ghi đích ko chứa đk địa chỉ)
6 TF=1: cho phép debug chương trình
7 AF=1: hiệu chỉnh thập phân ở 4 bít thấp nhất của AL có nhớ
( hiệu chính tp: vd: hc 10 = 0, 11=1,... 9=9 )
8 IOPL: 2 bít đặc quyền cổng vào ra( ở chế độ ảo)
9 NT: báo hiệu 1 số nv có thể trùng nhau( .......ảo)
10 ZF=1: khi kết quả phép tính =0 ( cờ zero)
11 SF=1: kết quả âm ( cờ dấu)
+ Thanh ghi MSW: trạng thái máy
PE: cho phép chế độ bảo vệ MP: đang lv với bộ đồng xl
EP: mô phỏng bộ đồng xl TS: báo hiệu chuyển nv, khi có Bộ đồng xl != cùng làm việc
3 Hoạt động của bộ VXL
3.1 Kênh nội bộ và kênh hệ thống
+ bộ tạo dao động:
+ Kênh nội bộ:
3.2 Các chíp bổ trợ cho hoạt động của bộ vxl
a, Bộ tạo dao động 82284
b, Bộ điều khiển kênh 82288
/INTA /IORC /IOWC /MRDC /MWTC
1 trong 5 chân trên =0 thì 4 chân còn lại =1
DT/R: điều khiển hướng dữ liệu ( ra ngoài hay nhận vào)
DEN: data enable, ALE: chốt địa chỉ, MCE: ...
3.3 Hoạt động của bộ vxl
+ Chu kỳ lệnh: tg hoàn tất 1 lệnh của chương trình
+ Chu kỳ máy: tg ..............1 chức năng cơ bản của lệnh
4 chu kỳ máy: đọc/ghi từ Bộ nhớ/Cổng vào ra
+ Các trạng thái chuyển tiếp của bộ vxl khi hđ:
Ti: trạng thái nghỉ Ts: phát các tín hiệu mã chu kỳ máy
Tc: .... thực hiện lệnh Th: trạng thái treo của kênh
+ Hình ảnh chu kỳ ghi thông tin
4 Quản lý bộ nhớ thực
4.1 Quản lý địa chỉ thực: 80286 dùng cặp thanh ghi mảng/ offset
+ Chế độ thực: 80286 dùng 20 chân địa chỉ=> q lý 2^20 ngăn nhớ
2, Phương pháp địa chỉ hóa
+ trực tiếp: vd: Mov Cx, 0FF0H: 0AC00H; bắt đầu bằng số 0 để trình dịch hiểu đây là 1 số
+ Gián tiếp qua thanh ghi offset=( SI,DI, BX)
vd: Mov AX, [DI]; tự động thêm DS vào thành [DS: DI]
+ Địa chỉ tương đối: offset= BX, BP + giá trị dịch chuyển
vd: Mov DX, [BX + 12h]
+ Địa chỉ hóa theo chỉ số: offset= BX, BP + dịch chuyển
vd: Mov DX, [SI + 0FH]
+ Địa chỉ tương đối theo chỉ số: offset= BX,BP + SI,DI
vd: Mov AX, [BX + DI]
+ Hỗn hợp: vd: Mov CX, [BX + DI + 16H]
CHƯƠNG 3: Lập trình Assembly cho hệ VXL
II Các thành phần của ngôn ngữ Assembly
1 File nguồn( .a; .asm)
2 Bộ ký tự, từ khóa, tên
+ Không phân biệt chữ hoa, chữ thường
3 Cấu trúc lệnh và chỉ dẫn
+ Lệnh: vd: Back: Mov AX,08h; nhãn back có thể bỏ nếu ko lặp
+ Chỉ dẫn: PortA EQU 220h; cổng A có địa chỉ 220h
4 Các khai báo trong Assembly
+ Định nghĩa tên tượng trưng: EQU hoạc '=' là như nhau
vd: b EQU AX; biến b có giá trị bằng giá trị thanh ghi AX
+ Khai báo DL: 1byte ( DB); 2byte(DW); 4byte(DD)
vd: a DB 10h; biến a có giá trị 10h, dung lượng nhớ 1 byte
a DB 100h; a= 00h vì ngoài phạm vi ô nhớ
+ Khai báo DL có cấu trúc lặp: toán tử DUP
vd: Table DB 500 DUP(0); bảng Table gồm 500 phần tử, mỗi phần tử 1byte, tất cả các phần tử đều có giá trị bằng 0
vd2: MSG DB= "HVC"; cấp phát vừa đủ số phần tử
+ Khai báo mảng và chương trình con:
1 Mảng:tênmảng Seqment(bắt đầu) ......tênmảng Ends(kết thúc)
2 CT con: name PROC(bd) ............. name Endp(kt)
III Tập lệnh của bộ vxl 80286
1 Nhóm lệnh dịch chuyển
+ Mov th1,th2; (th1= th2) th1 là thanh ghi, ngăn nhớ, th2 có thể thêm số,,, 2 toán hạng không thể cùng là ngăn nhớ
+ PUSH th1; đẩy giá trị th1 vào Stack
+ POP th2; lấy giá trị từ Stack vào th2
2 Lệnh so sánh CMP
CMP th1, th2; lấy th1-th2 và không lưu kq ở đâu hết, mà lấy thông tin qua thanh ghi cờ
ZF=1 : th1=th2 ( kq cờ zero bằng 0)
CF=1: kq âm : th1<th2
CF=0: kq dương........
3 Nhóm lệnh lặp
+ LOOP Label ; lặp lại nhãn Label và giảm CX đi 1 đơn vị đến khi CX=0 thì dừng
4 Lệnh gọi chương trình con
Call Lebel hoặc Call Target ; cho đến khi gặp RET thì kết thức
5 Lệnh tính toán số học
+ ADD dest, source ( dest= dest+ source)
+ ADC ................... ( dest= dest+ source+ CF) ; cộng có nhớ
+ SUB .....................(.......... dest- source)
+ INC dest; dést += 1
+ DEC dest; dest-= 1
6 Nhóm lênh dịch chuyển, xoay vòng
+ Lệnh SHL ( shift logical left) : dịch trái
ct: SHL dest, CL ( CL là số bít dịch chuyển, có thể thay = số thực); kq: bít MSB được chuyển vào cờ CF, bít trống đk thay =0
vd: Mov AL, 0111 1001B
Mov CL, 3
SHL AL, CL
=> kq: AL= 1100 1000B ,, CF= 0
+ SHR : dịch phải: tương tự nhưng CF= LSB
+ ROL(rotate left) (CF= MSB): lấy CL bít đầu chuyển về cuối
vd: Mov CL,3
Mov AL, 0111 1001B
ROL AL, CL
=> kq: CF=0 AL = 1100 1 011
+ ROR : tương tự CF= LSB
7 Nhóm lệnh thực hiện phép tính logic: AND, OR, XOR, NOT
bản chất phép xor là cộng modulo2: 1 số chẵn + 1 số lẻ = số lẻ
8 Nhóm lệnh vào ra dữ liệu
+ DX: chứa địa chỉ cổng vào ra
+ AX(nếu bus DL 16 bít) ,AL(8 bít) : chứa dữ liệu
IN AL, DX( bus dl 8 bít); đọc DL từ cổng có địa chỉ DX vào AL
OUT DX, AL; ghi DL từ AL ra cổng có địa chỉ là DX
9 Nhóm lệnh nhảy
a, Không điều kiện: JMP Label
b, Có điều kiện
+ JC Label: nhảy nếu cờ CF=1
JNC ......: nhảy nếu cờ CF= 0
+ JZ ..............................ZF =1
JNZ.............................ZF=0
..................................................
Bài tập
bài 2: viết chương trình chuyển dữ liệu dạng mã Hex từ cổng 8bit có địa chỉ 300h => Buffer Ram sau khi đã đổi thành mã ascii
với điều kiện:
a, Số lượng byte nhận được là 1024 byte
b, Cổng trạng thái 8 bít có đc: 301h, có chức năng nhận trạng thái DL,, bít D0=1 báo là có DL, D0=0 là ngược lại
bài 3: Viết chương trình cho hệ vxl điều khiển khóa số tự động
+ Bảng mã số 10byte được cài trong bộ nhớ của hệ vxl
+ mỗi byte được mã hóa bằng mã ascii
+ mở khóa phải bấm số đúng trình tự, và đưa qua cổng 300h,,, mở khóa bằng bit D0 của cổng 302h
+ Nếu không đúng => báo động qua bit D0 của cổng 303h
+ Biết : cổng trạng thái 8 bít có địa chỉ 301h có chức năng xác nhận trạng thái phím bấm D0=1 : có dữ liệu, D0=0, không có dữ liệu
Cgroup GROUP code_seq, data_seq; nhom 2 mang
portdata EQU 300h
portstatus EQU 301h
LockOpen EQU 302h
LockPic EQU 303h
code_seq, SEGMENT; khai bao mang
ASSUME CS: Cgroup, DS: Cgroup; 2 thanh ghi nay quan ly Cgrou
ORG 100h
ThuTucChinh PROC
Call ELOCK; goi chuong trinh con
ThuTucChinh Endp
+ ELOCK PROC
push Ax
push Bx
push Cx
push Dx
Mov Bx, offsetKey
Mov Cx,10
Mov AL, 00h; khoi tao trang thai: ko mo khoa, khong bao dog
Mov Dx, LockOpen
Out Dx,AL
Mov Dx, LockPic
Out Dx,Al
Next:
Call Inport; goi thu tuc nhan byte tu cong
AND AL,7Fh; loc bo bit parity ( MSB)
CMP AL,[Bx]
JNZ Pic; nhay den bao dong
INC Bx;
LOOP Next
OpenIt:
Mov Dx,LockOpen
Mov AL, 01h
Out Dx, AL
JMP END
Pic:
Mov DX, Lockpic
Mov AL, 01h
Out Dx,AL; bao dong
End:
Pop DX ...CX...BX....AX
RET
ELOCK End
+ Inport PROC NEAR
push Dx
Mov Dx, portStatus
Read Again:
IN AL, DX; doc cong trang thai
And AL, 01h; loc bit D0
JZ Read_Again; chua co du lieu thi doc lai
Mov Dx, PortData
IN AL, DX; co du lieu roi thi truyen
Pop Dx
Ret
InPort EnpP
Code Seq EndS; dong mang code Seq
Data_Seq SEGMENT
KEY
DB 30h; ma ascii ung voi byte thu 1 ( so 0)
................
DB 39h;..........................................10 ( so 9)
Date_Seq EndS
END ThuTucChinh
Nhận xét
Đăng nhận xét