Tài liệu Vi xử lý - Chương 3: Lập trình hợp ngữ

- Tập tin .COM chỉcó một đoạn nên kích thước tối đa của một tập tin loại

này là 64 KB.

- Tập tin .COM được nạp vào bộnhớvà thực thi nhanh hơn tập tin .EXE

nhưng chỉáp dụng được cho các chương trình nhỏ.

- Chỉcó thểgọi các chương trình con dạng near.

Khi thực hiện tập tin .COM, DOS định vịbộnhớvà tạo vùng nhớdài 256

byte ởvịtrí 0000h, vùng này gọi là PSP (Program Segment Prefix), nó sẽchứa các

thông tin cần thiết cho DOS. Sau đó, các mã lệnh trong tập tin sẽ được nạp vào sau

PSP ởvịtrí 100h và đưa giá trị0 vào stack. Nhưvậy, kích thước tối đa thực sựcủa

tập tin .COM là 64 KB – 256 byte PSP – 2 byte stack.

Tất cảcác thanh ghi đoạn đều chỉ đến PSP và thanh ghi con trỏlệnh IP chỉ

đến 100h, thanh ghi SP có giá trị0FFFEh.

pdf30 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 2374 | Lượt tải: 5download
Tóm tắt nội dung Tài liệu Vi xử lý - Chương 3: Lập trình hợp ngữ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
een 
Dành riêng 
Tác động bởi nhịp đồng hồ (18.2 lần/s) 
Tác động khi có phím nhấn 
Dành riêng 
Tác động phần cứng liên lạc nối tiếp 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 65 
0Dh 
0Eh 
0Fh 
10h 
11h 
12h 
13h 
14h 
15h 
16h 
17h 
18h 
19h 
1Ah 
1Bh 
1Ch 
1Dh 
1Eh 
1Fh 
20h 
21h 
22h 
23h 
24h 
25h 
26h 
27h 
28h – 3Fh 
40h 
41h 
42h – 45h 
46h 
47h – 49h 
4Ah 
4Bh – 67h 
68h – 6Fh 
70h 
71h – 7Fh 
80h – 85h 
86h – F0h 
F1h – FFh 
Đĩa cứng 
Đĩa mềm 
Máy in 
BIOS: màn hình 
BIOS: xác định cấu hình máy tính 
BIOS: thông báo kích thước RAM 
BIOS: gọi các phục vụ đĩa cứng/mềm 
BIOS: giao tiếp nối tiếp 
BIOS: truy xuất cassette hay mở rộng ngắt 
BIOS: xuất / nhập bàn phím 
BIOS: máy in 
Xâm nhập ROM basic 
BIOS: khởi động máy tính 
BIOS: ngày / giờ hệ thống 
Lấy điều khiển từ ngắt bàn phím 
Lấy điều khiển từ ngắt đồng hồ (sau int 08h) 
Địa chỉ bảng tham số màn hình 
Địa chỉ bảng tham số đĩa 
Địa chỉ bộ mã ký tự 
DOS: kết thúc chương trình 
DOS: các chức năng DOS 
Địa chỉ cần chuyển khi kết thúc chương trình 
Địa chỉ cần chuyển khi gặp Ctrl – Break 
Địa chỉ cần chuyển khi gặp lỗi 
DOS: đọc đĩa cứng / mềm 
DOS: ghi đĩa cứng / mềm 
DOS: chấm dứt chương trình và thường trú 
Dành riêng cho DOS 
BIOS: các chức năng đĩa mềm 
Bảng thông số đĩa cứng thứ nhất 
Dành riêng 
Bảng thông số đĩa cứng thứ hai 
Định nghĩa do người sử dụng 
Giờ báo hiệu (chỉ trong AT) 
Định nghĩa do người sử dụng 
Không sử dụng 
Đồng hồ thời gian thực (chỉ trong AT) 
Dành riêng 
Dành riêng 
Sử dụng bởi chương trình thông dịch BASIC 
Không sử dụng 
9.1. Ngắt 21h 
™ Hàm 01h: nhập một ký tự từ bàn phím và hiện ký tự nhập ra màn hình. 
Nếu không có ký tự nhập, hàm 01h sẽ đợi cho đến khi nhập. 
- Gọi: AH = 01h 
- Trả về: AL chứa mã ASCII của ký tự nhập 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 66 
MOV AH,01h 
INT 21h ; AL chứa mã ASCII của ký tự nhập 
™ Hàm 02h: xuất một ký tự trong thanh ghi DL ra màn hình tại vị trí con trỏ 
hiện hành 
- Gọi AH = 02h, DL = mã ASCII của ký tự 
- Trả về: không có 
MOV AH,02h 
MOV DL,'A' 
INT 21h 
™ Hàm 08h: giống hàm 01h nhưng không hiển thị ký tự ra màn hình 
™ Hàm 09h: xuất một chuỗi ký tự ra màn hình tại vị trí con trỏ hiện hành, 
địa chỉ chuỗi được chứa trong DS:DX và phải được kết thúc bằng ký tự $ 
- Gọi AH = 09h, DS:DX = địa chỉ chuỗi 
- Trả về: không có 
.DATA 
Msg DB 'Hello$' 
… 
MOV AH,09h 
LEA DX,Msg 
INT 21h 
™ Hàm 0Ah: nhập một chuỗi ký tự từ bàn phím (tối đa 255 ký tự), dùng 
phím ENTER kết thúc chuỗi 
- Gọi AH = 0Ah, DS:DX = địa chỉ lưu chuỗi 
- Trả về: không có 
Chuỗi phải có dạng sau: 
- Byte 0: Số byte tối đa cần đọc (kể cả ký tự Enter) 
- Byte 1: số byte đã đọc 
- Byte 2: lưu các ký tự đọc 
.DATA 
Msg DB 101 ; Đọc tối đa 100 ký tự 
 DB ? 
 DB 101 DUP(?) 
 … 
