YOMEDIA
ADSENSE
Bài tập về asm
156
lượt xem 24
download
lượt xem 24
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Ví dụ 0: Viết chương trình in ra nhập vào một kí tự nhưng in ra màn hình kí tự kế tiếp. Chẳng hạn, khi nhập vào kí tự ‘a’ thì mà hình lại hiện ra kí tự ‘b’. Ta sử dụng hàm 08 của ngắt 21h để nhập 1 kí tự không hiện lên màn hình rồi sau đó dung hàm 02 để in kí tự kế tiếp (tăng mã ASCII lên 1) ra màn hình. .
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài tập về asm
- Ví dụ 0: Viết chương .CODE InXau db ‘Day ki tu in ra trình in ra nhập vào Org 100h theo thu tu nguoc lai la: một kí tự nhưng in ra Jmp Start ’,’$’ màn hình kí tự kế tiếp. Start: xuongdong db 13,10,’$’ Chẳng hạn, khi nhập Mov CX,256 ; số kí tự cần .CODE vào kí tự ‘a’ thì mà in Start: hình lại hiện ra kí tự Mov DL,0 ; kí tự đầu tiên Mov AX,@Data ‘b’. Mov AH,2 ; hàm 2 ngắt Mov DS,AX Ta sử dụng hàm 08 của 21h in ra 1 kí tự lên màn Mov AH,9 ngắt 21h để nhập 1 kí tự hình Mov DX, offset NhapXau không hiện lên màn hình Tiep: Int 21h ; in lời mời nhập rồi sau đó dung hàm 02 Int 21h xâu để in kí tự kế tiếp (tăng Mov BL,DL ; dùng BL để Xor CX,CX ; CX=0 mã ASCII lên 1) ra màn chứa tạm mã ASCII của Mov AH,1 ; Nhap ki tu hình. kí tự DocVao: .MODEL Tiny Mov DL,32 Int 21h .CODE Int 21 ; In dấu cách Cmp AL,13 ; co phai Org 100h Mov DL,BL ; lấy lại kí tự Enter khong? Jmp Start in cuối cùng JE ThoiDoc ; Neu là Enter, Start: Inc DL ; sang kí tự tiếp dung lai Mov AH,08h ; nhập 1 kí theo Push AX ; Cho vao ngan tự không hiện lên màn Loop Tiep ; In kí tự kế xep hình tiếp Inc CX ; Tang de dem so Int 21h Int 20h ; trở về DOS ki tu da nhap Mov DL,AL ; chuyển mã End Start Jmp DocVao ASCII của kí tự vào DL ThoiDoc: Inc DL ; DL chứa kí tự kế Viết chương trình Mov AH,9 tiếp nhập vào một dãy các Mov DX, offset Mov AH,02h ; In ra màn kí tự rồi hiển thị nó xuongdong hình theo thứ tự ngược Int 21h ;xuong dong va Int 21h ; lại. ve dau dong Int 20h ; trở về DOS Bài giải Mov DX, offset InXau End Start Ta có thể sử dụng ngăn Int 21h ; in lời mời in xâu xếp để giải quyết bài InXau Ví dụ 1: Viết chương toán này. Mỗi khi có ký Mov AH,2 trình in ra 256 kí tự tự được nhập vào sẽ HienThi: của bảng mã ASCII được PUSH vào ngăn Pop DX ; In tung ki tu Bài giải xếp, sau khi nhập xong trong ngan xep Ta sử dụng một vòng lặp (bằng cách gõ Enter) thì Int 21h FOR-DO và dùng DL đê các kí tự trong ngăn xếp Loop HienThi ; In ra cho chứa mã ASCII của các sẽ được POP ra và hiển den khi CX=0 kí tự trong bảng mã thị theo thứ tự ngược lại Mov AH,4Ch ; Tro ve DOS ASCII. CX chứa số kí tự so với ban đầu. Int 21h cần in (256). Mỗi kí tự .MODEL small End Start cách nhau bởi 1 dấu .STACK 100h cách. Chương trình được .DATA Ví dụ 4: Nhập vào một viết theo khung của NhapXau db ‘Nhap vao xâu kí tự rồi in xâu đó chương trình COM day ki tu: ’,’$’ ra màn hình .MODEL Tiny .Model Small 1
- .Stack 100h next: Lodsb ; nap Mov DX, offset XauIn .Data byte tai dia chi DS:[SI] Int 21h m1 db 81 ; khoi tao vao AL Mov AH,0Ah bie1 m1 va khoi tri 81 cmp al,0dh ; so Mov DX, offset Buffer db ? ; sanh voi ENTER Mov BX,DX ; BX va DX db 82 dup(?) je quit ; neu cung tro den Buffer m2 db 'moi ban nhap: bang thi thoat khoi ctrinh Mov BYTE PTR[BX],100 ; $' stosb ; luu ki Do dai lon nhat cua m3 db 'chuoi vua nhap tu Int 21h la:$' dec di Mov AH,9 m4 db 13,10,'$' ; lenh Mov DX, offset .Code stosb nen tang di len 1, Xuongdong ; xuong dong main proc ta phai giam di va ve dau dong mov ax,@data cont: inc di ; tang Int 21h ;khoi tao thanh ghi doan len ki tu ke tiep Mov DX, offset XauOut ; DS va ES jmp next ; nhay Xau kq mov ds,ax ;muc den nhan next Int 21h dich de lam cho chuong quit: mov al,'$' Mov DX,BX ; BX,DX cung trinh chay dung stosb ; luu vao tro den Buffer mov es,ax ;es la ES:[DI] Add BL,[BX+1] ; Cong thanh ghi doan du lieu lea dx,m4 vao do dai thuc cua xau chua doan du lieu nhap mov ah,09h vao BX vao int 21h Add BX,2 ; Tro den lea dx,m2 lea dx, m3 ;hien byte cuoi cung mov ah,09h dong thong bao thu 2: Mov BYTE PTR[BX],’$’ ; int 21h mov ah, 09h Thay the byte cuoi cung lea dx,m1 ;nap int 21h boi $ vao DX dia chi offset cua lea dx,m1+2 ; in Add DX,2 ; bo qua hai bien m1 chuoi vua nhap ra man byte dau mov ah,0ah hinh Int 21h ; in xau ra ;nhap mot chuoi vao mov ah,09h Int 20h ; trở về DOS ds:dx ;byte dau la buffer int 21h End Start size mov ah,4ch Ví dụ 5: Viết chương ;ham int 21h trình tạo một thư mục với 0Ah: doc mot chuoi ky tu main endp tên thư mục được nhập tu ban phim, ket thuc end main từ bàn phím. bang enter cách 2: .MODEL Tiny int 21h ; byte .MODEL Tiny .CODE thu 2 la so ky tu thuc su .CODE Org 100h duoc doc Org 100h lea si,m1 ;lay dia Jmp Start Jmp Start chi offset cua chuoi XauIn db ‘Nhap xau: ’,’$’ TenThuMuc db 'Nhap ten add si,2 ;SI: XauOut db ‘Xau vua thu muc: ','$' thanh ghi chi so nguon; nhap: ’,’$’ OK db 'Tao thu muc DI:thanh ghi chi so dich Xuongdong db 13,10,24h thanh cong','$' mov di,si Buffer db 100 dup(?) ; Buffer db 81 Khai bao buffer db ? Start: db 82 dup(?) Mov AH,9 2
- NotOK db 'Tao thu muc Int 21h Mov CX,BX ;Số lần lặp ở khong thanh cong','$' vòng lặp bên trong (tìm Jmp Ketthuc max) Xuongdong db 13,10,24h Error: Mov DI, SI ;giả sử phần Start: Mov AH,9 tử thứ 1 là max Mov AH,9 Mov DX, offset NotOK ; Mov AL, [DI] ; AL= max Mov DX, offset Khong thanh cong TimMax: TenThuMuc Int 21h Inc SI ; phần tử kế tiếp Int 21h Ketthuc: Cmp [SI],AL ; phần tử Int 20h ; tr? v? DOS mới > max? Mov AH,0Ah End Start JB Tiep ; không lớn hơn Mov DX, offset Buffer Ví dụ 6: Hãy định max nghĩa trước một Mov DI,SI ; lớn hơn max, Mov BX,DX ; BX va mảng các số nguyên DI trỏ vào max DX cung tro den Buffer trỏ bởi biến Mang. Mov AL,[DI]; Đưa max Mov BYTE PTR[BX],100 Hãy sắp xếp theo vào AL ; Do dai lon nhat cua chiều tăng dần mảng Tiep: Int 21h số nguyên này rồi in Loop TimMax kết quả lên màn hình. Call DoiCho Mov AH,9 .MODEL small Dec BX Mov DX, offset .STACK 100h JNZ Lap Xuongdong ; xuong dong .DATA ; In Mang va ve dau dong Thongbao db ‘Day da Mov BX,DX ; BX trỏ đến Int 21h sap xep: ’,’$’ phần tử đầu tiên xuongdong db 13,10,’$’ Mov CX,7 ; in cả 7 phần Mov DX,BX ; BX,DX Mang db 8,4,3,1,2,5,1 tử cung tro den Buffer Db ‘$’ Mov AH,2 Add BL,[BX+1] ; Cong .CODE InMang: vao do dai thuc cua xau Start: Mov DL,[BX] vao BX Mov AX,@Data Add DL,30h Add BX,2 ; Tro den Mov DS,AX Int 21h ; in ra byte cuoi cung Mov AH,9 Mov DL,32 ; in dấu cách Mov BYTE PTR[BX],'$' ; Mov DX, offset Thongbao giữa các phần tử cho dễ Thay the byte cuoi cung Int 21h ; in thongbao xem boi $ Mov DX, offset Int 21h xuongdong Inc BX ; sang phần tử kế Add DX,2 ;bo qua Int 21h ; nhay xuong tiếp hai byte dau, DX=ten thu dong Loop InMang muc Mov BX,7 ; BX= so phan Mov AH,39h ; ham tu cua mang Ketthuc: tao thu muc Mov DX, offset Mang ; DX Mov AH,4Ch Int 21h tro vao mang Int 21h Dec BX ; so vòng lặp bên End Start JC Error ; CF=1, bi ngoài ;---------------------------------- loi Lap: ----- Mov SI,DX ; SI trỏ vào ; chương trình con Mov AH,9 đầu mảng DoiCho Mov DX, offset OK ; ;---------------------------------- thanh cong ----- 3
- DoiCho Proc End Start Mov AL,80 ; đưa vào LCR Push AX Lập trình cho UART để tạo ra DLAB=1 Mov AL,[SI] 8250A Mov DX,3FBH ; địa chỉ XCHG AL,[DI] Ví dụ 1: Khởi tạo chế LCR Pop AX độ làm việc cho cổng Out DX,AL Ret COM3 với các thông Mov AL,24 ; đưa vào LSB Nhap Endp số: 6 bít mã kí tự của số chia ;---------------------------------- truyền , tốc độ truyền Out DX,AL ----- 2400 bits/ giây, parity Mov AL,0 ; đưa vào MSB chẵn, một bít stop. của số chia Đoạn mã chương trình sẽ Mov DX,3F9H ; địa chỉ Ví dụ: Viết chương được viết như sau: MSB của số chia trình thiết lập mật Mov AH,0 ; khởi tạo Out DX,AL khẩu là kí tự A thi khởi Mov DX,2 ; cổng COM3 Mov AL,1AH ; qui định động máy có số hiệu 2 khuôn dạng dữ liệu .MODEL small Mov AL,B9h Mov DX,3FBH ; địa chỉ .STACK 100h Int 14h LCR .DATA Ví dụ 2: Khởi tạo chế Out DX,AL matkhau db ‘P’,’$’ độ làm việc cho cổng … Saimatkhau db ‘Sai mat COM1 với các thông Lập trình phối ghép khau ’,’$’ số: 7 bít mã kí tự với bàn phím Nhapmatkhau db ‘Nhap truyền , tốc độ truyền Ví dụ 1: Viết mat khau: ’,’$’ 4800 bits/ giây, parity chương trình tự động xuongdong db 13,10,’$’ chẵn, một bít stop bật phím CapLock .CODE không điều khiển gán (sau khi chạy chương Start: đoạn ở Sout. trình này phím Mov AX,@Data Địa chỉ cổng của thanh Caplock sẽ được bật Mov DS,AX ghi điều khiển đường lên). Lap: truyền là 3FB (tính từ địa Cờ bàn phím là byte ở Mov AH,9 chỉ cơ sỏ 3F8) tại địa chỉ 40:0017 trong Mov DX, offset Giá trị này bằng 1AH vùng đệm bàn phím. Để Nhapmatkhau Địa chỉ cổng của thanh đèn của phím Int 21h ; in lời mời nhập ghi số chia LSB là 3F8 với CapLock là ON thì giá trị xâu DLAB=1 của cờ bàn phím được Mov AH,0 ; Nhap ki tu Địa chỉ cổng của thanh đặt bằng: 01000000 Int 16h ghi số chia MSB là 3F9 =40h. ta chỉ cần gán giá Cmp AL,matkhau ; co với DLAB=1 trị phai Enter khong? Giả thiết dùng xung đồng 40h vào byte có địa chỉ JZ Done ; Neu là Enter, hồ tần số 1,8432 Mhz ở 40:0017 là xong. dung lai đầu vào của UART và ta .MODEL Tiny Mov AH,9 muốn có tốc độ truyền .CODE Mov DX, offset 4.800 bits/giây, ta cần Org 100h Saimatkhau tính số chia để ghi giá trị Jmp Start Int 21h ;xuong dong va số chia vào thanh ghi số Start: ve dau dong chia Mov AX,40h ; AX chứa Jmp Lap Số chia = 1.843200/ địa chỉ đoạn dữ liệu DTA Done: (4.800x16)=24 Mov DS, AX ; cho DS trỏ Mov AH,4Ch ; Tro ve DOS Đoạn mã chương trình sẽ tới vùng DTA Int 21h được viết như sau: 4
- Mov BX,0017h ; DS:BX Out 60H, AL ; đưa ra mã ; 5 + 10 = 15 (decimal) chứa địa chỉ của byte bật đèn ra cổng bàn or hex=0fh or chứa cờ phím bin=00001111b ; trạng thái bàn phím Int 20h ; trở về DOS add bl, al Mov byte PTR[BX] ,40h ; End Start ; 15 - 1 = 14 (decimal) or đặt cờ bàn phím bằng Ví dụ 3: Viết chương hex=0eh or 40h trình cấm bàn phím bin=00001110b Int 20h ; trở về DOS hoạt động. Biết rằng sub bl, 1 End Start lệnh khóa ADH là lệnh ; in ket qua duoi dang so Ví dụ 2: Viết chương cấm bàn phím. Kiểm nhi phan trình tự động bật tra trạng thái bàn mov cx, 8 phím CapLock , phím trước khi cấm. print: mov ah, 2 NumLock, ScollLock .MODEL Tiny ; ham in ra (sau khi chạy chương .CODE mov dl, '0' trình này phím Org 100h test bl, 10000000b ; Caplock, NumLock, Jmp Start kiem tra ScollLock sẽ được bật Start: bit dau tien lên). Yêu cầu chương Kiemtra: jz zero trình thực hiện qua In AL,64H ; đọc trạng mov dl, '1' các cổng 60H, 61H và thái 64H. Test AL,02h ; Nếu bộ zero: int 21h Chương trình sẽ kiểm tra đệm bàn phím bằng đầy shl bl, 1 trạng thái nhấn phím hay Jnz Kiemtra ; kiểm tra lại loop print chưa. Mov Al,ADh ; Nếu bộ đệm mov dl, 'b' ;in ra chu b Cấu trúc của byte điều trống sẽ bật đèn o cuoi cung the hien la khiển các đèn LED trên Out 64H, AL ; đưa ra cấm so nhi phan bàn phím như sau: bàn phím ra cổng 64h int 21h Để các đèn Caplock, Int 20h ; trở về DOS int 20h NumLock, ScollLock sẽ End Start Main endp được bật lên thì ta phải Bài 5: viet chương ;cac chuong trinh gửi giá trị 00000111 trình cộng hai số và in con de tai day =07h ra cổng 60H. kết quả dưới dạng số End Start .MODEL Tiny nhị phân. Dịch ra Bài 6: in chuỗi ký tự ra .CODE file.com màn hình tại tọa độ Org 100h Title "add-sub" được nhập vào Jmp Start .Model Tiny .MODEL SMALL Start: .Code .STACK 100h Mov AL,EDHh ; lệnh org 100h .DATA tắt/bật đèn msg DB 'Hello$' Out 60H, AL ; đưa ra Start: jmp Continue msg1 DB 'Nhap vao toa cổng bàn phím ;Cac dinh nghia bien va do:$' Kiemtra: hang de tai day Crlf DB 0Dh,0Ah,'$' In AL,64h ;Kiểm tra Continue: Td DB 3 trạng thái bàn phím Main Proc DB ? Test AL,02h ; Nếu bộ mov al, 5 ; DB 3 DUP(?) đệm bàn phím bằng đầy bin=00000101b .CODE Jnz Kiemtra ; kiểm tra lại mov bl, 10 ; hex=0ah or main PROC Mov Al,07 ; Nếu bộ đệm bin=00001010b MOV AX,@DATA trống sẽ bật đèn 5
- MOV DS,AX ; Kh•i ••ng Nhap ENDP ;---------------------------------- thanh ghi DS END main ------------------- MOV AX,02h Bài 8: nhập vào hai pNhap PROC INT 10h ; Xóa màn h́nh số, tính tổng PUSH AX ; cat gia LEA DX,msg1 .MODEL SMALL tri do vao dinh ngan xep MOV AH,09h ; In thông .STACK MOV BX,0 ; •i•p .DATA khoi tao bx=0 INT 21h So1 DW ? MOV CX,0 CALL Nhap ; Nh•p ḍng Begin_Nhap: Msg1 DB 10,13,'Nhap MOV AH,8 ; MOV CL,AL so thu 1: $' nhap vao 1 so va khong LEA DX,Crlf ; Xu•ng ḍng Msg2 DB 10,13,'Nhap hien len man hinh MOV AH,09h so thu 2: $' INT 21h INT 21h Msg3 DB 10,13,'Ket CALL Nhap ; Nh•p c•t qua phep tru: $' MOV CH,AL .CODE CMP AL,13 ; enter MOV AH,02h ; Chuy•n ;xoa man hinh JE End_Nhap t•a do con tr• MOV AH,3 ;nhay neu bang MOV DX,CX INT 10h INT 10h ;thong bao nhap so 1 CMP AL,'-' LEA DX,msg MOV JE XetDau MOV AH,09h ; In ra man AX,@DATA hinh MOV DS,AX CMP AL,'+' ; la dau + INT 21h MOV thi nhap luon MOV AH,4Ch ; K•t thúc DX,OFFSET Msg1 JE Begin_Nhap ch••ng tŕnh MOV AH,9 CMP AL,'0'; neu nho hon INT 21h INT 21h 0 lai nhap main ENDP CALL pNhap JB Begin_Nhap Nhap PROC MOV So1,BX CMP AL,'9 ‘;neu lon hon MOV AH,0Ah ; Nh•p vào ;thong bao nhap so 2 9 thi lai nhap LEA DX,Td MOV JA Begin_Nhap INT 21h DX,OFFSET Msg2 ;xuat so ra man hinh LEA BX,Td ; Lay chu so MOV AH,9 MOV AH,2; hien thi so do hang chuc INT 21h ra man hinh MOV AL,DS:[BX+2] CALL pNhap MOV DL,AL SUB AL,'0' ; Chuy•n tu ;xuat ket qua INT 21h dang ky tu MOV ;doi thanh tri va dua vao ;sang dang so DX,OFFSET Msg3 SI MOV BL,10 MOV AH,9 AND AL,0Fh MUL BL ; Nhap so hàng INT 21h ; chuc voi 10 ;Lam phep tinh CBW ; PUSH AX ;BX=so2+so1 chuyen byte sang tu LEA BX,Td ; Lay chu so MOV AX,So1 MOV SI,AX ; hang don vi SUB AX,BX dua ax vao si MOV AL,DS:[BX+3] CALL Str_To_Num ;BX=BX*10+SI SUB AL,'0' Ve_DOS: MOV DX,0 ; POP BX MOV AH,4Ch khoi tao dx ADD AL,BL INT 21h MOV AX,10 ; RET dua 10 vao ax 6
- MUL BX ; MOV BX,10 chua doan du lieu nhap roi nhan voi bx duoc ket For1: vao qua chua trong ax MOV DX,0 MOV BX,SI ; dua si DIV BX lea dx,m2 vao bx Bx bay gio bang PUSH DX ;cho dx mov ah,09h SI vao ngan xep int 21h ADD BX,AX ; lay INC bx nhan ax CX ;tăng lên lea dx,m1 ;nap JMP Begin_Nhap CMP AX,0 vao DX dia chi offset cua XetDau: JNZ For1 ; bien m1 MOV CX,1 neu khac 0 thi nhay mov ah,0ah MOV AH, ;in dau ;xuat so ra man hinh ;nhap mot chuoi vao am len man hinh MOV AH,2 ds:dx ;byte dau la buffer MOV DL,'-' For2: size INT 21h POP DX ; ;ham 0Ah: JMP Begin_Nhap lay dx ra doc mot chuoi ky tu tu End_Nhap: OR DL,'0’ ban phim, ket thuc bang OR CX,CX ; INT 21H enter JZ Exit ; nhay den LOOP for2 int 21h ; byte exit neu bang 0 POP BX ; thu 2 la so ky tu thuc su NEG BX lay bx ra duoc doc Exit: RET POP AX Str_To_Num ENDP lea si,m1 ;lay dia RET END chi offset cua chuoi pNhap ENDP Bài 9: nhập và in ra add si,2 ;SI: ;---------------------------------- chuỗi ký tự đã nhập thanh ghi chi so nguon; ------------------ vào DI:thanh ghi chi so dich ;Doi chieu dai chuoi tu .Model Small mov di,si chu -> so .Stack 100h Str_To_Num PROC .Data next: Lodsb ; nap PUSH BX m1 db 81 ; khoi tao byte tai dia chi DS:[SI] OR AX,AX bie1 m1 va khoi tri 81 vao AL JGE Positive ;AX db ? ; cmp al,0dh ; so la so duong db 82 dup(?) sanh voi ENTER PUSH AX m2 db 'moi ban nhap: je quit ;day AX vao trong $' stosb ; luu ki ngan xep m3 db 'chuoi vua nhap tu MOV AH,2 ;xuat la:$' dec di dau '-' m4 db 13,10,'$' ; lenh MOV DL,'-' .Code stosb nen tang di len 1, INT 21h main proc ta phai giam di POP AX mov ax,@data ;lay lai AX ;khoi tao thanh ghi doan cont: inc di ; tang NEG AX DS va ES len ki tu ke tiep ;doi dau AX mov ds,ax ;muc jmp next ; nhay Positive: ; lon hon dich de lam cho chuong den nhan next so 0 trinh chay dung quit: mov al,'$' MOV CX,0 ; khoi mov es,ax ;es la stosb ; luu vao tao bien dem thanh ghi doan du lieu ES:[DI] 7
- lea dx,m1 ;nap dec di ; Neu la lea dx,m4 vao DX dia chi offset cua ki tu thuong thi dung mov ah,09h bien m1 ; lenh int 21h mov ah,0ah stosb nen tang di len 1, ;nhap mot chuoi vao ta phai giam di lea dx, m3 ;hien ds:dx ;byte dau la buffer dong thong bao thu 2: size mov ah, 09h ;ham 0Ah: cont: inc di ; tang int 21h doc mot chuoi ky tu tu len ki tu ke tiep lea dx,m1+2 ; in ban phim, ket thuc bang jmp next ; nhay chuoi vua nhap ra man enter den nhan next hinh int 21h ; byte mov ah,09h thu 2 la so ky tu thuc su quit: mov al,'$' int 21h duoc doc stosb ; luu vao mov ah,4ch ES:[DI] int 21h lea si,m1 ;lay dia main endp chi offset cua chuoi mov ax,02h ; xoa end main add si,2 ;SI: man hinh bài 10: đổi chữ thường thanh ghi chi so nguon; int 10h ; sang chữ hoa DI:thanh ghi chi so dich .Model Small mov di,si lea dx, m2 ;hien .Stack 100h dong thong bao thu 2: .Data next: Lodsb ; nap mov ah, 09h m1 db 81 ; khoi tao byte tai dia chi DS:[SI] int 21h bien m1 va khoi tri 81 vao AL db ? ; cmp al,0dh ; so lea dx,m1+2 ; in db 82 dup(?) sanh voi ENTER chuoi da doi thanh chu m2 db 'chuoi da doi:$' je quit ; neu hoa ra man hinh m3 db 'moi ban nhap bang thi thoat khoi ctrinh mov ah,09h chuoi:$' int 21h m4 db 13,10,'$' cmp al,'a' ;neu ki .Code tu nhap khong mov ah,4ch main proc ;phai la ki int 21h mov ax,@data tu thuong tu 'a' den 'z' ;khoi tao thanh ghi doan thi bo qua main endp DS va ES jb cont ;nhay end main mov ds,ax ;muc neu nho hon 'a' bài 11: hiên thị thời dich de lam cho chuong gian trinh chay dung cmp al,'z' Title timer mov es,ax ;es la ja cont ; neu .model tiny thanh ghi doan du lieu lon hon 'z' thi xet ky tu .Code chua doan du lieu nhap ke tiep org 100h vao START: jmp Continue sub al,32 ; buff db '00:00:00$' lea dx,m3 chuyen ki tu thuong ;bo dem thoi gian mov ah,09h thanh ki tu hoa gio:phut:giay int 21h stosb ; luu ki Continue: tu vua chuyen doi thanh Main Proc hoa vao ES:[DI] 8
- lea bx,buff ;nap dia chi .Model inc di ;tang chi so hieu dung cua bo dem Tiny ;Sau di len 1 mov ah,2Ch nay se dich ra file *.COM int 21h ;Hàm 2Ch .Code loop Tinh_Tong cua ngat 21h. Lay thoi Org ;lap voi so lan lap o trong gian cua he thong. 100h ;chua cx ;Giá tr? tr? v? là : lai 100 cho PSP int 20h ;tro ve DOS ch=gio,cl=phut,dh=giay Start: JMP Continue ;chuyen thanh ;Kh Main Endp ;ket thuc ma ASCII de hien thi ai bao du lieu de tai day chuong trinh chinh mov al,ch ;doi array1 dw 1,2,3,4,5 phan gio ;mang 5 phan tu ;chuong trinh con co mov ah,0 ;xoa AH array2 dw 6,7,8,9,0 the de o day mov dl,10 result dw 5 dup(?) End Start ;ket thuc div dl ; mang 5 phan tu chua chuong trinh ;chia ax cho 10 khoi tao or ax,3030h Truyền tham số qua ;doi sang dang Continue: thanh ghi ASCII Main Proc ;bat dau Ta thực hiện truyền tham mov [bx],ax ; chuong trinh chinh số qua thanh ghi bằng cách: một chương trình mov al,cl ;doi ;cac dong lenh cua con sẽ đưa giá trị vào phan phut chuong trinh chinh de tai thanh ghi và chương mov ah,0 day trình con khác sẽ xử lý mov dl,10 lea si,array1 ;load giá trị trên thanh ghi div dl effective address cua đó. or ax,3030h array1 mov [bx+3],ax ; lea VD: Cộng giá trị tại 2 ô bx,array2 ; nhớ 1000h và 1001h, kết mov al,dh ;doi lea di,result ;dia chi quả chứa trong 1002h phan giay hieu dung cua mang ket (bye mov ah,0 qua cao) và 1003h (byte mov dl,10 mov cx,5 thấp). div dl Tinh_Tong: ;doan or ax,3030h chuong trinh tinh tong .MODEL SMALL mov [bx+6],ax ; mov al,[si] ;nap .STACK 100h vao al gia tri cua mang .CODE lea dx,buff ;Hiien thi co chi so [si] main PROC len man hinh add al,[bx] ;cong MOV AX,@DATA mov ah,09h al voi phan tu mang co MOV DS,AX int 21h chi so [bx] ; ••a giá tr• vào các ô int 20h ;ve DOS mov [di],al ;nap nh• Main endp gia tri trong al vao phan MOV BYTE PTR DS: End START tu mang co chi so [di] [1000h],10h inc si ;tang chi so si MOV BYTE PTR DS: Bài 12: cộng hai len 1 [1001h],0FFh mảng inc bx ;tang chi so CALL Read Title "AddTwoArray" bx len 1 CALL Sum ;tieu de cua chuong trinh 9
- Mov AH,4Ch MOV AH,4Ch INT 21h INT 21h INT 21h main ENDP main ENDP main ENDP Sum PROC Read PROC ; ••c d• li•u Sum PROC MOV AL,[SI] vào thanh ghi AX MOV m4,0 ADD AL,[DI] MOV AH,DS:[1000h] MOV AH,m1 JZ next MOV AL,DS:[1001h] ADD AH,m2 MOV [BX+1],1 RET JNC next next: MOV [BX],AL Read ENDP MOV m4,1 RET next: MOV m3,AH Sum ENDP Sum PROC RET END main ADD AH,AL Sum ENDP 10.4. Truyền tham số JZ next END main qua stack MOV DS:[1003h],1 10.3. Truyền tham số Trong phương pháp next: MOV DS: qua ô nhớ do thanh truyền tham số này, ta [1002h],AH ghi chỉ đến dùng stack làm nơi chứa RET Trong cách truyền tham các tham số cần truyền Sum ENDP số này, ta dùng các thông qua các tác vụ END main thanh ghi SI, DI, BX để PUSH và POP. 10.2. Truyền tham số chỉ địa chỉ offset của các qua ô nhớ (biến) tham số còn thanh ghi VD: Cộng giá trị tại 2 ô Quá trình truyền tham số đoạn mặc định là DS. nhớ m1 và m2, kết quả cũng giống như trên chứa trong m3 (byte cao) nhưng thay vì thực hiện và thông qua thanh ghi, ta VD: Cộng giá trị tại 2 ô m4 (byte thấp). sẽ thực hiện thông qua nhớ m1 và m2, kết quả .MODEL SMALL các ô nhớ. chứa trong m3 (byte cao) .STACK 100h và .DATA VD: Cộng giá trị tại 2 ô m4 (byte thấp). m1 dw ? nhớ m1 và m2, kết quả .MODEL SMALL m2 dw ? chứa trong m3 (byte cao) .STACK 100h m3 dw ? và .DATA m4 dw ? m4 (byte thấp). m1 db ? .CODE .MODEL SMALL m2 db ? main PROC .STACK 100h m3 db ? MOV AX,@data .DATA m4 db ? MOV DS,AX m1 db ? .CODE LEA SI,m1 m2 db ? main PROC LEA DI,m2 m3 db ? MOV AX,@data MOV [SI],1234h ; ••a m4 db ? MOV DS,AX giá tr• vào .CODE LEA SI,m1 MOV [DI],0FEDCh ; các main PROC LEA DI,m2 ô nh• MOV AX,@data LEA BX,m3 PUSH m1 ; ••a vào MOV DS,AX MOV [SI],10h ; ••a giá stack MOV m1,10h ; ••a giá tr• vào PUSH m2 tr• vào MOV [DI],0FFh ; các ô CALL Sum MOV m2,0FFh ; các ô nh• POP m3 ; L•y k•t qu• nh• CALL Sum ••a vào stack CALL Sum MOV AH,4Ch POP m4 10
- MOV AH,4Ch INT 21h main ENDP Sum PROC POP DX ; L•u ••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 ; L•y ••a ch• tr• v• c•a l•nh CALL RET Sum ENDP END main 11
- chương trình này phím Caplock, NumLock, ScollLock MỤC LỤC sẽ được bật lên). Yêu cầu Ví dụ 0: Viết chương trình in chương trình thực hiện qua các ra nhập vào một kí tự nhưng in cổng 60H, 61H và 64H. ra màn hình kí tự kế tiếp. Ví dụ 3: Viết chương Chẳng hạn, khi nhập vào kí tự trình cấm bàn phím hoạt động. ‘a’ thì mà hình lại hiện ra kí tự Biết rằng lệnh khóa ADH là ‘b’. lệnh cấm bàn phím. Kiểm tra Ví dụ 1: Viết chương trạng thái bàn phím trước khi trình in ra 256 kí tự của bảng cấm. mã ASCII Bài 5: viet chương trình Viết chương trình nhập cộng hai số và in kết quả dưới vào một dãy các kí tự rồi hiển dạng số nhị phân. Dịch ra thị nó theo thứ tự ngược file.com Ví dụ 4: Nhập vào một Bài 6: in chuỗi ký tự ra xâu kí tự rồi in xâu đó ra màn màn hình tại tọa độ được nhập hình vào Ví dụ 6: Hãy định nghĩa Bài 8: nhập vào hai số, trước một mảng các số nguyên tính tổng trỏ bởi biến Mang. Hãy sắp xếp Bài 9: nhập và in ra theo chiều tăng dần mảng số chuỗi ký tự đã nhập vào nguyên này rồi in kết quả lên bài 10: đổi chữ thường màn hình. sang chữ hoa Ví dụ: Viết chương trình bài 11: hiên thị thời gian thiết lập mật khẩu là kí tự A thi Bài 12: cộng hai mảng khởi động máy Ví dụ 1: Khởi tạo chế độ làm việc cho cổng COM3 với các thông số: 6 bít mã kí tự truyền , tốc độ truyền 2400 bits/ giây, parity chẵn, một bít stop. Ví dụ 2: Khởi tạo chế độ làm việc cho cổng COM1 với các thông số: 7 bít mã kí tự truyền , tốc độ truyền 4800 bits/ giây, parity chẵn, một bít stop không điều khiển gán đoạn ở Sout. Lập trình phối ghép với bàn phím Ví dụ 1: Viết chương trình tự động bật phím CapLock (sau khi chạy chương trình này phím Caplock sẽ được bật lên). Ví dụ 2: Viết chương trình tự động bật phím CapLock , NumLock, ScollLock (sau khi chạy 12
- được truyền đi theo từng kí tự. Kí tự cần truyền đi được gắn ----------------------------------- thêm bit đánh dấu ở đầu để đánh dấu bắt đầu kí tự. 1 hoặc 2 Phần tiếp theo Bài tập chương trình về bàn bít cuối cùng để đánh dấu kết phím(về đồ họa màn hình) ----------------------------------- thúc kí tự. Vì mỗi kí tự được Lập trình phối ghép với màn nhận dạng riêng biệt nên nó có hình Cơ bản về truyền tin nối tiếp Ví dụ 3: Viết chương trình thể truyền đi bất cứ khi nào. cấm bàn phím hoạt động. Có hai kiểu truyền thông nối Dưới đây là cấu trúc của một Biết rằng lệnh khóa ADH là tiếp: đồng bộ và dị bộ. Trong khung truyền (frame) theo lệnh cấm bàn phím. Kiểm tra phương thức đồng bộ thì dữ phương pháp không đồng bộ. trạng thái bàn phím trước liệu được truyền đi theo từng khi cấm. bản tin (một đoạn văn bản) với S D D D D D D D P S S .MODEL Tiny một tốc độ xác định. Túy theo t 0 1 2 3 4 5 6 a t t .CODE giao thức truyền thông mà mỗi a Org 100h roo Jmp Start bản tin truyền đi có các cấu trúc r it p p Start: t y khác nhau. Chẳng hạn, nếu Kiemtra: Mã ký tự cần dùng giao thức truyền thông tin In AL,64H ; đọc trạng truyền hệ 2 đồng bộ (BISYNC: Binary thái Synchronous Communication Test AL,02h ; Nếu bộ Tùy theo loại mã ta sử dụng để Protocol) thì cấu trúc một bản đệm bàn phím bằng đầy mã hóa kí tự (baudot, ASCII, Jnz Kiemtra ; kiểm tra tin như sau: EBCDIC) mà độ dài cho mã kí lại S S S HE S T E B tự có thể là 5,6,7,8 bit. Tùy Mov Al,ADh ; Nếu bộ Y Y O AD T E T C theo hệ thông struyền tin, bên đệm trống sẽ bật đèn N N H ER X X X C cạch các bít mã dữ liệu còn có Out 64H, AL ; đưa ra T cấm bàn phím ra cổng thể có bit parity dùng để kiểm K K B phầ B P K K 64h ắt h ết í tra lỗi khi truyền. í í ắt n Int 20h ; trở về DOS Việc truyền tin dị bộ được thực End Start t t đầ hea đ ầ t t ự ự u der ầ n h ự hiện nhờ một UART (Universal đđp u n ú k Asynchronous Receiver ồ ồ hầ p ội c iể Transmitter) ở đầu phát và nnn hdpm ầ u h t một UART ở đầu thu. Khi có g g he n n ầ r kí tự phát, mạch 8251A sẽ tạo b b ad ộ ộ er n g n a ra khung cho kí tự bằng cách ộ b n k thêm vào các bit start, parity và iảộh stop, rồi gửi liên tiếp từng bít ra dniố u ti d i đường truyền. Bên phía thu, một mạch 8251A khác sẽ nhận nnu g n kí tự, tháo bỏ khung truyền, g kiểm tra parity, rồi chuyển sang Ngược lại, trong phương thức dạng song song để CPU đọc. truyền không đồng bộ, dữ liệu 13
- Push AX Xlat table ; doi ma scan sang Push BX ma ASCII Ví dụ 4: Viết chương trình xử Push CX Cmp Al,0 ; tra ve 0? lý bàn phím đơn giản. Push DI Jz Thoat Chương trình kiểm tra các Push ES ; Kiem tra do dem ban phim da phím chữ cái và phân biệt ; nhan ma Scan va tra loi day cua? chữ hoa, chữ thường. ban phim Mov BX, 1AH ; nap con tro .MODEL small In Al,60h ; nhan ma bo dem ban phim .STACK 100h Scan Mov CX,ES:[BX] .DATA Mov AH,AL ; chuyen Mov DI,ES:[BX]+2 Table db 16 dup(0) vao AH Cmp CX,60 db Push AX ; dua vao stack Jz Tieptuc ‘qwertyuiop’,0,0,0,0 ; In AL,61h ; doc cong PB Add, CX,2 hang tren cua 8255A Cmp CX,DI db ‘asdfghjkl’,0,0,0,0 ; Or AL,10000000b ; dua Jz Thoat hang giua bit 7 len bit 1 ; Bo dem chua day, nap the ki db ‘zxcvbnm’; hang Out 61h,AL ; dua ra tu vao duoi cong PB Tieptuc: db 16 dup(0) ; vung ; Cho ES tro den doan Mov ES:[DI],AL danh cho chu hoa du lieu Cmp DI,60H db Mov AX,40H ; dua AX Jnz Naptiep ‘QERTYUIOP’,0,0,0,0 ; den cuoi bo nho Mov DI,28 ; dua dia chi hien tai chu hoa cho hang tren Mov ES,AX ve 28+2=30 db Pop AX ; AL= ma scan Naptiep: ‘ASDFGHJKL’,0,0,0,0, ; kiem tra phim shift Add DI,2 0 ; chu hoa cho hang Cmp Al,42 ; co nhan phim Mov ES:[BX],DI giua shift ko? ; ket thuc db ‘ZXCVBNM’; chu Jnz checkkey ; neu khong Thoat: hoa cho hang duoi thi kiem tra tiep Pop ES .CODE Mov BL,1 Pop DI Start: Or ES:[17h],BL đat bit 1 Pop CX Mov AX,@Data của byte trang thai =1 Pop BX Mov DS,AX Jmp Thoat ; thoat khoi Pop AX Cli; xoa ngat PhimKetiep: Mov AL,20h ; tra lai ngat Push DS ; Test AL,10000000b; ma Out 20h,AL Mov AX, seg TryKB ; nha phim IRET DS:AX tro den Jnz Thoat TryKB endp Checkbanphim Mov BL,ES:[17h] ; neu ;------------------------------------- Mov DS,AX ko doc dc trang thai ---------- Mov DX, offset TryKB ; phim shift End Start Checkbanphim Test BL,00000011b; Mov Al,9 nhan phim shift? Mov Ah,25H ; dat lai Jz DoiMa ; neu ko doi dia chi vector ngat lai ma Int 21h Add AL,100 ;doi ra ki Pop DS tu hoa(dia chi 100 byte Sti ; cho phep ngat ke tiep) ;--------- Chuong trinh xu ly DoiMa: ngat ban phim-------- Mov BX, offset table ; TryKB proc far 14
- Inc DH Mov DI, TopCol TiepTuc: ; Ve cach duoi Ví dụ về Lập trình phối ghép Loop InTiep BotSide: màn hình Int 20h Call DrawPixel ; goi chuong End Start trinh con ve diem anh Dưới đây là một số ví dụ về Ví dụ 2: Vẽ một hình chữ Inc DI ; lập trình màn hình có sử dụng nhật trong chế độ đồ họa Loop BotSide các chức năng và dịch vụ do VGA Mov AH, 1 ; Cho 1 BIOS cung cấp .MODEL Tiny phim go vao Ví dụ 1: In ra màn hình 256 .CODE Int 21h kí tự của bảng mã ASCII, Org 100h Mov AH,0 mỗi kí tự có một thuộc tính Jmp Start Mov AL,2 khác nhau trong chế độ text. TopRow dw 100 Int 10h .MODEL Tiny TopCol dw 100 Int 20h .CODE BotRow dw 400 ; chuong trinh con ve 1 Org 100h BotCol dw 600 diem anh Jmp Start Color db 4 ; mau do DrawPixel Proc Start: Start: Push AX Mov AL,0 Mov AH,0h ; thiet lap Push CX Mov BL,0 ; thuoc tính 0 che do do hoa Push DX vơi ki tu co ma ASCII Mov AL,12h ; VGA Mov DX, SI =0 mode Mov CX,DI Mov DL,0 ; DL= so cot, Int 10h Mov AL, Color bat dau tu cot 0 Mov CX, BotCol Mov AH,0CH Mov DH,4 ; Bat dau tu Sub CX,TopCol Int 10h hang thu 4 Mov SI,TopRow Pop DX Mov CX, 255 ; in 256 kí Mov DI,TopCol Pop CX tự ; Ve cach tren Pop AX InTiep: TopSide: Ret Push AX Call DrawPixel ; goi chuong DrawPixel Endp Mov AH,2 trinh con ve diem anh End Start Int 10h ; dat vi tri con Inc DI ; Ví dụ 3: Viết một điểm ảnh tro Loop TopSide trực tiếp vào bộ nhớ hiển thị Pop AX Mov CX, BotRow (không thông qua RAM). Mov AH,9 ; in ki tu Sub CX, TopRow Đây là cách nhanh nhất, tuy trong AL voi thuoc Mov SI, TopRow nhiên thủ tục viết vào bộ nhớ ; thuoc tinh ; Ve cach 2 canh ben hiển thị phụ thuộc vào loai trong BL Side: card điều khiển màn hình cụ Push AX Mov DI, TopCol thể. Push CX Call DrawPixel ; goi chuong Chương trình sau được thực Mov CX,1 ; in 1 ki tu trinh con ve diem anh hiện trong chế độ đồ họa Int 10h Mov DI, BotCol (640x200x2). Pop CX Call DrawPixel ; goi chuong VeDiemAnh Proc Near Pop AX trinh con ve diem anh ; DX=hàng, CX= cột Inc AL ; ki tu ke tiep Inc SI ; ES=B800H Inc BL ; thuoc tinh ke tiep Loop Side ; Giả sử chế độ đồ họa đã được Inc DL ; sang cot ben canh Mov CX, BotCol khởi tạo như sau: Cmp DL,79 ; Cot cuoi cung? Sub CX,TopCol ; AH=0, AL=6, Int 10h Jb TiepTuc Mov SI, BotRow Xor BX,BX ; BX=0 Mov Dl,0 ; xuong dong ke tiep 15
- SHR DX,1 ; kiem ta xem diem -r Sau đó xem lại các cờ xem đã anh o dong chan hay le Bài 4. Viết chương trình thay đổi trạng thái chưa bằng Add BX, 8*1024 ; o dong chan “Hello World” dạng *.COM lệnh TinhTiep: sau đó giải hợp chương trình -r f Mov AX,DX ; DX =so hang này bằng DEBUG. Mã NV UP EI PL ZR NA PO CY - Mov CL,2 chương trình: Ta thấy hai cờ ZF và CF đã SHL DX,CX ; DX=DX*4 Title "Hello World !" thay đổi trạng thái Add DX,AX ; DX=5*DX .Model Small 2- Xem nội dung của vùng Mov AX,CX .Stack 100 nhớ gồm có địa chỉ CS:100 Mov CL,4 .Data cho tới CS: 200. Sử dụng SHL DX,CL ; DX=DX*16 msg db 'Hello World ! lệnh: Add BX,DX ; BX=offset cua $10,!13','$' -d cs:100 200 dong chua diem anh .Code 3- Dùng lệnh E (enter) để Mov DX,AX Main Proc thay đổi nội dung ô nhớ bắt AND DX,7 ; DX=DX Mod 8 = mov ax,@data đầu tại địa chỉ CS:100 thành vi tri byte tren don mov ds,ax có nội dung chứa các ký tự Mov CL,3 ; no chua diem anh lea dx,msg tên mình.Ví dụ: SHR AX,CL; AX=AX div 8= mov ah,09h -e cs:100 'Viva vi tri byte tren dong int 21h Microprocessor !' Add, BX,AX ; [BX] la byte mov ah,4ch Sau đó dùng lệnh D để xem lại chua diem anh int 21h vùng nhớ CS:100 cho tới NEG DL Main endp CS:115 (15 byte). Ta thấy Add DL,7 End Main chuỗi ký tự vừa nhập vào đã Mov CL,DL Dịch ra file hello.exe bằng lệnh nằm trong bộ nhớ: Mov AL,1 C:\tasm\tasm hello.asm -d cs:100 115 SHL AL,CL Liên kết file objject bằng lệnh 4- Dùng lệnh U (unassembler) OR ES:[BX], AL C:\tasm\tlink hello.obj để in ra các byte mã máy của Ret Sau đó ta được file Hello.exe chương trình trong bộ nhớ từ VeDiemAnh Endp C:\tasm>debug hello.exe địa chỉ CS:100 tới CS:120 ra -u màn hình dưới dạng lệnh gợi Tiếp tục dùng lệnh để quan sát nhớ. Kết quả: Lập trình với Debug riêng chỉ đoạn chương trình -u cs:100 120 Bài 3. Xem nội dung hiện tại này. 5- Viết chương trình xóa màn của các thanh ghi trên máy -u 0 0E hình tại địa chỉ CS:100 tính của mình, giải thích kết Bài 5. Thực hiện các lệnh của -a cs:100 quả thu được (chú ý kết quả DEBUG sau: 0B6E:0100 mov ah,0f thanh ghi cờ). Nạp giá trị FFh 1- Xem và sửa nội dung thanh 0B6E:0102 int 10 vào thanh ghi BX, dùng lệnh ghi cờ. Sử dụng lệnh 0B6E:0104 mov ah,00 R để xem lại kết quả sau khi C:\tasm>debug 0B6E:0106 int 10 nạp. -r f 0B6E:0108 ret NV UP EI PL NZ NA PO NC 0B6E:0109 C:\tasm>debug - 6- Thực hiện chương trình -r Lập cờ nhớ CF và cờ không ZF vừa viết xong bằng lệnh G -r bx bằng cách sử dụng lệnh (go) BX 0000 ta nhập vào giá -r f G=100 119 trị ff bằng cách gõ 00ff NV UP EI PL NZ NA PO NC kết quả màn hình bị :00ff -cy zr xóa và hiện dòng thông báo Kiểm tra lại bằng lệnh R để Program terminated normally xem BX có bằng 00FF hay không 16
- 7- Kiểm tra các lệnh P (process), T (trace) và M (move), C(compare), F (Fill), S (Search), I, O, H, ..vvv theo các cách tương tự Bài 6. Dùng các lệnh N (name), A , R, W để viết một chương trình làm nhiệm vụ xóa màn hình và ghi chương trình này lên đĩa cứng dưới dạng *.COM. Để làm bài này ta tạo ra một thư mục trên ổ cứng ví dụ sv103 bằng lệnh C:\ md sv103 Sau đó ghi file tạo ra bằng DEBUG vào thư mục đó. Ta thực hiện các lệnh như sau: C:\>md sv103 C:\>cd sv103 C:\sv103>debug -a 100 0B6E:0100 -a cs:100 0B6E:0100 mov ah,0f 0B6E:0102 int 10h 0B6E:0104 mov ah,00 0B6E:0106 int 10 0B6E:0108 ret 0B6E:0109 -n xoa.com -r cx CX 0000 :09 -r bx BX 0000 :0 -w Writing 00009 bytes Chạy chương trình xoa.com vừa tạo ra bằng lệnh C:\sv103>xoa.com màn hình bị xóa 17
- Bài 5. Thực hiện các lệnh của DEBUG sau: MỤC LỤC PHẦN TIẾP 1- Xem và sửa nội dung thanh ghi cờ. Sử dụng lệnh Cơ bản về truyền tin nối tiếp 2- Xem nội dung của vùng nhớ gồm có địa chỉ CS:100 cho tới Bài tập chương trình về CS: 200. Sử dụng lệnh: bàn phím(về đồ họa màn hình) 3- Dùng lệnh E (enter) để thay Lập trình phối ghép với màn đổi nội dung ô nhớ bắt đầu tại hình địa chỉ CS:100 thành có nội dung chứa các ký tự tên Ví dụ 3: Viết chương mình.Ví dụ: trình cấm bàn phím hoạt động. 4- Dùng lệnh U (unassembler) Biết rằng lệnh khóa ADH là để in ra các byte mã máy của lệnh cấm bàn phím. Kiểm tra chương trình trong bộ nhớ từ trạng thái bàn phím trước khi địa chỉ CS:100 tới CS:120 ra cấm. màn hình dưới dạng lệnh gợi Ví dụ 4: Viết chương nhớ. Kết quả: trình xử lý bàn phím đơn giản. 5- Viết chương trình xóa màn Chương trình kiểm tra các phím hình tại địa chỉ CS:100 chữ cái và phân biệt chữ hoa, 6- Thực hiện chương trình vừa chữ thường. viết xong bằng lệnh G (go) Ví dụ 1: In ra màn hình 7- Kiểm tra các lệnh P 256 kí tự của bảng mã ASCII, (process), T (trace) và M mỗi kí tự có một thuộc tính (move), C(compare), F (Fill), S khác nhau trong chế độ text. (Search), I, O, H, ..vvv theo các Ví dụ 2: Vẽ một hình cách tương tự chữ nhật trong chế độ đồ họa Bài 6. Dùng các lệnh N (name), A , R, W để viết một chương Ví dụ 3: Viết một điểm trình làm nhiệm vụ xóa màn ảnh trực tiếp vào bộ nhớ hiển hình và ghi chương trình này thị (không thông qua RAM). lên đĩa cứng dưới dạng *.COM Đây là cách nhanh nhất, tuy nhiên thủ tục viết vào bộ nhớ hiển thị phụ thuộc vào loai card điều khiển màn hình cụ thể. Lập trình với Debug Bài 3. Xem nội dung hiện tại của các thanh ghi trên máy tính của mình, giải thích kết quả thu được (chú ý kết quả thanh ghi cờ). Nạp giá trị FFh vào thanh ghi BX, dùng lệnh R để xem lại kết quả sau khi nạp. Bài 4. Viết chương trình “Hello World” dạng *.COM sau đó giải hợp chương trình này bằng DEBUG. Mã chương trình: 18
- 2. Bộ giao tiếp bus còn làm nhiệm vụ hỗ trợ (BIU): giao tiếp giữa hệ thống Cấu trúc tổng quát BIU thực hiện chức năng bus trong và bus ngoài. Bộ vi xử lý 8088 được giao tiếp giữa EU với bên Hệ thống bus ngoài là chia làm 2 khối chính: ngoài (Bộ nhớ, thiết bị hệ thống bus kết nối giữa Khối giao diện bus (BIU) ngoại vi …) thông qua hệ các thành phần của hệ vi và khối thực hiện lệnh thống BUS ngoại (bus dữ xử lý với nhau: CPU, Bộ (EU). liệu và bus địa chỉ). BIU nhớ trong và Thiết bị 1. Bộ phận thực hiện thực hiện tất cả các tác vào/ra. lệnh (EU): vụ về bus mỗi khi EU có 2. Hàng đợi lệnh Thi hành các tác vụ mà yêu cầu. Khi EU cần trao (Prefetch Queue) BIU lệnh yêu cầu như: Kiểm đổi dữ liệu với bên ngoài, Chứa mã lệnh chờ được soát các thanh ghi BIU sẽ tính toán địa chỉ xử lý. Hàng đợi lệnh có (đọc/ghi), giải mã và thi và truy xuất dữ liệu để kích thước 4 byte đối với hành lệnh. Trong EU có phục vụ theo yêu cầu 8088 và 6 byte đối với bộ tính toán và luận lý EU. 8086. Hàng đợi lệnh làm (ALU) thực hiện được các Trong BIU có 5 thanh ghi việc theo cơ chế FIFO phép toán số học và luận CS, DS, ES, SS và IP chứa (First In First Out), nghĩa lý. Các thanh ghi đa địa chỉ. Thanh ghi IP là lệnh nào được đưa vào dụng là các ô nhớ bên chứa địa chỉ của lệnh sẽ hàng đợi lệnh trước sẽ trong CPU chứa dữ liệu được thi hành kế tiếp được xử lý trước tương tự như ô nhớ trong nên gọi là con trỏ lệnh. 3. Khối điều khiển bộ nhớ. Cờ cũng là một EU và BIU liên lạc với (Control Unit) BIU thanh ghi dùng để ghi lại nhau thông qua hệ thống Khối điều khiển có hai trạng thái hoạt động của bus nội. Trong khi EU chức năng chính: giải mã ALU. Thanh ghi lệnh chứa đang thực hiện lệnh lệnh và tạo xung điều nội dung lệnh hiện tại thì BIU lấy lệnh từ bộ khiển . Đầu vào của khối mà CPU đang thực hiện. nhớ trong nạp đầy vào điều khiển là mã lệnh Các thanh ghi và bus hàng chờ lệnh (6 được đọc từ hàng đợi trong EU đều là 16 bit. bytes). lệnh và đầu ra là các EU không kết nối trực 1.Thành phần điều xung điều khiển gửi đến tiếp với bus hệ thống bên khiển Bus (Bus các bộ phận khác nhau ngoài. Nó lấy lệnh từ Control Logic) thuoc bên trong bộ vi xử lý. hàng chờ lệnh mà BIU BIU Quá trình này được thực cung cấp. Khi có yêu cầu Điều khiển các loại tín hiện nhờ hai mạch giải truy xuất bộ nhớ hay hiệu trên các bus bao mã lệnh và mạch tạo ngoại vi thì EU yêu cầu gồm: các tín hiệu trên xung. BIU làm việc. BIU có thể bus địa chỉ (20 bit), các 5. Các thanh ghi đoạn tái định địa chỉ để cho tín hiệu trên bus dữ liệu (Segment registers) phép EU truy xuất đầy (8 bit) và các tín hiệu BIU đủ 1 MB (8086 có 20 trên bus điều khiển. - Thanh ghi đoạn mã CS đường địa chỉ ngoại). Ngoài ra, thành phần này (Code Segment): trỏ đến 19
- đoạn bộ nhớ chứa mã xếp SS. Địa chỉ đầy đủ - AX (Accumulator) thanh của chương trình. của mục dữ liệu là CS:IP. chứa: các kết quả của - Thanh ghi đoạn dữ liệu - Thanh ghi con trỏ ngăn các phép toán thường DS (Data Segment): trỏ xếp SP (Stack Pointer): được lưu vào thanh ghi đến đoạn bộ nhớ chứa trỏ vào đỉnh hiện thời này. Ngoài ra, AX còn là các khai báo của chương ngăn xếp nằm trong toán hạng ẩn cho 1 số trình. đoạn ngăn xếp SS. Địa phép toán như nhân (AX - Thanh ghi đoạn ngăn chỉ đầy đủ của đỉnh ngăn là thừa số) hoặc chia (AX xếp SS (Stack Segment): xếp là SS:SP. là số bị chia). trỏ đến đoạn bộ nhớ - Thanh ghi chỉ số nguồn - BX (Base) thanh ghi cơ dành cho stack. SI (Source Index): trỏ sở: thường được dùng để - thanh ghi đoạn dữ liệu vào một mục dữ liệu chứa các địa chỉ cơ sở. phụ ES (Extra Segment) trong đoạn DS. - CX (Count) bộ đếm: CX mở rộng Địa chỉ đầy đủ của mục thường dung để chứa số 6. Các thanh ghi con dữ liệu là DS:SI. lần lặp trong trường hợp trỏ và chỉ số (pointers - Thanh ghi chỉ số đích dùng lệnh LOOP. Ngoài and index registers) DI (Destination Index): ra, CL còn chứa số lần Các thanh ghi con trỏ và trỏ vào một mục dữ liệu dịch chuyển, quay trái, chỉ số là các thanh ghi trong đoạn DS. Địa chỉ quay phải của các toán 16 bit. Chúng thường đầy đủ của mục dữ liệu hạng. được lưu địa chỉ lệch là DS:DI. - DX (Data) thanh ghi dữ (offset) và kết hợp với 4. Khối số học và logic liệu: DX thường được thanh ghi đoạn tương (Arithmetic Logic chứa địa chỉ offset của ứng tạo thành cặp thanh Unit) thuoc EU xâu kí tự khi có các thao ghi chứa địa chỉ xác định Khối số học và logic có tác nhập vào xâu hoặc in của mã lệnh, mục dữ chức năng thực hiện các xâu. DX (cùng với AX) liệu, hoặc mục dữ liệu phép tính toán như phép còn tham gia chứa kết lưu trong stack. cộng, trừ… hay các phép quả của phép nhân các Địa chỉ vật lý = địa chỉ logic như AND, OR, NOT. số 16 bit hoặc làm số bị đoạn * 16 + địa chỉ lệch Đầu vào ALU là hai thanh chia cho phép chia các - Thanh ghi con trỏ lệnh ghi tạm thời chứa dữ số 16 bit. Ngoài ra, DX IP (Instruction Pointer): liệu của cho phép tính còn dùng để chứa địa chỉ trỏ vào lệnh kế tiếp sẽ được lấy từ bus dữ liệu. của các cổng vào/ra được thực hiện nằm Kết quả đầu ra của ALU trong trường hợp thực trong đoạn mã do con trỏ được đưa trở lại bus dữ hiện các lệnh IN hoặc CS trỏ tới. Địa chỉ đầy đủ liệu và phản ánh vào OUT. của lệnh là CS:IP. thanh ghi cờ (flag 8. Thanh ghi cờ (flag - Thanh ghi con trỏ cơ sở register). register)EU BP (Base Pointer): trỏ 7. Các thanh ghi đa Thanh ghi cờ là thanh ghi vào một mục dữ liệu năng (Multi-purposed lưu trữ trạng thái của nằm trong đoạn ngăn registers) EU CPU tại mỗi thời điểm. Thanh ghi cờ có 16 bít, 20
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn