CÁC BÀI TẬP MẪU THUẦN TÚY NGÔN NGỮ ASSEMBLY

18 687 0
CÁC BÀI TẬP MẪU THUẦN TÚY NGÔN NGỮ ASSEMBLY

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

CÁC BÀI TẬP MẪU THUẦN TÚY NGÔN NGỮ ASSEMBLY Bài ; -; a lũy thừa n (với a số nguyên n số nguyên dương) | ; -Khi chương trình chạy yêu cầu có dang : Hay vao a : -4 Hay vao n : -4 luy thua la : -64 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 13,10,'Hay vao a : $' M2 db 13,10,'Hay vao n : $' crlf db 13,10,'$' M3 db ' luy thua $' M4 db ' la : $' M5 db 13,10,'Co tiep tuc CT (c/k)? $' CODE PS: mov ax,@data mov ds,ax clrscr HienString M1 ; Hiện thông báo M1 (‘Hay vao a : ‘) call VAO_SO_N ; Nhận giá trị a mov bx,ax ; bx = a HienString M2 ; Hiện thông báo M2 (‘Hay vao n : ‘) call VAO_SO_N ; Nhận giá trị n mov cx,ax ; cx = n HienString crlf ; Quay đầu dòng xuống hàng mov ax,bx ; ax=a call HIEN_SO_N ; Hiện giá trị a lên hình HienString M3 ; Hiện chữ ‘ luy thua ‘ mov ax,cx ; ax=n call HIEN_SO_N ; Hiện giá trị n lên hình HienString M4 ; Hiện chữ ‘ la : ‘ mov ax,1 ; Gán ax=1 and cx,cx ; Liệu giá trị n (cx=n) có ? jz HIEN LAP: mul bx loop LAP HIEN: call HIEN_SO_N HienString M5 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Nếu nhảy đến nhãn HIEN ; không thực vòng lặp tính a lũy thừa n ; ax=ax*bx ; Hiện giá trị a lũy thừa n (giá trị có ax) ; Hiện thông báo M5 (‘Co tiep tục CT (c/k) ?’ ) ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) ; Về DOS Bài ; -; n! (n từ đến 7) | ; -Khi chương trình chạy yêu cầu có dang : Hay vao n : Giai thua cua la : 720 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 13,10,'Hay vao n : $' M2 db 13,10,'Giai thua cua $' M3 db ' la : $' M4 db 13,10,'Co tiep tuc CT (c/k)? $' CODE PS: mov ax,@data mov ds,ax clrscr HienString M1 ; Hiện thông báo M1 (‘Hay vao n : ‘) call VAO_SO_N ; Nhận số vào từ bàn phím mov cx,ax ; cx = n HienString M2 call HIEN_SO_N HienString M3 mov ax,1 cmp cx,2 jb HIEN LAP: mul cx loop LAP HIEN: call HIEN_SO_N HienString M4 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Hiện thông báo M2 (‘Giai thua cua ‘) ; Hiện giá trị n ; Hiện thông báo M3 (‘ la : ‘) ; ax=1 ; Liệu n ≤ ; Đúng ≤ nhảy đến nhãn HIEN ; không thực vòng lặp tính n! ; ax=ax*cx ; Hiện giá trị n! (có ax) ; Hiện thông báo M4 (‘Co tiep tuc CT (c/k) ?’) ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) ; Về DOS Bài ; ; Trung bình cộng số nguyên | ; Khi chương trình chạy yêu cầu có dang : Hay vao so thu : -12 Hay vao so thu : Trung binh cong so nguyen la : -3.5 INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 13,10,'Hay vao so thu 1: $' M2 db 13,10,'Hay vao so thu 2: $' M3 db 13,10,'Trung binh cong so nguyen la : $' dautru db '-$' M4 db '.5$' M5 db 13,10,'Co tiep tuc CT (c/k)? $' .CODE PS: mov ax,@data mov ds,ax clrscr HienString M1 call VAO_SO_N mov bx,ax HienString M2 call VAO_SO_N HienString M3 add ax,bx and ax,ax jns L1 HienString dautru neg ax L1: shr ax,1 pushf call HIEN_SO_N popf jnc L2 HienString M4 L2: HienString M5 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Hiện thông báo M1 (‘Hay vao so thu : ‘) ; Nhận giá trị số thứ ; bx = giá trị số thứ ; Hiện thông báo M2 (‘Hay vao so thu : ‘) ; Nhận giá trị số thứ ; Hiện thông báo M3 (‘Trung binh cong so nguyen la :’) ; Tổng số (ax=ax+bx) ; Giá trị tổng âm hay dương? ; Tổng dương nhảy đến L1 ; âm dấu ‘-‘ ; đổi dấu số bị chia ; Chia đôi làm tròn ; Cất giá trị cờ vào stack (thực chất giá trị cờ Carry) ; Hiện giá trị trung bình cộng làm tròn ; Lấy lại giá trị cờ từ stack (lấy lại trạng thái bit cờ Carry) ; Nếu Carry=0 (giá trị tổng chẳn) nhảy ; Carry # thêm ‘.5’ lên hình ; Hiện thông báo M5 (‘Co tiep tuc CT (c/k)? ‘) ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) ; Về DOS Bài ; ; Tổng dãy số nguyên | ; Khi chương trình chạy yêu cầu có dang : Hay vao so luong phan : a[0] = -10 a[1] = a[2] = -15 a[3] = Day so vua vao la : -10 -15 Tong day so nguyen la : -12 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small DATA M1 db 10,13,'Hay vao so luong phan : $' M2 db 10,13,'a[$' M3 db ']= $' M4 db 10,13,'Day so vua vao la : $' M5 db ' $' M6 db 10,13,'Tong day so nguyen la : $' M7 db 13,10,'Co tiep tuc CT (c/k) ? $' sltp dw ? i dw ? a dw 100 dup(?) CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 ; Hiện thông báo M1 (‘Hay vao so luong phan :’) call VAO_SO_N ; Nhận số lượng thành phần mov sltp,ax ; Cất giá trị số lượng thành phần vào biến sltp ; Vòng lặp nhận số đưa vào mảng mov cx,ax ; cx=số lượng thành phần (chỉ số vòng lặp LOOP) lea bx,a ; bx trỏ offset a[0] mov i,0 ; Gán giá trị biến nhớ i=0 L1: HienString M2 ; Hiện thông báo M2 (‘a[‘) mov ax,i ; Hiện giá trị i call HIEN_SO_N HienString M3 ; Hiện thông báo M3 (‘] =’) call VAO_SO_N ; Nhận thành phần a[i] mov [bx],ax ; Đưa giá trị a[i] vào mảng a bx trỏ đến inc i ; Tăng giá trị i lên add bx,2 ; bx trỏ đến thành phần mảng a loop L1 ; Vòng lặp đưa số mảng lên hình HienString M4 ; Hiện thông báo M4 (‘Day so vua vao la : ‘) mov cx,sltp lea bx,a ; cx=số lượng thành phần (chỉ số vòng lặp) ; bx trỏ đến a[0] L2: mov ax,[bx] ; ax=a[i] call HIEN_SO_N ; Hiện giá trị a[i] lên hình HienString M5 ; Hiện dấu cách (space) add bx,2 ; bx trỏ đến thành phần mảng loop L2 ; Vòng lặp tính tổng HienString M6 ; Hiện thông báo M6 (‘Tong day so nguyen la : ‘) mov cx,sltp ; cx=số lượng thành phần mảng (chỉ số vòng lặp) lea bx,a ; bx trỏ đến a[0] (con trỏ offset) xor ax,ax ; ax chứa tổng (lúc đầu 0) ; -; L3: | ; add ax,[bx] ; ax=ax+a[i] | ; add bx,2 ; bx trỏ đến thành phần mảng a | ; loop L3 | ; -call HIEN_SO_N ; Hiện giá trị tổng HienString M7 ; Hiện thông báo M7 (Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải ký tự ‘c’ ? jne Exit ; Nếu nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không quay đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS Chú ý : a) Tổng thành phần âm mảng L3: mov dx,[bx] ; dx = a[i] and dx,dx ; Dựng cờ dấu (S=1 dx chứa số âm, S=0 dx chứa số dương) jns L4 ; Nếu giá trị a[i] dương nhảy đến L4 add ax,[bx] ; giá trị a[i] âm cộng vào tổng nằm ax L4: add bx,2 ; bx trỏ đến thành phần mảng a loop L3 b) Tổng thành phần dương mảng L3: mov dx,[bx] ; dx = a[i] and dx,dx ; Dựng cờ dấu (S=1 dx chứa số âm, S=0 dx chứa số dương) js L4 ; Nếu giá trị a[i] âm nhảy add ax,[bx] ; giá trị a[i] dương cộng vào tổng nằm ax L4: add bx,2 ; bx trỏ đến thành phần mảng a loop L3 c) Tổng thành phần chẵn mảng L3: mov dx,[bx] ; dx = a[i] shr dx,1 ; Bit thấp vào cờ Carry (C=1-> a[i] lẻ, C=0 -> a[i] chẵn) jc L4 ; Nếu giá trị a[i] lẻ nhảy đến l4 add ax,[bx] ; giá trị a[i] chẵn thì cộng vào tổng nằm ax L4: add bx,2 ; bx trỏ đến thành phần mảng a d) Tổng thành phần lẻ mảng L3: mov dx,[bx] ; dx = a[i] shr dx,1 ; Bit thấp vào cờ Carry (C=1-> a[i] lẻ, C=0 -> a[i] chẵn) jnc L4 ; Nếu giá trị a[i] chẵn nhảy đến nhãn L4 add ax,[bx] ; giá trị a[i] lẻ cộng vào tổng nằm ax L4: add bx,2 ; bx trỏ đến thành phần mảng a Bài ; ; Chia số với số bị chia nguyên | ; số chia nguyên dương | ; ( chữ số sau dấu thập phân) | ; Khi chương trình chạy yêu cầu có dang : Hay vao so bi chia : -20 Hay vao so chia : Thuong la : -6.66 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small .STACK 100h DATA M1 db 10,13,'Hay vao so bi chia : $' M2 db 10,13,'Hay vao so chia : $' M3 db 10,13,'Thuong la : $ ' dautru db '-$' daucham db '.$' M4 db 10,13,'Co tiep tuc (c/k) ? $' CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa hình HienString M1 ; Hiện thông báo M1 (‘Hay vao so bi chia : ‘) call VAO_SO_N ; Nhận giá trị số bị chia mov bx,ax ; bx = số bị chia HienString M2 ; Hiện thông báo M2 (’Hay vao so chia : ‘) call VAO_SO_N ; Nhận giá trị số chia (ax = số chia) xchg ax,bx ; Đổi chéo (ax=số bị chia, bx=số chia) HienString M3 ; Hiện thông báo M3 (‘Thuong la : ‘) and ax,ax ; Dựng cờ dấu số bị chia (dấu thương dấu số bị chia) jns CHIA1 ; Nếu dấu số bị chia dương nhảy đến nhãn CHIA1 HienString dautru ; số bị chia âm dấu ‘-‘ lên hình (dấu âm) neg ax ; Đổi dấu số bị chia (để thành số nguyên dương) CHIA1: xor dx,dx ; dx = div bx ; dx:ax chia cho bx (ax=thương dx=dư) call HIEN_SO_N ; Hiện giá trị thương lên hình and dx,dx ; Dựng cờ phần dư (Z=1 dư=0, Z=0 dư≠0) jz KT ; Dư nhảy đến kết thúc trình chia HienString daucham ; không dấu chấm (‘.’) tiếp tục chia mov cx,2 ; Số chữ số sau dấu thập phân mov si,10 ; si = 10 CHIA2: mov ax,dx ; Đưa phần dư vào ax mul si ; Nhân phần dư cho 10 div bx ; dx:ax chia cho bx call HIEN_SO_N ; Hiện giá trị thương lên hình and dx,dx ; Dựng cờ phần dư (Z=1 dư=0, Z=0 dư≠0) jz KT ; Phần dư nhảy đến kết thúc trình chia loop CHIA2 KT: HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov int cmp jne jmp ah,1 21h al,'c' Exit PS ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Về DOS Bài ; ; Tổng cấp số cộng biết n (số lượng thành phần) | ; d (công sai) u1 (giá trị thành phần đầu tiên) | ; Khi chương trình chạy yêu cầu có dang : Hay vao n : Hay vao d : Hay vao u1 : Tong cap so cong la : Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 10,13,'Hay vao n : $' M2 db 10,13,'Hay vao d : $' M3 db 10,13,'Hay vao u1 : $ ' M4 db 10,13,’ Tong cap so cong la : $’ M5 db 10,13,'Co tiep tuc (c/k) ? $' CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa hình HienString M1 ; Hiện thông báo M1 (‘Hay vao n : ‘) call VAO_SO_N ; Nhận giá trị n mov cx,ax ; cx = n HienString M2 ; Hiện thông báo M2 (’Hay vao d : ‘) call VAO_SO_N ; Nhận giá trị d mov bx,ax ; bx = d HienString M3 call VAO_SO_N mov dx,ax dec cx ; Hiện thông báo M3 (’Hay vao u1 : ‘) ; Nhận giá trị u1 ; dx = ax = u1 (ax = tổng = u1; dx =ui lúc đầu u1) ; Giảm cx (n-1) add dx,bx add ax,dx loop L1 HienString M4 call HIEN_SO_N HienString M5 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS ; dx = ui ; ax = tổng L1: ; Hiện thông báo M3 (‘Tong cap so cong la : ‘) ; Hiện tổng cấp số cộng ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Về DOS Bài ; ; Tổng cấp số nhân biết n (số lượng thành phần)| ; q (công bội) u1 (giá trị thành phần đầu tiên) | ; Khi chương trình chạy yêu cầu có dang : Hay vao n : Hay vao q : Hay vao u1 : Tong cap so nhan la : Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 10,13,'Hay vao n : $' M2 db 10,13,'Hay vao q : $' M3 db 10,13,'Hay vao u1 : $ ' M4 db 10,13,’ Tong cap so nhan la : $’ M5 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 call VAO_SO_N mov cx,ax HienString M2 call VAO_SO_N mov bx,ax HienString M3 call VAO_SO_N mov si,ax dec cx L1: mul bx add si,ax loop L1 HienString M4 mov ax,si call HIEN_SO_N HienString M5 mov ah,1 int 21h cmp al,'c' jne Exit jmp PS Exit: mov ah,4ch int 21h INCLUDE lib2.asm END PS ; Xóa hình ; Hiện thông báo M1 (‘Hay vao n : ‘) ; Nhận giá trị n ; cx = n ; Hiện thông báo M2 (’Hay vao q : ‘) ; Nhận giá trị q ; bx = q ; Hiện thông báo M3 (’Hay vao u1 : ‘) ; Nhận giá trị u1 ; si = ax = u1 (si = tổng = u1; ax =ui lúc đầu u1) ; Giảm cx (n-1) ; ax = ax*bx = ui ; si = tổng ; Hiện thông báo M3 (‘Tong cap so nhan la : ‘) ; Chuyển tổng từ si đến ax ; Hiện tổng cấp số nhân ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) ; Chờ nhận ký tự từ bàn phím ; Ký tự vừa nhận có phải ký tự ‘c’ ? ; Nếu nhảy đến nhãn Exit (về DOS) ; Còn không quay đầu (bắt đầu lại chương trình) ; Về DOS Bài ; N ; Tính biểu thức ∑i i =1 | ; Khi chương trình chạy yêu cầu có dang : Hay vao N : Tong tu den la : 15 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db 10,13,'Hay vao N : $' M2 db 10,13,'Tong tu den $' M3 db 10,13,' la : $ ' M4 db 10,13,'Co tiep tuc (c/k) ? $' CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa hình HienString M1 ; Hiện thông báo M1 (‘Hay vao N : ‘) call VAO_SO_N ; Nhận giá trị N mov cx,ax ; cx = N (chỉ số vòng lặp) HienString M2 ; Hiện thông báo M2 (’Tong tu den ‘) call HIEN_SO_N ; Hiện giá trị N HienString M3 ; Hiện thông báo M3 (’ la : ‘) dec cx ; Giảm cx (n-1) L1: add ax,cx ; ax = ax+cx loop L1 call HIEN_SO_N ; Hiện giá trị biểu thức HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải ký tự ‘c’ ? jne Exit ; Nếu nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không quay đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS CÁC BÀI TẬP LẬP TRÌNH HỆ THỐNG Bài Hãy viết chương trình cho biết máy tính bạn dùng có ổ mềm hay không? Nếu có ổ? Cách giải : Chú ý byte có địa 0:410h vùng liệu ROM BIOS có chứa thông tin liên quan đến thông tin ổ đĩa mềm, cụ thể sau : x x x 1… có ổ mềm 0… ổ mềm số lượng ổ mềm -1 Khi chương trình chạy yêu cầu có dạng : May tinh dang dung co o mem khong ? Co So luong o mem la : INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db ’May tinh dang dung co o mem không ? $’ co db ‘Co $’ khong db ‘ Khong $’ M2 db 13,10,’So luong o mem ma may tinh co la : $’ CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 ; Hiện thông báo (‘May tinh dang dung co o mem khong ?’) int 11h ; Ngắt hệ thống thực việc đưa nội dung ô nhớ 0:410h -> al shr al,1 ; Đưa bit thấp vào bit cờ Carry jc L1 ; Nếu bit cờ Carry=1 nhảy đến L1 HienString khong ; khômg thông báo ‘Khong’ jmp Exit ; Nhảy đến nhãn Exit L1: HienString co ; Hiện thông báo ‘Co’ HienString M2 ; Hiện thông báo ‘So luong o mem ma may tinh co la : ‘ mov cl,5 ; Chuyển bit (số lượng ổ mềm -1) sang phải lần shr al,cl inc al ; al = số lượng ổ mềm add al,30h ; al mã ASCII số lượng ổ mềm mov ah,0eh int 10h ; Chức ký tự ASCII lên hình mov ah,4ch int 21h END PS ; Về DOS Exit: Bài Hãy viết chương trình cho biết máy tính bạn dùng có cổng COM hay không? Nếu có cổng cho biết địa cổng (địa cổng phải HEXA) Cách giải : Chú ý byte có địa 0:411h vùng liệu ROM BIOS có chứa thông tin liên quan đến thông tin số lượng cổng COM mà máy tính dùng có, cụ thể sau : x x x 0 0… cổng COM 0 1… có cổng COM có cổng COM 1… có cổng COM Chú ý : Địa COM1 có byte có địa 0:400h 0:401h Địa COM2 có byte có địa 0:402h 0:403h … Khi chương trình chạy yêu cầu có dạng : May tinh dang dung co cong COM khong ? Co So luong cong COM la : Dia chi cac cong COM la : 3f8 2f8 INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db ’May tinh dang dung co cong COM không ? $’ co db ‘Co $’ khong db ‘ Khong $’ M2 db 13,10,’So luong cong COM ma may tinh co la : $’ M4 db 13,10,’Dia chi cac cong COM la : $’ space db ‘ $’ CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 int 11h mov al,ah and al,00001110b shr al,1 jnz L1 HienString khong jmp Exit ; Hiện thông báo ‘May tinh dang dung co cong COM khong ?’ ; Ngắt hệ thống thực việc đưa nội dung ô nhớ 0:411h -> ah ; Đưa nội dung 0:411h -> al ; Tách bit chứa số lượng cổng COM ; al = số lượng cổng COM ; Nếu al # (có cổng COM nhảy) ; không thông báo ‘Khong’ ; Nhảy đến nhãn Exit L1: HienString co mov cl,al xor ch,ch HienString M2 add al,30h mov ah,0eh int 10h HienString M3 xor ax,ax mov es,ax lea bx,400h ; Hiện thông báo ‘Co’ mov ax,es:[bx] call HIEN_HEXA HienString space add bx,2 loop L2 ; ax = địa COM ; Hiện địa dạng HEXA lên hình ; Hiên số dấu cách ; bx trỏ đến byte chứa địa cổng COM ; cx = số lượng cổng COM (chỉ số vòng lặp địa chỉ) ; Hiện thông báo ‘So luong cong COM ma may tinh co la : ‘ ; al mã ASCII số lượng cổng COM ; Chức ký tự ASCII lên hình ; Hiện thông báo ‘Dia chi cac cong COM la : ‘ ; es:bx = 0:400h (nơi chứa địa cổng COM1) L2: Exit: mov ah,4ch int 21h INCLUDE lib3.asm END PS ; Về DOS ; lib3.asm chứa chương trình HIEN_HEXA lib3.asm ; ; Chương trình nội dung có | ; ghi AX lên hình dạng HEXA | ; HIEN_HEXA PROC push ax bx cx dx mov bx,16 ; bx = 16 số chia xor cx,cx ; cx = số lương lần cất phần dư (sau chia vào stack) xor dx,dx ; dx = div bx cmp dx,10 jb HX1 add dx,7 HX1: add dx,30h push dx inc cx and ax,ax jnz HX1 HX2: pop ax mov ah,0eh int 10h loop HX2 pop dx cx bx ax ret HIEN_HEXA ENDP ; dx:ax chia cho bx (16) ; So sánh phần dư với 10 ; Nếu phần dư ≤ 10 nhảy đến HX1 ; Cộng phần dư với ; Chuyển sang dạng ASCII ; Cất vào stack ; Đếm số lần cất vào stạck (chỉ số vòng lặp sau này) ; Dựng cờ Z (Liệu thương bằng/khác 0) ; Nếu thương chưa nhảy đến tiếp tục chia ; Còn thương thiết lập vòng lặp lôi sô (dạng ASCII ; vào AL để hiện) ; Chức ký tự ASCII nằm AL lên hình Bài Hãy viết chương trình cho biết máy tính bạn dùng có cổng LPT hay không? Nếu có cổng cho biết địa cổng (địa cổng phải HEXA) Cách giải : Chú ý byte có địa 0:411h vùng liệu ROM BIOS có chứa thông tin liên quan đến thông tin số lượng cổng LPT mà máy tính dùng có, cụ thể sau : x x 0 … cổng LPT 1… có cổng LPT có cổng LPT 1… có cổng LPT Chú ý : Địa LPT1 có byte có địa 0:408h 0:409h Địa LPT2 có byte có địa 0:40ah 0:40bh … Khi chương trình chạy yêu cầu có dạng : May tinh dang dung co cong LPT khong ? Co So luong cong LPT la : Dia chi cac cong LPT la : 3BC 378 278 Chú ý : Giống INCLUDE lib1.asm .MODEL small STACK 100h DATA M1 db ’May tinh dang dung co cong LPT không ? $’ co db ‘Co $’ khong db ‘ Khong $’ M2 db 13,10,’So luong cong LPT ma may tinh co la : $’ M4 db 13,10,’Dia chi cac cong LPT la : $’ space db ‘ $’ CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 ; Hiện thông báo ‘May tinh dang dung co cong LPT khong ?’ int 11h ; Ngắt hệ thống thực việc đưa nội dung ô nhớ 0:411h -> ah mov al,ah ; Đưa nội dung 0:411h -> al mov cl,6 shr al,cl ; al = số lượng cổng LPT jnz L1 ; Nếu al # (có cổng LPT nhảy) HienString khong ; không thông báo ‘Khong’ jmp Exit ; Nhảy đến nhãn Exit L1: HienString co ; Hiện thông báo ‘Co’ mov cl,al xor ch,ch ; cx = số lượng cổng LPT (chỉ số vòng lặp địa chỉ) HienString M2 ; Hiện thông báo ‘So luong cong LPT ma may tinh co la : ‘ add al,30h ; al mã ASCII số lượng cổng LPT mov ah,0eh ; Chức ký tự ASCII lên hình int 10h HienString M3 ; Hiện thông báo ‘Dia chi cac cong LPT la : ‘ xor ax,ax mov es,ax lea bx,408h ; es:bx = 0:408h (nơi chứa địa cổng LPT1) L2: mov ax,es:[bx] ; ax = địa LPT call HIEN_HEXA ; Hiện địa dạng HEXA lên hình HienString space ; Hiên số dấu cách add bx,2 ; bx trỏ đến byte chứa địa cổng COM loop L2 Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib3.asm ; lib3.asm chứa chương trình HIEN_HEXA END PS Bài Hãy viết chương trình cho biết máy tính bạn dùng có card điều khiển hình loại (mono hay color)? Cách giải : Chú ý byte có địa 0:410h vùng liệu ROM BIOS có chứa thông tin liên quan đến loại card điều khiển hình, cụ thể sau : x x 1 … mono ≠ 1 … color Khi chương trình chạy yêu cầu có dạng : Loai card dieu khien man hinh ma may tinh co la : Color INCLUDE lib1.asm MODEL small STACK 100h DATA M1 db ’Loai card dieu khien man hinh ma may tinh co la : $’ color db ‘Color $’ mono db ‘Mono $’ CODE PS: mov ax,@data mov ds,ax CLRSCR HienString M1 ; Hiện ‘Loai card dieu khien man hinh ma may tinh co la :’ int 11h ; Ngắt hệ thống thực việc đưa nội dung ô nhớ 0:410h -> al and al,00110000b ; Tách bit có thông tin liên quan đến loại card đ/k hình cmp al,00110000b ; Liệu có phải loại card điều khiển hình mono? jne L1 ; Không phải card mono nhảy đến L1 HienString mono ; phải thông báo ‘Mono’ jmp Exit ; Nhảy đến nhãn Exit L1: HienString color ; Hiện thông báo ‘Color’ Exit: mov ah,4ch ; Về DOS int 21h END PS ... Về DOS int 21h INCLUDE lib2.asm END PS CÁC BÀI TẬP LẬP TRÌNH HỆ THỐNG Bài Hãy viết chương trình cho biết máy tính bạn dùng có ổ mềm hay không? Nếu có ổ? Cách giải : Chú ý byte có địa 0:410h vùng... ah,4ch int 21h END PS ; Về DOS Exit: Bài Hãy viết chương trình cho biết máy tính bạn dùng có cổng COM hay không? Nếu có cổng cho biết địa cổng (địa cổng phải HEXA) Cách giải : Chú ý byte có địa 0:411h... Chức ký tự ASCII nằm AL lên hình Bài Hãy viết chương trình cho biết máy tính bạn dùng có cổng LPT hay không? Nếu có cổng cho biết địa cổng (địa cổng phải HEXA) Cách giải : Chú ý byte có địa 0:411h

Ngày đăng: 02/07/2017, 10:06

Tài liệu cùng người dùng

Tài liệu liên quan