MOV AH,0Ah 
 LEA DX,Msg 
 INT 21h 
™ Hàm 4Ch: kết thúc chương trình 
MOV AH,4Ch 
INT 21h 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 67 
9.2. Ngắt 10h 
™ Xoá màn hình: 
- Gọi AX = 02h 
- Trả về: không có 
MOV AX,02h 
INT 10h 
™ Chuyển toạ độ con trỏ: 
- Gọi AH = 02h, DH = dòng, DL = cột 
MOV AH,02h 
MOV DX,0F15h 
INT 10h 
10. Truyền tham số giữa các chương trình 
Trong lập trình, một vấn đề ta cần quan tâm là truyền tham số giữa chương 
trình chính và chương trình con. Để thực hiện truyền tham số, ta có thể dùng các 
cách sau đây: 
- Truyền tham số qua thanh ghi 
- Truyền tham số qua ô nhớ (biến) 
- Truyền tham số qua ô nhớ do thanh ghi chỉ đến 
- Truyền tham số qua stack 
10.1. Truyền tham số qua thanh ghi 
Ta thực hiện truyền tham số qua thanh ghi bằng cách: một chương trình con 
sẽ đưa giá trị vào thanh ghi và chưong trình con khác sẽ xử lý giá trị trên thanh ghi 
đó. 
VD: Cộng giá trị tại 2 ô nhớ 1000h và 1001h, kết quả chứa trong 1002h (bye 
cao) và 1003h (byte thấp). 
 .MODEL SMALL 
 .STACK 100h 
 .CODE 
 main PROC 
 MOV AX,@DATA 
 MOV DS,AX 
 MOV BYTE PTR DS:[1000h],10h ; Đưa giá trị vào 
 MOV BYTE PTR DS:[1001h],0FFh ; các ô nhớ 
CALL Read 
 CALL Sum 
 Mov AH,4Ch 
 INT 21h 
 main ENDP 
 Read PROC ; Đọc dữ liệu vào thanh ghi AX 
 MOV AH,DS:[1000h] 
 MOV AL,DS:[1001h] 
 RET 
 Read ENDP ; Xử lý dữ liệu tại thanh ghi AX 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 68 
 Sum PROC 
 ADD AH,AL 
 JZ next 
 MOV DS:[1003h],1 
 next: MOV DS:[1002h],AH 
 RET 
 Sum ENDP 
 END main 
