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.
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:
- Vi_Xu_Ly_3.pdf