Trờn hỡnh 2.5.1a là hỡnh vẽ mụ tả một chu kỳ xung nhịp (chu kỳ đồng hồ), một chu kỳ đồng hồ bao gồm 2 pha đối xứng gọi là pha 1 (tớn hiệu đồng hồ ở mức thấp) và pha 2 (tớn hiệu đồng hồ ở mức cao). Cỏc chu kỳ đồng hồ này được đưa đến lối vào xung nhịp của vi xử lý. Một chu kỳ xung nhịp cũn được gọi là một nhịp. Thời gian cần thiết và số xung nhịp cơ sở cho một thao tỏc của vi xử lý gọi là một chu kỳ mỏỵ Mỗi một chu kỳ mỏy cú 4 nhịp. Hỡnh 2.5.1b là giản đồ thời gian thực hiện chu kỳ bus của vi xử lý 8086.
SƯờn lên
Mức thấp Mức cao SƯờn xuống
Hỡnh 2.5.1a: Xung nhịp
Nhỡn vào chu kỳ bus ta cú thể phõn ra làm 4 pha như sau:
- Pha T1: Cỏc đường trạng thỏi hoạt động để xỏc định kiểu thao tỏc nào được CPU thực hiện, đồng thời cỏc địa chỉ bộ nhớ I/O cũng được truyền.
- Pha T2: Cỏc tớn hiệu địa chỉ được thay thế bằng cỏc tớn hiệu dữ liệu, cỏc tớn hiệu đọc/ghi trở nờn tớch cực.
- Pha T3: Trước tiờn cỏc tớn hiệu trạng thỏi được truyền đi để bỏo hiệu sắp hết một chu kỳ Bus, và sau đú tớn hiệu điều khiển cũng được truyền đị
- Pha T4: Núi chung đõy là pha rảnh rỗi, trong pha này CPU và cỏc khối bờn ngoài cú thời giờ để vụ hiệu hoỏ Bus dữ liệụ
ĐƯờng truyền địa chỉ/dữ liệu Tín hiệu điều khiển RD, WR T1 T2 T3 T4 T4 Trạng thái hợp lệ Địa chỉ Dữ liệu ĐƯờng truyền trạng thái
63 2.4.2 Chu kỳ đọc/ghi của vi xử lý 8086
Hỡnh 2.5.2a chỉ ra một chu kỳ đọc của vi xử lý 8086, ngoài pha 1 được mụ tả như ở trờn ta cần chỳ ý đến cỏc pha cũn lạị Cũng cần chỳ ý rằng theo đặc điểm kỹ thuật thỡ dữ liệu phải tồn tại ớt nhất 20 ns trước khi kết thỳc T3 và vẫn phải tồn tại ớt nhất 10 ns sau khi kết thỳc T4. Trong khi đú ta cú thể huỷ bỏ đồng thời tớn hiệu bỏo đọc (0 ns).
Địa chỉ
RD
AD0-AD15 Địa chỉ Dữ liệu
T4 T3 T2 T1 Xung nhịp 1 2 3 4 5 6 7 8
Hỡnh 2.5.2a: Chu kỳ đọc của vi xử lý
Trong đú cỏc đường:
1. tCRAZ: Đồng hồ ở mức thất cho đến khi bus địa chỉ ở trạng thỏi Hi-Z = 35ns Max. 2. tCLRL: Đồng hồ ở mức thấp cho đến khi RD hoạt động = 70ns Max.
3. tAZLN: Bus địa chỉ được thả nổi cho đến khi RD hoạt động = 0ns Min.
4. tOVCL: Dữ liệu hợp lệ cho đến khi đồng hồ ở mức thấp cho đến khi đồng hồ ở mức thấp = 20ns Min.
5. tCLDX: Đồng hồ ở mức thấp cho đến khi dữ liệu khụng hợp lệ = 10ns Min. 6. tCLRH: Đồng hồ mức thấp cho đến khi RD ở mức cao = 10ns Min.
7. tRMAV: RD ở mức cao cho đến khi cỏc địa chỉ hợp lệ = 85ns Min.
8. tRHDX: Đọc dữ liệu ở mức cao cho đến khi dữ liệu khụng hợp lệ = 0 Min.
Việc truy nhập bộ nhớ kộo dài từ T1 – T3 (gần 3 chu kỳ đồng hồ 3*T = 3*200 = 600ns). Trong tổng số thời gian này phải tớnh đến thời gian trễ khi truyền địa chỉ ttrễđịachỉ = 110ns, thời gian giữ của dữ liệu khi đọc tgiữ = 30ns và thời gian trễ do truyền tớn hiệu qua cỏc mạch đệm nhiều nhất là ttrễ đệm = 40ns. Như vậy cỏc bộ nhớ nối với 8086 – 5MHz cần phải cú thời gian thõm nhập nhỏ hơn:
3*T - ttrễđịachỉ - tgiữ - ttrễđệm = 600 – 110 – 30 – 40 = 420ns
Hỡnh 2.5.2b chỉ ra một chu kỳ ghi của vi xử lý 8086, ngoài pha T1 được mụ tả như ở trờn ta cần chỳ ý đến cỏc pha sau:
- Pha T2: Trong pha này CPU xuất ra dữ liệu cần được ghi và tớn hiệu bỏo ghi tới bộ nhớ hoặc I/Ọ
- Pha T3: Trong giai đoạn này dữ liệu ghi là ổn định và tớn hiệu bỏo ghi đó được tạo rạ
- Pha T4: Tớn hiệu bỏo ghi bị vụ hiệu hoỏ và sau đú dữ liệu cần ghi cũng bị huỷ bỏ để dành chỗ cho cỏc địa chỉ của pha T1 của chu kỳ tiếp theọ
Xung nhịp
Địa chỉ Dữ liệu Địa chỉ
5 4 3 2 1 T1 T2 T3 T4 AD0-AD15 WR
Hỡnh 2.5.2b. Chu kỳ ghi của vi xử lý 8086
1. tCLDV: Đồng hồ ở mức thấp cho đến khi dữ liệu hợp lệ = 44ns Max. 2. tCVTCV: Đồng hồ ở mức thấp cho đến khi WR hoạt động = 70ns Max. 3. tCVCTX: Đồng hồ ở mức thấp cho đến khi WR khụng hoạt động = 55ns Max. 4. tCHDX: Đồng hồ ở mức cao cho đến khi dữ liệu khụng hợp lệ = 10ns Min. 5. WR khụng hoạt động cho đến khi dữ liệu khụng hoạt động = 10ns.
2.5 Lập trỡnh hợp ngữ (Assembly) cho vi xử lý 80x86
[Tham khảo: http://wapediạmobi/vi ] 2.5.1 Giới thiệu chung về hợp ngữ
Hợp ngữ (assembly language) là một ngụn ngữ cấp thấp dựng để viết cỏc chương trỡnh mỏy tớnh. Cỏch dựng cỏc thuật nhớ (mnemonics) thõn thiện để viết chương trỡnh đó thay thế cỏch lập trỡnh trực tiếp lờn mỏy tớnh bằng mó mỏy dạng số (numeric machine code) - từng ỏp dụng cho những mỏy tớnh đầu tiờn - vốn rất mệt nhọc, dễ gõy lỗi và tốn nhiều thời giờ. Một chương trỡnh viết bằng hợp ngữ sẽ được dịch sang ngụn ngữ mỏy bằng một tiện ớch gọi là trỡnh hợp dịch. Lưu ý rằng, trỡnh hợp dịch khỏc hoàn toàn với trỡnh biờn dịch, vốn dựng để biờn dịch cỏc ngụn ngữ cấp cao sang cỏc chỉ thị lệnh cấp thấp mà sau đú sẽ được trỡnh hợp dịch chuyển đổi sang ngụn ngữ mỏỵ Cỏc chương trỡnh hợp ngữ thường phụ thuộc chặt chẽ vào một kiến trỳc mỏy tớnh xỏc định, nú khỏc với ngụn ngữ cấp cao thường độc lập đối với cỏc nền tảng kiến trỳc phần cứng. Nhiều trỡnh hợp dịch phức tạp ngoài cỏc tớnh năng cơ bản cũn cung cấp thờm cỏc cơ chế giỳp cho việc viết chương trỡnh, kiểm soỏt quỏ trỡnh dịch cũng như việc gỡ rối được dễ dàng hơn. Hợp ngữ đó từng được dựng rộng rói trong tất cả cỏc khớa cạnh lập trỡnh, nhưng ngày nay nú cú xu hướng chỉ được dựng trong một số lónh vực hẹp, chủ yếu để giao tiếp trực tiếp với phần cứng hoặc xử lý cỏc vấn đề liờn quan đến tốc độ cao điển hỡnh như cỏc trỡnh điều khiển thiết bị, cỏc hệ thống nhỳng cấp thấp và cỏc ứng dụng thời gian thực..
65 2.5.2 Cấu trỳc chung của chương trỡnh hợp ngữ
2.5.2.1 Cấu trỳc của một lệnh hợp ngữ
Tham khảo: http://www.emu8086.com/ Một dũng lệnh trong chương trỡnh hợp ngữ gồm cú cỏc trường sau:
Tờn Lệnh Toỏn hạng Chỳ thớch
A: Mov AH, 10h ; Đưa giỏ trị 10h vào thanh ghi AH Cấu trỳc thụng thường của một chương trỡnh hợp ngũ
.model <Khai bỏo kiểu chương trỡnh>
.stack <Khai bỏo kớch thước ngăn xếp>
.data
<Khai bỏo dữ liệu>
.code
<Cỏc lệnh>
end
Vớ dụ: Chương trỡnh sau in ra màn hỡnh dũng chữ “Hello !”
.model small
.stack 100h
.data
s DB “Hello !$” ; khai bỏo xõu kớ tự cần in
.code
mov AX,@data ; lấy địa chỉ data segment ghi vào DS mov DS,AX ; Vỡ model small, đõy cũng là địa chỉ
; segment của xõu s ; xuất chuỗi
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX mov AH , 9
int 21h ; gọi hàm 9, ngắt 21h để in mov AH, 4Ch ; Thoỏt khỏi chương trỡnh int 21h
end
Lưu ý:
- Mọi chương trỡnh đều phải cú đoạn CODE thoỏt khỏi chương trỡnh, nếu khụng chương trỡnh sẽ khụng dừng khi hết chương trỡnh của mỡnh.
2.5.2.2 Khung chương trỡnh dịch ra .exe
data segment
; ađ your data here!
pkey db "press any key to exit ...$" ends stack segment dw 128 dup(0) ends CODE segment start:
; set segment registers: MOV ax, data
MOV ds, ax MOV es, ax
; ađ your CODE here lea dx, pkey
MOV ah, 9
int 21h ; output string at ds:dx
; wait for any keỵ... MOV ah, 1
int 21h
MOV ax, 4c00h ; exit to operating system. int 21h
ends
END start ; set entry point and stop the assembler.
2.5.2.3 Khung chương trỡnh dịch ra .com
; You may customize this and other start-up templates; ; The location of this template is
;c:\emu8086\inc\0_com_templatẹtxt
CSEG SEGMENT ; code segment starts herẹ org 100h
; ađ your CODE here
ret
Khai bỏo quy mụ sử dụng bộ nhớ
CPU 8086 cú thể truy nhập tối đa 1MB bộ nhớ RAM. Dung lượng này là thừa để sử dụng cho bất kỳ loại mỏy tớnh nàọ
Bản đồ bộ nhớ của mỏy tớnh IBM PC
Địa chỉ vật lý của vựng nhớ (HEX)
Giải thớch vắn tắt
00000 - 00400 Vector ngắt. Bộ mo phỏng sẽ load file này: c:\emu8086\INT_VECT
tại địa chỉ vật lý 000000 00400 - 00500 Vựng thụng tin hệ thống.
00500 - A0000 Một vựng nhớ tự dọ Mỗi khối là 654,080 bytẹ Tại đõy cú
thể load chương trỡnh
A0000 - B1000 Vựng nhớ màn hỡnh cho VGA, monochrome, và cho cỏc bộ điều hợp khỏc
B1000 - B8000 Dự trữ
B8000 - C0000
32kb nhớ màn hỡnh cho chế độ đồ họa màu (CGA). Bộ mụ phỏng sử dụng vựng nhớ này để lưu 8 trang vựng nhớ màn hỡnh. Màn hỡnh mụ phỏng cú thể thay đổi kớch thước, nờn bộ nhớ tối thiểu được yờu cầu cho mỗi trang, mặc dự bộ mụ phỏng luụn luụn sử dụng 1000h (4096 byte) cho mỗi trang (xem ngắt 10h, AH=05h)
C0000 - F4000 Dự trữ
F4000 - 10FFEF ROM BIOS và mở rộng. Bộ mụ phỏng tải file BIOS_ROM tại địa chỉ vật lý 0F4000h. Địa chỉ của bảng vector ngắt chỉ
67 tới vựng nhớ này để tạo hàm ngắt mụ phỏng.
Bảng vector ngắt (vựng nhớ từ 00000h đến 00400h) Số hiệu
ngắt (HEX)
Địa chỉ vector ngắt
Địa chỉ của chương trỡnh con BIOS (ađress of BIOS sub-program ) 00 00x4 = 00 F400:0170 – CPU tạo, lỗi chia
04 04x4 = 10 F400:0180 - CPU tạo, phỏt hiện INTO tràn 10 10x4 = 40 F400:0190 – Hàm video
11 11x4 = 44 F400:01D0 – Nhận danh sỏch thiết bị BIOS 12 12x4 = 48 F400:01A0 – Nhận kớch thước bộ nhớ 13 13x4 = 4C F400:01B0 - Cỏc hàm về đĩa 15 15x4 = 54 F400:01E0 – Cỏc hàm BIOS 16 16x4 = 58 F400:01C0 - Cỏc hàm bàn phớm 17 17x4 = 5C F400:0400 – Mỏy in 19 19x4 = 64 FFFF:0000 – Khởi động lại 1A 1Ax4 = 68 F400:0160 – Hàm thời gian 1E 1Ex4 = 78 F400:AFC7 – vector tham số đĩa
20 20x4 = 80 F400:0150 – Hàm DOS: Kết thỳc chương trỡnh 21 21x4 = 84 F400:0200 – Cỏc hàm của DOS
33 33x4 = CC F400:0300 – Cỏc hàm chuột Cỏc hàm khỏc ??x4 = ?? F400:0100 – Cỏc ngắt mặc định
Vựng thụng tin hệ thống (Bộ nhớ từ 00400h to 00500h) Địa chỉ (HEX) Kớch thước Giải thớch
0040h:0010 WORD
Danh sỏch thiết bị BIOS
Trường bit BIOS tỡm thấy phần cứng được cài: bit(s) Giải thớch
15-14 Số thiết bị song song 13 Dự trữ
12 Cổng game được cài 11-9 Số thiết bị nối tiếp 8 Dự trữ 7-6 Số đĩa mềm (trừ 1): 00 Đĩa mềm đơn; 01 Hai dĩa mềm; 10 Ba đĩa mềm; 11 Bốn đĩa mềm; 5-4 Khởi tạo chế độ Video:
00 EGA,VGA,PGA, hoặc on-board video BIOS khỏc; 01 40x25 CGA màụ 10 80x25 CGA màu (Mụ phỏng mặc định). 11 80x25 đen trắng. 3 Dữ trữ. 2 Chuột PS/2. 1 Bộ xử lý toỏn học;
0 Được cài khi khởi động từ đĩa mềm.
0040h:0013 WORD kilobytes bắt đầu vựng nhớ liờn tiếp tại địa chỉ 00000h từ này cũng được trả về AX bởi INT 12h
giỏ trị này được đặt là 0280h (640KB) 0040h:004A WORD Số cột trờn màn hỡnh.
Mặc định là 0032h (50 cột) 0040h:004E WORD
Địa chỉ bắt đầu trang màn hỡnh hiện hành trong bộ nhớ màn hỡnh (sau 0B800:0000)
Giỏ trị mặc định: 0000h 0040h:0050 8 WORD
Bao gồm vị trớ hàng và cột cho con trỏ trong mỗi của tỏm trang nhớ màn hỡnh.
Giỏ trị mặc định: 00h (cho tất cả 8 từ (words) 0040h:0062 BYTE Số trang màn hỡnh hiện hành
Mặc định: 00h (trang đầu tiờn) 0040h:0084 BYTE Hàng trờn màn hỡnh trừ 1
Giỏ trị mặc định: 13h (19+1=20 cột)
Khai bỏo hằng, biến
Cỳ phỏp:
<tờn biến> D<Kiểu DL> <giỏ trị khởi tạo>
hoặc
<tờn biến> D<Kiểu DL> <số phần tử> dup(<giỏ trị khởi
tạo>)
Cỏc kiểu dữ liệu: B (1 byte), W (2 bytes), D (4 bytes) Nếu khụng khởi tạo, dựng dấu hỏi “?”
Vớ dụ:
Khai bỏo trong C Khai bỏo biến trong hợp ngữ
char ch; ch DB ?
char ch = ‘a’; ch DB ‘a’
char ch = 5; ch DB 5
char s[]=”\nhello world!” s DB 10,13,”hello world!$”
int i=100; i DW 100
long L; L Đ ?
char a[] = {1,2,3}; a DB 1,2,3
char a[100]; a DB 100 dup(?)
char a[100][50]; a DB 100 dup(50 dup(?))
Hằng số:
Khai bỏo hằng số trong chương trỡnh hợp ngữ bằng lệnh EQỤ Vớ dụ:
TA EQU 19, 81 TACT EQU 2, 11
Chương trỡnh con
Chương trỡnh con là một phần của mó nguồn mà cú thể gọi chỳng trong chương trỡnh của bạn để làm một vài nhiệm vụ nhất định nào đú. Chương trỡnh con làm cho chương trỡnh cú
69 cấu trỳc hơn và dễ hiểu hơn. Thụng thường, chương trỡnh con trở lại ngay sau điểm đó gọi nú.
Cấu trỳc một chương trỡnh con như sau: TấN PROC
; đõy là mó lệnh của chương trỡnh con RET
TấN ENDP
TấN là tờn của chương trỡnh con, tờn phải giống nhau ở trờn và dưới của chương trỡnh con, đú là cỏch để kiểm tra điểm kết thỳc của chương trỡnh con.
Hầu như chắc chắn, bạn đó biết rằng lệnh RET được sử dụng để trở về hệ điều hành. Lệnh tương tự cũng được sử dụng để trở về từ chương trỡnh con (thực sự, OS coi chương trỡnh của chỳng ta như một chương trỡnh con đặc biệt)
PROC và ENDP là cỏc định hướng chương trỡnh dịch, nờn chỳng khụng được dịch ra mó mỏỵ Chương trỡnh dịch nhớ địa chỉ của chương trỡnh con.
Lệnh CALL được sử dụng để gọi chương trỡnh con Đõy là một vớ dụ: ORG 100h CALL ta MOV AX, 2 RET ; Trở về OS ta PROC MOV BX, 5
RET ; Trở về sau điểm đó gọị ta ENDP
END
Vớ dụ trờn gọi chương trỡnh con ta, để thực hiện lệnh “MOV BX, 5” , và trở về sau lệnh gọi nú “MOV AX, 2”
Cú vài cỏch để truyền tham số cho chương trỡnh con, cỏch đơn giản nhất là sử dụng cỏc thanh ghi, dưới đõy là một vớ dụ khỏc về cỏch gọi chương trỡnh con và cỏch truyền tham số cho nú qua thanh ghi AL và BL, nhõn hai tham số với nhau và trả kết quả về trong thanh ghi AX: ORG 100h MOV AL, 1 MOV BL, 2 CALL m2 CALL m2 CALL m2 CALL m2 RET ; Trở về HĐH m2 PROC MUL BL ; AX = AL * BL.
RET ; Trở về sau điểm gọi nú. m2 ENDP
END
Trong vớ dụ trờn, giỏ trị của thnh ghi AL được cập nhật mỗi lần chương trỡnh con được gọi, thanh ghi BL khụng thay đổi, nờn thuật toỏn trờn là tớnh 24, kết quả lưu trong AX là 16
(hay 10h)
ORG 100h
LEA SI, tbao_tw ; Lấy địa chỉ của msg vào SỊ CALL In_Xau
RET ; trở về hệ điều hành.
;================================================= ; Chương trỡnh này in 1 xõu, xõu phải kết thỳc
; bằng ký tự null (phải cú 0 cuối xõu)
; địa chỉ của xõu phải được đặt trong thanh ghi SI: In_Xau PROC
next_char:
CMP b.[SI], 0 ; kiểm tra nếu = 0 thỡ dừng JE stop ;
MOV AL, [SI] ; lấy ký tự tiếp theọ MOV AH, 0Eh ; số hiệu in ký tự.
INT 10h ; sử dụng ngắt để in ký tự trong AL. AĐ SI, 1 ; Tăng con trỏ cần in lờn 1.
JMP next_char ; trở lại, in ký tự tiếp. stop:
RET ; trở về sau điểm gọị print_me ENDP
; =================================================== tbao_tw DB 'PICAT.dieukhien.net',0; xõu kết thỳc: null.
END
Tiếp đầu ngữ “b.” trước [SI] nghĩa là so sỏnh byte, khụng phải từ. Nếu bạn cần so sỏnh từ, bạn dựng tiếp đầu ngữ “w.” thay thế vàọ Khi một toỏn hạng đó nằm trog thanh ghi, nú khụng yờu cầu nữa bởi vỡ
Lệnh bú (Macro)
Macro tương tự như chương trỡnh con nhưng khụng thực sự là chương trỡnh con. Macro nhỡn cú vẻ như chương trỡnh con, nhưng chỳng chỉ tồn tại cho đến khi chương trỡnh được dịch, sau khi chương trỡnh được dịch tất cả cỏc macro được thay thế bằng lệnh thực sự. Nếu bạn khai bỏo một macro và khụng bao giờ sử dụng chỳng trong mó nguồn, chương trỡnh dịch sẽ bỏ qua nú.