10.2. Truyền tham số qua ô nhớ (biến) 
Quá trình truyền tham số cũng giống như trên nhưng thay vì thực hiện thông 
qua thanh ghi, ta sẽ thực hiện thông qua các ô nhớ. 
VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (bye cao) và 
m4 (byte thấp). 
 .MODEL SMALL 
 .STACK 100h 
 .DATA 
 m1 db ? 
 m2 db ? 
 m3 db ? 
 m4 db ? 
 .CODE 
 main PROC 
 MOV AX,@data 
 MOV DS,AX 
 MOV m1,10h ; Đưa giá trị vào 
 MOV m2,0FFh ; các ô nhớ 
 CALL Sum 
 MOV AH,4Ch 
 INT 21h 
 main ENDP 
 Sum PROC 
 MOV m4,0 
 MOV AH,m1 
 ADD AH,m2 
 JNC next 
 MOV m4,1 
 next: MOV m3,AH 
 RET 
 Sum ENDP 
 END main 
10.3. Truyền tham số qua ô nhớ do thanh ghi chỉ đến 
Trong cách truyền tham số này, ta dùng các thanh ghi SI, DI, BX để chỉ địa 
chỉ offset của các tham số còn thanh ghi đoạn mặc định là DS. 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 69 
VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (bye cao) và 
m4 (byte thấp). 
 .MODEL SMALL 
 .STACK 100h 
 .DATA 
 m1 db ? 
 m2 db ? 
 m3 db ? 
 m4 db ? 
 .CODE 
 main PROC 
 MOV AX,@data 
 MOV DS,AX 
 LEA SI,m1 
 LEA DI,m2 
 LEA BX,m3 
MOV [SI],10h ; Đưa giá trị vào 
 MOV [DI],0FFh ; các ô nhớ 
 CALL Sum 
 MOV AH,4Ch 
 INT 21h 
 main ENDP 
 Sum PROC 
 MOV AL,[SI] 
 ADD AL,[DI] 
 JZ next 
 MOV [BX+1],1 
 next: MOV [BX],AL 
 RET 
 Sum ENDP 
 END main 
10.4. Truyền tham số qua stack 
Trong phương pháp truyền tham số này, ta dùng stack làm nơi chứa các tham 
số cần truyền thông qua các tác vụ PUSH và POP. 
VD: Cộng giá trị tại 2 ô nhớ m1 và m2, kết quả chứa trong m3 (byte cao) và 
m4 (byte thấp). 
 .MODEL SMALL 
 .STACK 100h 
 .DATA 
 m1 dw ? 
 m2 dw ? 
 m3 dw ? 
 m4 dw ? 
 .CODE 
 main PROC 
 MOV AX,@data 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 70 
 MOV DS,AX 
 LEA SI,m1 
 LEA DI,m2 
 MOV [SI],1234h ; Đưa giá trị vào 
 MOV [DI],0FEDCh ; các ô nhớ 
 PUSH m1 ; Đưa vào stack 
 PUSH m2 
 CALL Sum 
 POP m3 ; Lấy kết quả đưa vào stack 
 POP m4 
 MOV AH,4Ch 
 INT 21h 
 main ENDP 
 Sum PROC 
 POP DX ; Lưu lại địa chỉ trả về của lệnh CALL 
 POP AX ; Lấy dữ liệu từ stack 
 POP BX 
 ADD AX,BX 
 JNC next 
 PUSH 1 
 next: PUSH AX 
 PUSH DX ; Trả lại địa chỉ trở về của lệnh CALL 
 RET 
 Sum ENDP 
 END main 
11. Các ví dụ minh hoạ 
11.1. In chuỗi ký tự ra màn hình 
.MODEL SMALL 
.STACK 100h 
.DATA 
 msg DB 'Hello$' 
.CODE 
main PROC 
 MOV AX,@DATA ; Khởi động thanh ghi DS 
 MOV DS,AX 
 MOV AX,02h ; Xoá màn hình 
 INT 10h 
 MOV AH,02h ; Chuyển toạ độ con trỏ 
 MOV DX,0C15h ; đến dòng 12 (0Ch) và cột 21 (15h) 
 INT 10h 
 LEA DX,msg ; Địa chỉ thông điệp 
 MOV AH,09h ; In thông điệp ra màn hình 
 INT 21h 
 MOV AH,4Ch ; Kết thúc chương trình 
 INT 21h 
main ENDP 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 71 
END main 
11.2. In chuỗi ký tự ra màn hình tại toạ độ nhập vào 
.MODEL SMALL 
.STACK 100h 
.DATA 
 msg DB 'Hello$' 
 msg1 DB 'Nhap vao toa do:$' 
 Crlf DB 0Dh,0Ah,'$' 
 Td DB 3 
 DB ? 
 DB 3 DUP(?) 
