LTDKTB
Câu 1: Xác định giá trị thanh ghi cờ, AX và CX của một bộ vi xử lý 8088 sau khi bộ vi xử lý đó thực hiện lệnh trong các trường hợp sau
Theo đề bài ta có:
Giá trị của AX = 111Fh, suy ra AH = 11h và AL = 1Fh
Giá trị của CX = CDEBh, suy ra CH = CDh và CL = EBh
Giá trị của Flag = 4321h hay là Flag = 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1
Ta biết thanh ghi cờ có 16bit, mỗi bit tương ứng là một cờ như là CF, PF, AF …
Xác định giá trị của thanh ghi cờ nghĩa là ta xác định giá trị của từng cờ trong thanh ghi cờ.
a. AND AL, CL
Ta có AL = 1Fh và CL = EBh. Sau khi thực hiện lệnh AND AL,CL thì AL có giá
trị mới là 0Bh (dạng nhị phân là 00001011).
Giá trị của CL không thay đổi.
Xét giá trị các cờ của thanh ghi cờ:
CF = 0 (Vì kết quả thực hiện lệnh không có việc nhớ bit MSB).
PF = 0 (Tổng các bit 1 trong byte thấp của kết quả là một số lẻ)
ZF = 0 (Kết quả là 1 số khác 0)
SF = 0 (vì MSB = 0, kết quả là số dương)
OF = 0 (vì dấu của kết quả giống như dấu của 2 số hạng ban đầu)
Thanh ghi cờ có giá trị mới là Flag = 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4320h, AX = 110Bh, CX = CDEBh
b. NOT AH
Chức năng lệnh NOT là đảo ngược từng bit một của toán hạng đích.
Ta có AH = 11h hay viết dưới dạng nhị phân là 00010001. Thực hiện lệnh NOT
AH thì AH có giá trị mới là EEh (dạng nhị phân: 11101110).
Giá trị thanh ghi CX không thay đổi, vì lệnh chỉ tác động lên thanh ghi AH
Xem xét từng cờ của thanh ghi cờ, ta nhận thấy giá trị của thanh ghi cờ cũng không
thay đổi
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4321h, AX = EE1Fh, CX = CDEBh
c. CMP AL, CL
Chức năng lệnh CMP là so sánh hai toán hạng nguồn và toán hạng đích bằng cách
lấy toán hạng đích trừ đi toán hạng nguồn. Nội dung của hai toán hạng đều không thay đổi
sau khi thực hiện lệnh này.
Ta có AL = 1Fh (dạng nhị phân là 00011111).
CL = EBh (dạng nhị phân là 11101011).
00011111
- 11101011
00010100
Xem xét từng cờ của thanh ghi cờ, ta nhận thấy CF = 1 (vì phép trừ có mượn bit
của MSB) và các cờ khác của thanh ghi cờ cũng không thay đổi.
Giá trị thanh ghi CX không thay đổi.
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4321h, AX = 111Fh, CX = CDEBh
d. INC AH
Lệnh INC làm tăng giá trị của toán hạng đích lên 1.
Ta có AH = 11h (dạng nhị phân là 00010001). Sau khi thực hiện lệnh INC AH thì
AH có giá trị mới là 12h (dạng nhị phân: 00010010).
Giá trị thanh ghi CX không thay đổi, vì lệnh chỉ tác động lên thanh ghi AH
Lệnh này không tác động đến cờ CF, nên giá trị CF vẫn là 1.
PF = 1, vì có tổng số bit 1 trong byte thấp của kết quả là 1(là số lẻ)
Thanh ghi cờ có giá trị mới là Flag = 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4325h, AX = 121Fh, CX = CDEBh
e. DEC AH
Lệnh DEC làm giảm giá trị của toán hạng đích lên 1.
Ta có AH = 11h. Sau khi thực hiện lệnh thì AH có giá trị mới là 10h.
Giá trị thanh ghi CX không thay đổi, vì lệnh chỉ tác động lên thanh ghi AH
Lệnh này không tác động đến cờ CF, nên giá trị CF vẫn là 1. Giá trị của PF vẫn là 0
Thanh ghi cờ có giá trị không thay đổi
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4321h, AX = 101Fh, CX = CDEBh
f. XCHG AH, BH
Lệnh XCHG hoán vị giá trị giữa toán hạng nguồn và toán hạng đích.
Ta có AH = 11h. Do BH không xác định, nên ta giả sử như BH = 00h.
Sau khi thực hiện lệnh thì AH có giá trị mới là 00h .
Giá trị thanh ghi CX không thay đổi, vì lệnh chỉ tác động lên thanh ghi AH
Lệnh này không tác động đến các cờ của thanh ghi cờ, nên thanh ghi cờ có giá trị
không thay đổi
Do đó sau khi thực hiện lệnh thì giá trị chứa ở các thanh ghi như sau:
Flag = 4321h, AX = 001Fh, CX = CDEBh
Câu 2. Trình bày vai trò của các thanh ghi con trỏ và chỉ số: IP, SP, SI và DI.
Các thanh ghi con trỏ và chỉ số là các thanh ghi 16 bit. Chúng thường được lưu địa chỉ lệch (offset) và kết hợp với thanh ghi đoạn tương ứng tạo thành cặp thanh ghi chứa địa chỉ xác định của mã lệnh, mục dữ liệu, hoặc mục dữ liệu lưu trong stack. Nhờ vào cặp thanh ghi này, người ta có thể tính đia chỉ vật lý cụ thể theo công thức sau:
Địa chỉ vật lý = địa chỉ đoạn * 16 + địa chỉ lệch
Dưới đây là các thanh ghi con trỏ và chỉ số:
- Thanh ghi con trỏ lệnh IP (Instruction Pointer): trỏ vào lệnh kế tiếp sẽ được thực hiện nằm trong đoạn mã do con trỏ CS trỏ tới. Địa chỉ đầy đủ của lệnh là CS:IP.
- Thanh ghi con trỏ cơ sở BP (Base Pointer): trỏ vào một mục dữ liệu nằm trong đoạn ngăn xếp SS. Địa chỉ đầy đủ của mục dữ liệu là CS:IP.
- Thanh ghi con trỏ ngăn xếp SP (Stack Pointer): trỏ vào đỉnh hiện thời ngăn xếp nằm trong đoạn ngăn xếp SS. Địa chỉ đầy đủ của đỉnh ngăn xếp là SS:SP.
- Thanh ghi chỉ số nguồn SI (Source Index): trỏ vào một mục dữ liệu trong đoạn DS. Địa chỉ đầy đủ của mục dữ liệu là DS:SI.
- Thanh ghi chỉ số đích DI (Destination Index): trỏ vào một mục dữ liệu trong đoạn DS. Địa chỉ đầy đủ của mục dữ liệu là DS:DI.
Câu 3: Viết chương trình có các chức năng sau:
Nhấn phím Ctrl+F8 thoát khỏi chương trình.
Nhấn phím Ctrl+F9 bật đèn Num Lock lên 1 giây rồi tắt.
Nhấn phím Ctrl+F10 bật đèn Caps Lock lên 1 giây rồi tắt.
Nhấn phím Ctrl+F11 bật đèn Scroll Lock lên 1 giây rồi tắt.
.Model Small
.Stack
.Data
menu db 13,10,'Ctrl_F8 : Thoat chuong trinh'
db 13,10,'Ctrl_F9 : Bat den NumLock len 1 giay roi tat'
db 13,10,'Ctrl_F10 : Bat den CapsLock len 1 giay roi tat'
db 13,10,'Ctrl_F11 : Bat den ScrollLock len 1 giay roi tat$'
s1 db 13,10,'Bat den$'
s2 db 13,10,'Tat den$'
.Code
Print Macro s
mov ah,09
lea dx,s
int 21h
EndM
Begin:
mov ax,@data
mov ds,ax
Print menu
re:
mov ah,01
int 16h
jz re
lap:
mov ah,02
int 16h
test al,00000100b
jnz CtrlPress
jmp lap
CtrlPress:
in al,60h
cmp al,42h
je F8
cmp al,43h
je F9
cmp al,44h
je F10
cmp al,57h
je F11
jmp lap
F9:
mov al,0edh
Call SendKb
mov al,00000010b
Call SendKb
Print s1
Call Wait1s
mov al,0edh
Call SendKb
mov al,00000000b
Call SendKb
Print s2
jmp lap
F10:
mov al,0edh
Call SendKb
mov al,00000100b
Call SendKb
Print s1
Call Wait1s
mov al,0edh
Call SendKb
mov al,00000000b
Call SendKb
Print s2
jmp lap
F8:
jmp exit
F11:
mov al,0edh
Call SendKb
mov al,00000001b
Call SendKb
Print s1
Call Wait1s
mov al,0edh
Call SendKb
mov al,00000000b
Call SendKb
Print s2
jmp lap
exit:
mov ax,4c00h
int 21h
SendKb Proc
push ax
push cx
mov ah,al
mov al,0adh
out 64h,al
mov cx,65535
Waitnotfull:
in al,64h
test al,00000010b
loopnz Waitnotfull
mov al,ah
out 60h,al
mov cx,65535
w:
loop w
mov al,0aeh
out 64h,al
pop cx
pop ax
SendKb EndP
Wait1s Proc
push ax
push cx
push dx
mov ah,86h
mov cx,15
mov dx,16960
int 15h
pop dx
pop cx
pop ax
Wait1s EndP
End Begin
Câu 5: Viết chương trình nhập 3 ký tự từ bàn phím. Xuất 3 ký tự này ra màn hình theo chiều đứng từ trên xuống bên lề trái.
.model small
.stack 100h
.data
thongbao1 db 'nhap chuoi, enter de ket thuc: $',10,13
thongbao2 db 13,10,'hien thi chuoi: $'
xuongdong db 13,10,'$'
str db 100 dup(?)
main proc
mov ax,@Data
mov ds,ax
mov es,ax
xor cx,cx
mov ah,9
lea dx,thongbao1
int 21h
cld
lea di,str
mov ah,1
nhaptiep:
int 21h
cmp al,13
je thoinhap
inc cx
jmp nhaptiep
thoinhap:
mov ah,9
lea dx,thongbao2
int 21h
lea si,str
lap:
mov ah,9
lea dx,xuongdong
int 21h
mov ah,2
lodsb
mov dl,al
int 21h
loop lap
mov ah,4ch
int 21h
main endp
end main
Câu 4 Viết chương trình in ra Rom-Bios màn hình dòng chữ 'Khoa CNTT Hoc vien BCVT’ vị trí bắt đầu tại dòng 10 cột 20 và màu tùy ý (In toàn chuỗi ở chế độ 80x25x16 màu).
.Model Small
.Stack
.Data
s db 'Khoa CNTT Hoc vien BCVT
.Code
Begin:
Mov ax,@Data
Mov ds,ax
;Dua ve che do 80x25x16 mau
Mov ah,0
Mov al,3
Int 10h
Mov ax,0B800h ;Nap dia chi segment cua Video-Ram o che do van ban
Mov es,ax
Lea si,s
Mov di,(80*20+10)*2 ;hang 20 cot 10
Mov cx,30
Lap:
Mov al,[si] ;al chua ki tu can xuat
Mov ah,2Eh ;nen xanh chu vang
Mov Es:[di],ax
add di,2
inc si
Loop Lap
Mov ah,4ch ;Thoat khoi chuong trinh tro ve Dos
Int 21h
End Begin
6. Viết chương trình nhập 2 chuỗi S1 và S2 từ bàn phím, mỗi chuỗi gồm 5 ký tự. Viết chương trình hoán chuyển nội dung 2 chuỗi S1 và S2. Hiển thị kết quả S1 và S2 ra màn hình.
.Model Small
.Stack
.Data
S1 db 13,10,'Nhap chuoi thu 1:$'
S2 db 13,10,'Nhap chuoi thu 2:$'
Buf1 db 6,?,7 dup('$')
Buf2 db 6,?,7 dup('$')
.Code
Begin:
Mov Ax,@Data
Mov Ds,Ax
;Xuat Chuoi S1 Ra Man Hinh
Mov Dx,Offset S1
Mov Ah,09
Int 21h
;Nhap chuoi Buf1
Mov dx,offset Buf1
Mov ah,0ah
Int 21h
;Xuat Chuoi S2 Ra Man Hinh
Mov Dx,Offset S2
Mov Ah,09
Int 21h
;Nhap chuoi Buf2
Mov dx,offset Buf2
Mov ah,0ah
Int 21h
Lea si,Buf1+2
Lea di,Buf2+2
Mov al,[si]
Mov dl,[di]
Mov [si],dl
Mov [di],al
Mov al,[si+1]
Mov dl,[di+1]
Mov [si+1],dl
Mov [di+1],al
Mov al,[si+2]
Mov dl,[di+2]
Mov [si+2],dl
Mov [di+2],al
Mov al,[si+3]
Mov dl,[di+3]
Mov [si+3],dl
Mov [di+3],al
Mov al,[si+4]
Mov dl,[di+4]
Mov [si+4],dl
Mov [di+4],al
;Xuat Chuoi S1 Ra Man Hinh
Mov Dx,Offset S1
Mov Ah,09
Int 21h
;Nhap chuoi Buf1
Mov dx,offset Buf1 +2
Mov ah,09
Int 21h
;Xuat Chuoi S2 Ra Man Hinh
Mov Dx,Offset S2
Mov Ah,09
Int 21h
;Nhap chuoi Buf2
Mov dx,offset Buf2 +2
Mov ah,09
Int 21h
;Thoat khoi chuong trinh va tro va Dos
Mov Ax,4c00h
Int 21h
End Begin
Câu 7: Viết chương trình bật đèn Scroll Lock liên tục Nhấn Ctrl F12 rồi tắt.
.Model Small
.Stack
.Data
s1 db 13,10,'Den nhap nhay$'
s2 db 13,10,'Thoat$'y
.Code
Print macro s
mov ah,09
lea dx,s
int 21h
EndM
Begin:
mov ax,@data
mov ds,ax
Print s1
lap:
mov al,0edh
Call SendKb
mov al,00000001b
Call SendKb
Call Wait1s
mov al,0edh
Call SendKb
mov al,00000000b
Call SendKb
Call Wait1s
mov ah,02
int 16h
test al,00000100b
jz lap
in al,60h
cmp al,58h
jne lap
exit:
Print s2
mov ax,4c00h
int 21h
SendKb Proc
push ax
push cx
mov ah,al
mov al,0adh
out 64h,al
mov cx,65535
Waitnotfull:
in al,64h
test al,00000010b
loopnz Waitnotfull
mov al,ah
out 60h,al
mov cx,65535
w:
loop w
mov al,0aeh
out 64h,al
pop cx
pop ax
SendKb EndP
Wait1s Proc
push ax
push cx
push dx
mov ah,86h
mov cx,0
mov dx,16960
int 15h
pop dx
pop cx
pop ax
Wait1s endp
End Begin
Câu 8: Viết chương trình in ra Video-Ram màn hình dòng chữ 'Khoa CNTT Hoc vien BCVT’ vị trí bắt đầu tại dòng 10 cột 20 và màu tùy ý (In từng ký tự trong chuỗi ở chế độ 80x25x16 màu).
.Model Small
.Stack
.Data
s db 'Khoa CNTT Hoc vien BCVT’
.Code
Begin:
; Khởi tạo đoạn chương trình
Mov ax,@Data
Mov ds,ax
Mov es,ax ; Es chứa địa chỉ đoạn Data
;Đưa về chế độ 80x25x16 màu
Mov ah,0
Mov al,3
Int 10h
;Xuất toàn bộ chuỗi ra Rom- Bios màn hình
Lea bp,s ;Lấy địa chỉ offset của s lưu vào trong bp
Mov ah,13h
Mov al,1 ; Lấy phục vụ con 1
Mov cx,30 ; Xuất 30 ký tự
Mov bh,0 ; Trang màn hình 0
Mov bl,41h ;Nền đỏ chữ xanh
Mov dh,10 ; Dòng 10
Mov dl,20 ; Cột 20
Int 10h
; Thoát khỏi chương trình trở về Dos
Mov ah,4ch
Int 21h
End Begin
9.Trình bày vai trò của các thanh ghi đoạn: CS, DS, SS, và ES
Nhóm thanh ghi đoạn : (Segiment regiset)
Gồm 4 thanh ghi : CS, DS, ES, SS
a. Thanh ghi CS : (Code Segment)
Dùng để chứa địa chỉ Segment của đoạn mã của đoạn mã chương trình.
b. Thanh ghi DS : (Data Segment)
Chứa địa chỉ Segment của đoạn dữ liệu
c. Thanh ghi ES :
(Extra Segment) Chứa địa chỉ Segment của đoạn dữ liệu bổ sung. Như vậy nếu ta có hai đoạn dữ liệu thì một sẽ do thanh ghi DS và hai sẽ do thanh ghi ES quản lý
d. Thanh ghi SS (Stack Segment)
Dùng lưu địa chỉ Segment của đoạn Stack
Bốn thanh ghi này có thể truy xuất trên bốn đoạn khác nhau.
Như vậy một chương trình làm việc cùng một lúc tối đa là bốn đoạn.
Các thanh ghi đoạn 16 bit này chỉ ra địa chỉ đầu của bốn đoạn trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ này là 64 Kbyte và tại một thời điểm nhất định bộ vi xử lý chỉ làm việc được với bốn đoạn nhớ 64 Kbyte này. Việc thay đổi giá trị của các thanh ghi đoạn làm cho các đoạn có thể dịch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vì vậy các đoạn này có thể nằm cách nhau khi thông tin cần lưu trong chúng đòi hỏi dung lượng đủ 64 Kbyte hoặc cũng có thể nằm trùm nhau do có những đoạn không cần dùng hết đoạn dài 64 Kbyte và vì vậy những đoạn khác có thể bắt đầu nối tiếp ngay sau đó. Điều này cũng cho phép ta truy nhập vào bất kỳ đoạn nhớ ( 64 Kbyte ) nào nằm trong toàn bộ không gian 1 Kbyte.Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô nhớ nằm ở đầu đoạn. Địa chỉ này còn gọi là địa chỉ cơ sở. Địa chỉ của các ô nhớ khác nằm trong đoạn tính được bằng cách cộng thêm vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch hay độ lệch ( Offset ), gọi như thế vì nó ứng với khoảng lệch của toạ độ một ô nhớ cụ thể nào đó so với ô đầu đoạn.
Độ lệch này được xác định bởi các thanh ghi 16 bit khác đóng vai trò thanh ghi lệch( Offset register ). để xác định địa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kỳ. CPU 8088 phải dùng đến 2 thanh ghi 16 bit ( một thanh ghi để chứa địa chỉ cơ sở, còn thanh kia chứa độ lệch ) và từ nội dung của cặp thanh ghi đótạo ra địa chỉ vật lý theo công thức sau:
Địachỉvậtlý=Thanhghiđoanx16+Thanhghilệch
Việc dùng 2 thanh ghi để ghi nhớ thông tin về địa chỉ thực chất để tạo ra một loại địa chỉ gọi là địa chỉ logic và được ký hiệu như sau:
Thanhghiđoạn: Thanhghilệch hay segment: offset.
Câu 10 Viết chương trình nhập một chuỗi ký tự từ bàn phím, sau đó xuất đảo chuỗi ra màn hình tại vị trí dòng 5 cột 20, nền xanh chữ vàng (Xuất ra màn hình ở chế độ Text 80x25x16 màu).
.Model Small
.Stack
.Data
s1 db 'Nhap vao mot chuoi khong qua 100 ki tu:$'
s2 db 13,10,'Chuoi dao vua nhap co nen xanh chu vang tai dong 20 cot 5.$'
buf db 100,?, 101 dup('$')
.Code
Inchuoi Macro t
Lea dx,t
Mov ah,09h
Int 21h
EndM
Begin:
Mov ax,@Data
Mov ds,ax
;Dua ve che do 80x25x16 mau
Mov ah,0
Mov al,3
Int 10h
Inchuoi s1
Lea dx,buf ;Nhap vao mot chuoi
Mov ah,0Ah
Int 21h
Inchuoi s2
Mov ax,0B800h ;Nap dia chi segment cua Video-Ram o che do van ban
Mov es,ax
Lea si,buf+1
Mov di,(80*20+5)*2 ;hang 20 cot 5
Mov ch,0
Mov cl,[si] ;Lay chieu dai chuoi de lap
Inc si
Lap:
Mov al,[si] ;al chua ki tu can xuat
Mov ah,1Eh ;nen xanh duong chu vang
Mov Es:[di],ax
add di,2
inc si
Loop Lap
Mov ah,4ch ;Thoat khoi chuong trinh tro ve Dos
Int 21h
End Begin
Câu 11 Cho 1 chuỗi S dài 10 byte. Viết chương trình nhập 2 chuỗi S1 và S2 mỗi chuỗi gồm 5 ký tự.
.Model Small
.Stack
.Data
S db 13,10,"Ket qua:$"
S1 db 13,10,'Nhap chuoi thu 1:$'
S2 db 13,10,'Nhap chuoi thu 2:$'
Buf Db 11 dup('$')
Buf1 db 6,?,7 dup('$')
Buf2 db 6,?,7 dup('$')
.Code
Begin:
Mov Ax,@Data
Mov Ds,Ax
;Xuat Chuoi S1 Ra Man Hinh
Mov Dx,Offset S1
Mov Ah,09
Int 21h
;Nhap chuoi Buf1
Mov dx,offset Buf1
Mov ah,0ah
Int 21h
;Xuat Chuoi S2 Ra Man Hinh
Mov Dx,Offset S2
Mov Ah,09
Int 21h
;Nhap chuoi Buf2
Mov dx,offset Buf2
Mov ah,0ah
Int 21h
Lea si,Buf1+2
Lea di,Buf
Mov al,[si]
Mov [di],al
Mov al,[si+1]
Mov [di+2],al
Mov al,[si+2]
Mov [di+4],al
Mov al,[si+3]
Mov [di+6],al
Mov al,[si+4]
Mov [di+8],al
Lea si,Buf2+2
Mov al,[si]
Mov [di+1],al
Mov al,[si+1]
Mov [di+3],al
Mov al,[si+2]
Mov [di+5],al
Mov al,[si+3]
Mov [di+7],al
Mov al,[si+4]
Mov [di+9],al
;Xuat Chuoi S Ra Man Hinh
Mov Dx,Offset S
Mov Ah,09
Int 21h
;Xuat Chuoi Buf Ra Man Hinh
Mov Dx,Offset Buf
Mov Ah,09
Int 21h
;Thoat khoi chuong trinh va tro va Dos
Mov Ax,4c00h
Int 21h
End Begin
Câu 12 Viết chương trình bật tất cả 3 đèn Scroll Lock, Num Lock, Caps Lock lên 1 giây rồi tắt.
Viết chương trình có các chức năng sau:
Nhấn phím Ctrl+Shift+F1 bật đèn Num Lock lên 1s rồi tắt.
Nhấn phím Ctrl+Shift+F2 bật đèn Scroll Lock lên 1s rồi tắt.
Nhấn phím Ctrl+Shift+F3 bật đèn Num Lock lên 1s rồi tắt.
Nhấn phím Ctrl+Shift+F4 thoát khỏi chương trình.
.Model Small
.Stack
.Data
s1 db 13,10,'Bat den$'
s2 db 13,10,'Tat den$'
.Code
Begin:
mov ax,@data
mov ds,ax
mov al,0edh
Call SendKb
mov al,00000111b
Call SendKb
mov ah,09
lea dx,s1
int 21h
Call Wait1s
mov al,0edh
Call SendKb
mov al,00000000b
Call SendKb
mov ah,09
lea dx,s2
int 21h
mov ax,4c00h
int 21h
SendKb Proc
push ax
push cx
mov ah,al
mov al,0adh
out 64h,al
mov cx,65535
Waitnotfull:
in al,64h
test al,00000010b
loopnz Waitnotfull
mov al,ah
out 60h,al
mov cx,65535
w:
loop w
mov al,0aeh
out 64h,al
pop cx
pop ax
SendKb EndP
Wait1s Proc
push ax
push cx
push dx
mov ah,86h
mov cx,15
mov dx,16960
int 15h
pop dx
pop cx
pop ax
Wait1s endp
End Begin
Câu 13 Viết chương trình cho dòng chữ 'Khoa CNTT Hoc vien BCVT’ chạy ngang qua màn hình từ trái qua phải (từ phải qua trái) và kết thúc khi có một phím bất kỳ được ấn.
.Model Small
.Stack
.Data
s db 'Khoa CNTT Hoc vien BCVT’
.Code
Begin:
Mov ax,@Data
Mov ds,ax
;Dua ve che do 80x25x16 mau
Mov ah,0
Mov al,3
Int 10h
Mov ax,0B800h ;Nap dia chi segment cua Video-Ram o che do van ban
Mov es,ax
Mov di,(80*10)*2 ;hang 10 cot 0
Mov bx,di ;bx giu vi tri cua di
Chay:
Lea si,s ; lay dia chi offset cua s
Mov cx,25 ;lap lai cho den den chieu dai cua chuoi (25 lan)
Mov di,bx
push bx
Mov al,32 ;al chua ki tu khoang trang
Mov ah,0 ;nen den chu den
cmp di,(80*10)*2 ;So sanh de xoa bo phan tu dau hoac cuoi
je Xoa
Mov Es:[di-2],ax ;Xoa ki tu truoc chuoi
jmp Lap
Xoa:
Mov Es:[(80*10+79)*2],ax ;Xoa ki tu cuoi (tai cot 79)
Lap:
Mov al,[si] ;al chua ki tu can xuat
Mov ah,2Eh ;nen xanh chu vang
Mov Es:[di],ax
add di,2
cmp di,(80*10+80)*2 ;so sanh de xuat ki tu ngay dau dong
jb KDaudong1
Mov di,(80*10)*2 ;Xuat lai ki tu ngay dau dong
KDaudong1:
inc si
Loop Lap
pop bx
add bx,2 ;Xuat lai chuoi o vi tri ke tiep
cmp bx,(80*10+80)*2 ;So sanh de xuat lai ngay dau dong
jb KDaudong2
Mov bx,(80*10)*2
KDaudong2:
call Delay ;Cho chuoi chay cham lai
Mov ah,1 ; Doc cho den khi vung dem ban phim khac rong
Int 16h
jz Chay
Mov ah,4ch ;Thoat khoi chuong trinh tro ve Dos
Int 21h
Delay Proc
push cx
mov cx,0ffffh
for1:
push cx
mov cx,05ffh
for2:
loop for2
pop cx
loop for1
pop cx
Ret
Delay EndP
End Begin
14. Trình bày các thanh ghi đa năng: AX, BX,CX và DX
- AX (Accumulator) thanh chứa: các kết quả của các phép toán thường được lưu vào
thanh ghi này. Ngoài ra, AX còn là toán hạng ẩn cho 1 số phép toán như nhân (AX là
thừa số) hoặc chia (AX là số bị chia).
- BX (Base) thanh ghi cơ sở: thường được dùng để chứa các địa chỉ cơ sở.
- CX (Count) bộ đếm: CX thường dung để chứa số lần lặp trong trường hợp dùng lệnh LOOP. Ngoài ra, CL còn chứa số lần dịch chuyển, quay trái, quay phải của các toán hạng.
- DX (Data) thanh ghi dữ liệu: DX thường được chứa địa chỉ offset của xâu kí tự khi có các thao tác nhập vào xâu hoặc in xâu. DX (cùng với AX) còn tham gia chứa kết quả của phép nhân các số 16 bit hoặc làm số bị chia cho phép chia các số 16 bit. Ngoài ra, DX còn dùng để chứa địa chỉ của các cổng vào/ra trong trường hợp thực hiện các lệnh IN hoặc OUT.
15.Viết chương trình nhập 1 chuỗi tối đa 10 ký tự từ bàn phím. Hiển thị ký tự đầu và ký tự cuối của chuỗi ra màn hình
.Model Small
.Stack
.Data
S db 'Nhap vao mot chuoi khong qua 10 ky tu:$'
S1 db 13,10,'Ky tu dau:$'
S2 db 13,10,'Ky tu cuoi:$'
Buf Db 11,?,12 dup('$')
.Code
Begin:
Mov Ax,@Data
Mov Ds,Ax
;Xuat Chuoi S Ra Man Hinh
Mov Dx,Offset S
Mov Ah,09
Int 21h
;Nhap mot chuoi ky tu
Mov dx,offset Buf
Mov ah,0ah
Int 21h
Lea si,Buf+1
xor cx,cx
Mov cl,[si] ; Lay chieu ddai thuc su cua chuoi
;Xuat Chuoi S1 Ra Man Hinh
Mov Dx,Offset S1
Mov Ah,09
Int 21h
;Xuat ky tu dau
Mov ah,2
Mov dl,[si+1]
Int 21h
;Xuat Chuoi S2 Ra Man Hinh
Mov Dx,Offset S2
Mov Ah,09
Int 21h
;Xuat ky tu cuoi
Add si,cx
Mov ah,2
Mov dl,[si]
Int 21h
;Thoat khoi chuong trinh va tro va Dos
Mov Ax,4c00h
Int 21h
End Begin
Câu 16 Viết chương trình nhập vào từ bàn phím một số nguyên dương một chữ số. Xuống dòng, xuất ra màn hình một tam giác được tạo thành từ các ký tự *, có chiều cao là số vừa nhập vào.
.MODEL SMALL
.stack 100h
.data
x db ?
CRLF DB 13,10,'$'
Mes1 Db 'Nhap vao so nguyen duong: $'
Mes2 Db 'Tam giac: $'
Mes3 DB '*$'
.code
START:
mov AX,@Data
mov DS,AX
;Nhap chieu cao
mov ah,9h
lea dx,CRLF
int 21H
lea DX,Mes1
mov ah, 9h
int 21h
mov ah, 1h
int 21h
and al,0fh
xor cx,cx
mov cl,al
mov x,cl
;Xuat hinh tam giac
mov ah,9h
lea dx,CRLF
int 21H
lea DX,Mes2
mov ah, 9h
int 21h
TAMGIAC:
mov ah,9h
lea dx,CRLF
int 21H
lea DX,Mes3
mov ah, 2h
int 21h
loop tamgiac
;Thoat ve DOS
mov ah,4CH
int 21H
END START
Bạn đang đọc truyện trên: AzTruyen.Top