.CODE 
main PROC 
 MOV AX,@DATA 
 MOV DS,AX ; Khởi động thanh ghi DS 
 MOV AX,02h 
 INT 10h ; Xóa màn hình 
 LEA DX,msg1 
 MOV AH,09h ; In thông điệp 
 INT 21h 
 CALL Nhap ; Nhập dòng 
 MOV CL,AL 
 LEA DX,Crlf ; Xuống dòng 
 MOV AH,09h 
 INT 21h 
 CALL Nhap ; Nhập cột 
 MOV CH,AL 
 MOV AH,02h ; Chuyển tọa độ con trỏ 
 MOV DX,CX 
 INT 10h 
 LEA DX,msg 
 MOV AH,09h ; In ra màn hình 
 INT 21h 
 MOV AH,4Ch ; Kết thúc chương trình 
 INT 21h 
main ENDP 
Nhap PROC 
 MOV AH,0Ah ; Nhập vào 
 LEA DX,Td 
 INT 21h 
 LEA BX,Td ; Lấy chữ số hàng chục 
 MOV AL,DS:[BX+2] 
 SUB AL,'0' ; Chuyển từ dạng ký tự sang dạng số 
 MOV BL,10 
 MUL BL ; Nhân số hàng chục với 10 
 PUSH AX 
 LEA BX,Td ; Lấy chữ số hàng dơn vị 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 72 
 MOV AL,DS:[BX+3] 
 SUB AL,'0' 
 POP BX 
 ADD AL,BL 
 RET 
Nhap ENDP 
END main 
11.3. Cộng 2 số nhị phân dài 5 byte 
.MODEL SMALL 
.STACK 100h 
.DATA 
 m1 DB 00h,08h,10h,13h,24h,00h 
 m2 DB 0FFh,0FCh,0FAh,0F0h,0F1h,00h; 
 m3 DB 6 DUP(0) 
.CODE 
main PROC 
 MOV AX,@DATA 
 MOV DS,AX ; Khởi động thanh ghi DS 
 LEA SI,m1 
 LEA DI,m2 
 LEA BX,m3 
 MOV CX,6 
 XOR AL,AL 
next: MOV AL,[SI] 
 ADC AL,[DI] 
 MOV [BX],AL 
 INC BX 
 INC SI 
 INC DI 
 LOOP next 
 MOV AH,4Ch 
 INT 21h 
main ENDP 
END main 
11.4. Nhập một chuỗi ký tự và chuyển chữ thường thành 
chữ hoa 
.MODEL SMALL 
.STACK 100h 
.DATA 
 m1 DB 81 
 DB ? 
 DB 81 DUP(?) 
 m2 DB 'Chuoi da doi:$' 
.CODE 
main PROC 
 MOV AX,@DATA 
Tài liệu vi xử lý Lập trình hợp ngữ 
Phạm Hùng Kim Khánh Trang 73 
 MOV DS,AX ; Khởi động thanh ghi DS 
 MOV ES,AX 
 LEA DX,m1 
 MOV AH,0Ah ; Nhập chuỗi 
 INT 21h 
 LEA SI,m1 ; Lấy địa chỉ chuỗi 
 ADD SI,2 
 MOV DI,SI ; Chuỗi nguồn và đích trùng nhau 
Next: LODSB ; Lấy ký tự 
 CMP AL,0Dh ; Nếu là ký tự Enter thì kết thúc 
 JE quit 
 CMP AL,'a' ; Nếu ký tự nhập không phải là ký tự 
JB cont ; thường từ 'a' đến 'z' thì bỏ qua 
CMP AL,'z' 
JA cont 
 SUB AL,20h ; Chuyển ký tự thường thành ký tự hoa 
 STOSB ; Lưu ký tự vừa chuyển 
 DEC DI ; Nếu là ký tự thường thì dùng lệnh STOSB 
 ; nên DI tăng lên 1, ta phải giảm DI 
cont: INC DI ; Tăng lên ký tự kế 
 JMP next 
quit: MOV AL,'$' 
 STOSB 
 MOV AX,02h ; Xóa màn hình 
 INT 10h 
 LEA DX,m2 
 MOV AH,09h 
 INT 21h 
 LEA DX,m1+2 
 MOV AH,09h 
 INT 21h 
 MOV AH,4Ch 
 INT 21h 
main ENDP 
END main 

File đính kèm:

  • pdfVi_Xu_Ly_3.pdf