You are on page 1of 28

Bài 1: Viết chương trình hợp ngữ dạng .

EXE thực hiện nhập vào từ bàn phím một ký tự, nếu không
phải là ký tự số thì nhập lại. Sau đó nhiển thị ký tự vừa nhập trên dòng tiếp theo.
.MODEL SMALL

.STACK 100h

.DATA
MoiNhap DB 'Nhap mot ky tu so n = ' , '$'
KoLaChuSo DB 'Ko phai , hay nhap lai ' , 13,10, '$'
LaChuSo DB 'Dung roi, so vua nhap la ' , 13,10, '$'

.CODE
MOV AX, @Data ; Dua cac du lieu
MOV DS, AX ; vao phan doan du lieu
NhapKyTu:
MOV DX, OFFSET MoiNhap ; Xuat mot chuoi tro boi DX
MOV AH, 9 ; bang chuc nang thu 9
INT 21h ; cua ngat 21h DOS
MOV AH, 1 ; Nhap mot ky tu vao AL
INT 21h ; bang chuc nang 1 cua ngat 21h DOS
CMP AL, '0' ; Kiem tra co phai chu so hay ko
JB KyTuKhac
CMP AL, '9'
JA KyTuKhac
ChuSo:
MOV DX, OFFSET LaChuSo
MOV AH, 9
INT 21h
JMP XuatKyTu
KyTuKhac:
MOV DX, OFFSET KoLaChuSo
MOV AH, 9
INT 21h
JMP NhapKyTu
XuatKyTu:
MOV AH, 2 ; Xuat mot ky tu bang
INT 21h ; chuc nang 2 cua ngat 21h DOS
MOV AH, 4Ch ; Ket thuc chuong trinh va tra
INT 21h ; ve DOS bang chuc nang 4Ch
END

BÀI TẬP ASSEMBLER


1. Xác định địa chỉ offset của các ô nhớ có địa chỉ vật lý sau, biết rằng địa chỉ
segment là 1ACDh:
a. 1FFFFh b. 20000h c. 2ABCDh d. 1ECDFh
2. Xác định địa chỉ vật lý của các địa chỉ sau:
a. 1234h:1234h b. 1111h:ABCDh c. AAAAh:BBBBh
3. Xác định nội dung của các thanh ghi AX, BX và các ô nhớ 1000h, 1001h, 1002h,
1003h sau khi thực thi các đoạn chương trình sau:
a. MOV AX,1000h
MOV BL,7
MOV BH,0F0h
AND BH,AH
MOV WORD PTR DS:[1000h],0F0h
MOV BYTE PTR DS:[1002h],0Fh
MOV AX,DS:[1001h]
MOV AL,DS:[1002h]
b. MOV AX,1234h
MOV BX,0AAAAh
MOV CH,AL
MOV CL,AH
MOV DS:[1000h],AX
MOV DS:[1002h],BX
c. MOV AX,12h
MOV DS:[1001h],AX
MOV BX,AX
ADD BH,10h
MOV DS:[1002h],BH
4. Viết chương trình xuất 10 chuỗi “Hello” ra màn hình tại dòng thứ 10, cột 10.
5. Viết chương trình nhập chuỗi từ bàn phím cho đến khi nhập ký tự ‘T’ thì xuất chuỗi
nhập ra màn hình và kết thúc chương trình.
6. Viết chương trình thực hiện chuyển đổi một chuỗi ký tự trong bộ nhớ từ chữ
thường thành chữ hoa và in chuỗi đã chuyển đổi lên màn hình.
7. Viết chương trình thực hiện in các ký tự chứa tại ô nhớ 1000h – 3000h theo thứ tự
ngược lại.
8. Viết chương trình thực hiện chuyển đổi số nhị phân chứa trong thanh ghi DX thành
số BCD chứa trong thanh ghi AX. Nếu kết quả chuyển đổi lớn hơn 16 bit thì giá trị
trong thanh ghi AX là FFFFh.
9. Viết chương trình so sánh 2 arrray 8 bit A và B, mỗi array có 100 phần tử chứa từ
địa chỉ 1000h (array A) và 2000h (array B). Nếu 2 array này giống nhau thì lưu vào
ô nhớ 3000h giá trị FFFFh. Ngược lại thì lưu vào ô nhớ 3000h địa chỉ đầu tiên của
phần tử trong array A khác với phần tử trong array B.

Bài 1: In ra màn hình 255 ký tự mở rộng có trong bảng mã ASCII


Giải
code segment
assume cs:code, ds:code
org 100h
begin:
mov cx, 255
mov al,0
lap:
mov ah,2
mov dl,al
inc dl
int 21h
loop lap
mov ax, 4c00h
int 21h
code ends
end begin
Bài 2: Nhập ký tự từ bàn phím nếu gặp phím ESC có mã là "27" thì thoát khỏi
chương trình.
Giải

code segment
assume cs:code, ds:code
org 100h
begin:
mov ah,1
int 21h
cmp al,27 ;so sanh ky tu nhap vao voi ky tu 27 la ma ESC
je thoat ;neu la ma ESC thi thoat khoi chuong trinh
jmp begin ;neu khac ma ESC thi quay lai tu dau
thoat:
mov ax, 4c00h
int 21h
code ends
end begin

Bài 3: Viết chương trình nhập vào từ bàn phím nếu ký tự không nằm trong
khoảng từ "A" lớn đến "Z" lớn thì thoát khỏi chương trình.
Giải

code segment
assume cs:code, ds:code
org 100h
begin:
mov ah,1
int 21h
mov bl,al
cmp bl,'A';so sanh A lon den Z lon
jb thoat ;neu khac khoang A lon den Z lon
cmp bl,'Z';thi thoat khoi chuong trinh
ja thoat
jmp begin
thoat:
mov ax, 4c00h
int 21h
code ends
end begin

Bài 4: Viết chương trình in ra hình trái tim mầu đỏ nền đen ở tâm màn hình.
Giải:

code segment
assume cs:code, ds:code
org 100h
begin:
mov ax, 0b800h
mov ds, ax
mov al,3
mov ah,00000100b
d=12
c=40
mov si,(d*80+c)*2
mov [si],ax
mov ax, 4c00h
int 21h
code ends
end begin

Bài 5: Viết chương trình in ra màn hình trái tim mầu đỏ nền đen và dùng các
phím (t,r,,u,d) để điều khiển trái tim dịch sang(trái, phải, trên, dưới)
Giải:

code segment
assume cs:code, ds:code
org 100h
begin:
mov ax, 0b800h
mov ds, ax
mov al,3
mov ah,00000100b
d=12
c=40
mov si,(d*80+c)*2
mov [si],ax

lap:
mov ah,7 ;nhap ky tu tu ban phim khong hien len man hinh
int 21h
cmp al,'l';so sanh neu dung thi thuc hien lenh trai
je trai
cmp al,'r'
je phai
cmp al,'u'
je tren
cmp al,'d'
je duoi
jmp thoat

trai:
mov al,3
mov ah,4
mov [si],0720h ;xoa ky tu vua dich chuyen
sub si,2
mov [si],ax
jmp lap

phai:
mov al,3
mov ah,4
mov [si],0720h ;xoa ky tu vua dich chuyen
add si,2
mov [si],ax
jmp lap

tren:
mov al,3
mov ah,4
mov [si],0720h ;xoa ky tu vua dich chuyen
sub si,160
mov [si],ax
jmp lap

duoi:
mov al,3
mov ah,4
mov [si],0720h ;xoa ky tu vua dich chuyen
add si,160
mov [si],ax
jmp lap

thoat:
mov ax, 4c00h
int 21h
code ends
end begin

Bài 6: Viết chương trình hiển thị dòng chữ "KHOA TIN HOC" có mầu đỏ nền
đen rồi xuống dòng và đảo ngược dòng chữ đó.
Giải

code segment
assume cs:code,ds:code
org 100h
begin:
mov ax,0b800h
mov ds,ax
d=5
c=10
mov al,'K'
mov ah,65
mov di,(d*80+c)*2
mov [di],ax
mov al,'H'
mov ah,58
mov[di+2],ax

mov al,'O'
mov ah,24
mov[di+4],ax

mov al,'A'
mov ah,30
mov[di+6],ax
mov al,' '
mov ah,00
mov[di+8],ax
mov al,'T'
mov ah,65
mov[di+10],ax

mov al,'I'
mov ah,40
mov[di+12],ax

mov al,'N'
mov ah,12
mov[di+14],ax
mov ah,1
int 21h
d=5
c=10
push[di]
push[di+2]
push[di+4]
push[di+6]

push[di+8]
push[di+10]
push[di+12]
push[di+14]
d=6
c=10
mov si,(d*80+c)*2
pop[si]
pop[si+2]
pop[si+4]
pop[si+6]
pop[si+8]
pop[si+10]
pop[si+12]
pop[si+14]

mov ax,4c00h
int 21h
code ends
end begin

viết chương trình nhập vào một chuỗi--> in ra chuỗi vừa nhập dưới dạng 1 ký tự
trên 1 dòng.

;chuong trinh nhap vao mot chuoi, hien thi theo hang doc
.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
stosb
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

Interupt:(ngắt):
int 10h :Ngắt làm việc của bios về màn hình
int 11h : Bios về cấu hình
int 13h :Bios về ổ đĩa
int 14h : Bios về giao diện cổng nối tiếp
int 16h : Bios liên quan đến bàn phím
int 17h :Máy in
int 19h :Khởi động hệ thống
int 20h :Ngắt của Dos kết thúc chương trình trở về hệ điều hành
int 21h :Ngắt cảu Dos chứa các hàm của Dos

Một số hàm sử dụng ngắt int 21h.

;Nhập một ký tự từ bàn phím chứa trong AL


mov ah,1
int 21h
;In ký tự có trong DL
mov ah,2
int 21h
;Nhập một ký tự từ bàn phím không hiển thị lên màn hình
mov ah,7
int 21h
;In chuỗi ký tự khai báo trước
mov ah,9
mov dx,offset db(chuỗi)
int 21h
;Thoát về hệ điều hành
mov ax,4c00h
int 21h

Bảng mầu:
Maøu :
- Ñòa chæ maøn hình maøu : B800 : 0000
- Moãi kyù töï treân maøn hình ñöôïc bieåu dieãn baèng 2 byte
Byte thaáp : chöùa kyù töï caàn in ra
Byte cao : chöùa maøu neàn vaø maøu kyù töï ñoù
Noù ñöôïc ñònh daïng nhö sau :
7 6 5 4321 0

B/I H G B I R G B

B / I : naèm ôû bit thöù 7


H : naèm ôû bit thöù 6
G : naèm ôû bit thöù 5
B : naèm ôû bit thöù 4
H, G ,B : maøu neàn
I : naèm ôû bit thöù 3
R : naèm ôû bit thöù 2
G : naèm ôû bit thöù 1
B : naèm ôû bit 0
I ,R ,G ,B : maøu chöû
I : intensity ( cöôøng ñoä , ñoä saùng ) 0 :toái vaø 1 : saùng
B : blinking ( chôùp nhaùy ) 0 : khoâng nhaùy vaø 1 :nhaùy
Bit 7( B / I ) : vöøa laøm nhieäm vuï cho nhaáp nhaùy chöõ hay taêng
giaûm ñoä saùng cho maøu neàn.

I R G B MAØU I R G B MAØU

0 0 0 0 ñen 1 0 0 0 ñen nhaït

0 0 0 1 xanh 1 0 0 1 da trôøi
döông

0 0 1 0 xanh laù 1 0 1 0 xanh nhaït


caây

0 0 1 1 cyan 1 0 1 1 cyan saùng

0 1 0 0 ñoûû 1 1 0 0 ñoû saùng


0 1 0 1 tím 1 1 0 1 tím caø

0 1 1 0 naâu 1 1 1 0 vaøng

0 1 1 1 xaùm 1 1 1 1 traéng
ñaäm

Caùch nhôùù maøu :

0 1 2 3 4 5 6 7

ñen xanh döông xanh laù caây cyan ñoû tím naâu
xaù
m

- Muoán chöû saùng : coäng theâm soá 8 cho maøu chöû


- Muoán neàn saùng / chöû nhaùy coäng theâm soá 8 cho maøu neàn
COÂNG THÖÙC :

Maøu neàn * 16 + maøu chöõ

Ví duï :
Chöõ A coù maøu xanh döông treân neàn ñoû
A : 65 ñoåi sang heä thaäp phaân laø : 1000000
Ta laáy 1000000 + 1 = 01000001
Trong ñoù 0100 laø neàn ñoû vaø 0001 laø chöû A
maøu
xanh döông .
Coâng thöùc tính ñòa chæ offset cuûa kyù töï caàn xuaát ra
maøn hình

( doøng * 80 + coät) *2

Ví duï :
Vieát chöông trình in chöû A taïi doøng 5
coät 10 coù
maøu xanh döông neàn ñoû
Code segment
Assume CS : code , DS : code
Org 100h
Begin
MOV AX, 0B800h
MOV DS, AX
MOV AL, 'A'
MOV AH, 65
doøng = 5
coät = 10
MOV BX , ( doøng * 80 + coät ) * 2
MOV [ BX ], AX
Code Ends
End Begin
;Viet Chuong trinh nhap vao 1 chuoi ki tu thuong in ra chuoi ki tu hoa

.MODEL SMALL
.STACK 100H
.DATA
A DB "MOI NHAP : $"
B DB 13,10,"XUAT : $"
C DB 40,?,40 DUP(?)
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9
LEA DX,A
INT 21H
MOV AH,0AH
INT 21H
LEA DX,B
MOV AH,9
INT 21H
MOV CL,C[1]
MOV CH,0
MOV BX,2
HOA:
MOV AL,C[BX]
JL INRA
CMP AL,'Z'
JG INRA
AND AL,0DFH
INRA:
MOV AH,2
MOV DL,AL
INT 21H
ADD BX,1
LOOP HOA
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
1.Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào từ bàn phím một ký tự,
nếu không phải là ký tự số thì nhập lại. Sau đó hiển thị ký tự vừa nhập trên dòng
tiếp theo.

Bài 1:

.model small
.stack 100h
.Data
Msg1 db 'Nhap vao mot ki tu la so:$'
Msg2 db 'Ki tu vua nhap khong phai la so, moi ban nhap lai:$'
Msg3 db 'So ban vua nhap la:$'

.Code
Main Proc
Mov ax,@Data
Mov ds,ax
Mov ah,9
Lea dx,Msg1
int 21h
Mov ah,1
Int 21h
jmp tiep
Nhaplai:
Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Mov ah,9
Lea dx,Msg2
int 21h

Mov ah,1
Int 21h

tiep:
cmp al,'0'
jl Nhaplai
cmp al,'9'
Jg Nhaplai
Mov bl,al

Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Mov ah,9
Lea dx,Msg3
Int 21h

Mov ah,2
Mov dl,bl
Int 21h

Mov ah,4ch
Int 21h
Main Endp
End Main

2.Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào từ bàn phím 2 ký tự trong
đó phải có 1 ký tự là số, 1 ký tự là chữ in thường.

Bài 2:

.model small
.stack 100h
.Data
s db 'Nhap vao mot ki tu la so:$'
s1 db 'Ki tu vua nhap khong phai la so, moi ban nhap lai:$'
s2 db 'So ban vua nhap la:$'
s3 db 'Nhap vao mot chu in thuong:$'
s4 db 'Nhap sai, xin nhap lai:$'
s5 db 'Chu ban vua nhap:$'

.Code
Main Proc
Mov ax,@Data
Mov ds,ax
Mov ah,9
Lea dx,s
int 21h
Mov ah,1
Int 21h
jmp tiep

Nhapso:
Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h
Mov ah,9
Lea dx,s1
int 21h

Mov ah,1
Int 21h

tiep:
cmp al,'0'
jb Nhapso
cmp al,'9'
Ja Nhapso
Mov bl,al

Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Mov ah,9
Lea dx,s2
Int 21h

Mov ah,2
Mov dl,bl
Int 21h

Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Xor bl,bl

Mov ah,9
Lea dx,s3
int 21h
Mov ah,1
Int 21h
jmp tiep1

Nhapchu:
Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Mov ah,9
Lea dx,s4
int 21h

Mov ah,1
Int 21h

tiep1:
cmp al,'a'
jb Nhapchu
cmp al,'z'
Ja Nhapchu
Mov bl,al

Mov ah,2
Mov dl,0DH
int 21h
Mov dl,0AH
int 21h

Mov ah,9
Lea dx,s5
Int 21h

Mov ah,2
Mov dl,bl
Int 21h

Call VEDOS

Main Endp
VEDOS Proc
Mov ah,4ch
Int 21h
VEDOS Endp
End main

viết chương trình nhập vào số hệ thập lục phân chuyển thành nhị phân in ra màn
hình
.model small
.stack 100
.data
CRLF db 13,10,'$'
chao db 'Nhap vao so hexa: $'
ketqua db 'So nhi phan tuong ung la: $'
loi db 'So ban nhap khong phai hexa $'
sohexa db 100 dup(0)
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 9
lea dx, chao
int 21h
mov si, offset sohexa
mov di, 0
dockitu:
mov ah, 1
int 21h
cmp al,13
jnz luukitu
jnz dockitu
jz xulychuoi
luukitu:
mov [si], al
inc si
inc di
jmp dockitu
xulychuoi:
;kiem tra chuoi co hop le
mov si, offset sohexa
;goi ham taohexa, chuoi nam o SI, do dai chuoi nam trong CX
mov cx, di
call taohexa

mov ah, 9
lea dx, CRLF
int 21h
lea dx, ketqua
int 21h
mov si, offset sohexa
dodaichuoi:
mov al, [si]
mov cx,4
lap:
push ax
and al, 8h
cmp al, 8h
jne conlai
mov dl, 31h
jmp ketif
conlai:
mov dl, 30h
ketif:
mov ah, 2
int 21h
pop ax
shl al, 1
loop lap

inc si
dec di
jnz dodaichuoi

;thoat khoi dos


mov ah, 4ch
int 21h
main endp

taohexa proc
push ax
push bx
push cx
push dx
jmp lap
gaploi:
mov ah, 9
lea dx, loi
int 21h

mov ah, 4ch


int 21h
mov ah,[si]
cmp ah, 30h
jb gaploi
cmp ah, 39h
ja kiemtrahex
mov al, 30h
jmp luuhex

kiemtrahex:
cmp ah, 61h
jb gaploi
cmp ah, 66h
ja gaploi
mov al, 57h
luuhex:
sub ah, al
mov [si], ah
inc si
loop lap

pop dx
pop cx
pop bx
pop ax
ret
taohexa endp
end main

.model small
.stack
.data
msg db 'Nhap so n = $'
n db ?
kq db 13,10,'Ket qua la: $'
coso dw 0ah
.code
main proc
mov ax,@data
mov ds,ax
mov ax,02h
int 10h

lea dx,msg ;in ra 'Nhap so n = '


mov ah,9
int 21h

mov ah,1 ;nhap so


int 21h
and al,0fh ;chuyen thanh so
mov n,al ;luu vao n

;Tinh toan BX
xor bx,bx ;lam sach thanh ghi
xor dx,dx

xor ah,ah ;ah=0 de gan ax cho dx


mov dx,ax ;lay dx lam bien trung gian
lap:
cmp dx,0ah ;so sanh DX voi 10
je thoat
inc dx ;tang dx len 1
add bx,dx ;cong don vao bx
jmp lap
;In ra man hinh
thoat:
mov ax,bx
xor cx,cx
dayvaostack:
Xor dx,dx
div coso
push dx
inc cx
cmp ax,0
jne dayvaostack

lea dx,kq
mov ah,9
7. Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào từ bàn phím 1 số tự
nhiên N (N <10), tính tổng các số nguyên từ N đến 10 và lưu kết quả vào thanh ghi
BX.

int 21h
print:
pop dx
or dl,30h
mov ah,2
int 21h
loop print

mov ah,4ch
int 21h
main endp
end

10. Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào một số tự nhiên N<8,
tính N! và lưu kết;nhap vao so n<8

;tinh giai thua n


;luu vao bx in ra man
.model small
.stack
.data
msg db 'Nhap vao mot so n<8 :$'
n db ?
msg2 db 13,10,'Ban vua nhap sai. Nhap lai$'
xuongdong db 13,10,'$'
msg3 db 13,10,'Ket qua la: $'
coso dw 10

.code
main proc
mov ax,@data
mov ds,ax
mov ah,02h
int 10h
;-------------------------------------------------
;Nhap so nho hon 8
lap:
lea dx,msg
mov ah,9
int 21h

mov ah,1
int 21h
and al,0fh
mov n,al

cmp n,8
ja nhaplai
mov dl,2
mov ax,1
jmp tinh
nhaplai:
lea dx,msg2
mov ah,9
int 21h
lea dx,xuongdong
int 21h
jmp lap
;-------------------------------------------------
;Tinh giai thua
tinh:
cmp dl,n
je inramh
mul dl
inc dl
jmp tinh
;in ra hinh
inramh:
xor cx,cx
dayvaostack:
xor dx,dx
div coso
push dx
inc cx
cmp ax,0
jne dayvaostack

lea dx,msg3
mov ah,9
int 21h

print:
pop dx
or dl,30h
mov ah,2
int 21h
loop print

mov ah,4ch
int 21h
main endp
end quả vào BX.

3. Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào 2 số tự nhiên nhỏ hơn
10. Tìm số lớn nhất trong 2 số và in kết quả ra màn hình trên dòng tiếp theo.

.model
.stack
.data
msg db 'Nhap vao mot 2 so nho hon 10',13,10,'$'
msga db 'a= $'
msgb db 13,10,'b= $'
a db ?
msgkq db 13,10,'So lon nhat la: $'
b db ?
.code
main proc
mov ax,@data
mov ds,ax

lea dx,msg
mov ah,9
int 21h

lea dx,msga
mov ah,9
int 21h

mov ah,1
int 21h
and al,0fh
mov a,al

lea dx,msgb
mov ah,9
int 21h

mov ah,1
int 21h
and al,0fh
mov b,al

cmp a,al
jae ab
jbe ba

ab:
lea dx,msgkq
mov ah,9
int 21h

mov dl,'0'
add dl,a
mov ah,2
int 21h

ba:
lea dx,msgkq
mov ah,9
int 21h

mov dl,'0'
add dl,b
mov ah,2
int 21h

mov ah,4ch
int 21h
main endp
end

6. Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào từ bàn phím một chữ cái
in thường ch và in ra các chữ cái in thường từ ch đến ‘z’.

;Viet ct nhap vào tu bàn phím mot chu cái in thuong ch


; in ra các chu cai in thuong tu ch den ‘z’.
.model small
.stack 100h
.data
s1 db 'nhap mot ky tu : $'
msg db 10,13,'$'

.code
main proc
mov ax,@data
mov ds,ax

;nhap mot ky tu
mov ah,9
lea dx,s1
int 21h

mov ah,1
int 21h
;chuyen ky tu vua nhap vao bl
mov bl,al

;xuong dong
mov ah,9
lea dx,msg
int 21h

inkytu:
cmp bl,'z';so sanh xem ky tu vua nhap voi ky tu 'z'
je thoat;neu = thi nhay den thoat
;neu ko = thi in ky tu do
mov ah,2
mov dl,bl
int 21h
inc bl;tang bl len 1 don vi
jmp inkytu
thoat:
mov ah,2
mov dl,'z'
int 21h
mov ah,4ch
int 21h
main endp
end

9. Cho trước 2 chữ cái in hoa ch1 và ch2 (ch1<ch2), viết chương trình hợp ngữ
dạng .EXE thực hiện đếm số chữ cái trong đoạn từ ch1 dến ch2 và lưu kết quả vào
thanh ghi BX.

;cho truoc 2 chu cai in hoa


;viet ct dem so chu cai trong doan tu ch1 den ch2 va luu vao thanh ghi bx
.model small
.stack 100h
.data
s1 db 'nhap mot chu cai: $'
ch1 db ?
ch2 db ?
dem db ?
msg db 10,13,'$'
kq db 'so chu cai trong doan tu ch1 den ch2 la : $'

.code
main proc
mov ax,@data
mov ds,ax

mov ch1,'A';luu ky tu 'A' vao ch1


mov ch2,'E';luu ky tu 'E' vao ch2
;trong doan tu 'A' den 'E' co 3 ky tu la B C D

;xuong dong
mov ah,9
lea dx,msg
int 21h

;in chuoi kq
mov ah,9
lea dx,kq
int 21h

mov al,ch1
mov cl,ch2
mov bx,'0' ;bx luc dau =0
demkytu:
inc al
cmp al,cl
je thoat
inc bx
jmp demkytu
thoat:

mov ah,2
mov dx,bx
int 21h
mov ah,4ch
int 21h
main endp
end

11. Viết chương trình hợp ngữ dạng .EXE thực hiện in dạng biểu diễn nhị phân của
thanh ghi BX.

;Viet chuong trinh in dang bieu dien nhi phan cua thanh ghi BX
.model small
.stack 100h
.data
s1 db 'doc so he 2 (16b) : $'
msg db 10,13,'day so nhi fan vua nhap la: $'
.code
main proc
mov ax,@data
mov ds,ax
xor bx,bx
mov ah,1
tiep:
int 21h
cmp al,13
je thoidoc
and al,0fh ; doi ma ra so
shl bx,1 ;dich trai bx de lay cho luu bit vua nhap
or bl,al ;chen bit vua doc vao bl
jmp tiep
thoidoc:
mov cx,16 ;cx chua so bit cua bx
;xuongdong
mov ah,9
lea dx,msg
int 21h
mov ah,2
print:
xor dl,dl
rol bx,1
adc dl,30h
int 21h
loop print
mov ah,4ch
int 21h
main endp
end

5. Viết chương trình hợp ngữ dạng .EXE thực hiện nhập vào từ bàn phím một chữ cái
in thường ch và in ra các chữ cái in thường từ ‘a’ đến ch.

;Viet ct nhap vào tu bàn phím mot chu cái in thuong ch


; in ra các chu cai in thuong tu 'a' den ch.
.model small
.stack 100h
.data
s1 db 'nhap mot ky tu : $'
msg db 10,13,'$'

.code
main proc
mov ax,@data
mov ds,ax

;nhap mot ky tu
mov ah,9
lea dx,s1
int 21h

mov ah,1
int 21h
;chuyen ky tu vua nhap vao bl
mov bl,al
;cl luc ky tu a
mov cl,'a'

;xuong dong
mov ah,9
lea dx,msg
int 21h

inkytu:
cmp bl,cl;so sanh xem ky tu vua nhap voi ky tu 'a'
je thoat;neu = thi nhay den thoat
;neu ko = thi in ky tu do
mov ah,2
mov dl,cl
int 21h
inc cl;tang cl len 1 don vi
jmp inkytu
thoat:
mov ah,2
mov dl,bl
int 21h
mov ah,4ch
int 21h
main endp
end

gồi suốt buổi chiều giờ mới xong bài 19 Cho một xâu S gồm các chữ cái in thường,
viết chương trình hợp ngữ dạng .EXE tạo ra xâu S1 là xâu chứa các chữ cái in hoa
của xâu S và in xâu S1 ra màn hình.

;nhap mot xau ky tu thuong


;in ra man hinh xau chu hoa
.model small
.stack 100h
.data
msg db 'Nhap vao mot chuoi: $'
msg2 db 13,10,'Chuoi vua nhap la: $'
chuoi db 80 dup('?')

.code
main proc
mov ax,@data
mov ds,ax
mov es,ax
;---------------------------------------------------------
lea dx,msg ;'Nhap vao mot chuoi: '
mov ah,9
int 21h
lea di,chuoi
call nhapchuoi

;---------------------------------------------------------
lea dx,msg2
mov ah,9h
int 21h

lea si,chuoi
call xuatchuoi

;---------------------------------------------------------
mov ah,4ch
int 21h
main endp
nhapchuoi proc
;doc vao mot chuoi ky tu ket thuc bang enter
;bx chua so ky tu doc dc
push di ;DI chua offset cua chuoi
cld ;dinh huong tien de cat
xor bx,bx
mov ah,1 ; chuan bi doc
doctiep:
int 21h
cmp al,13
je thoi: ;neu dung thi thoi ko doc nua
cmp al,8 ;co backspace ko
jne luu
dec di ;lui con tro(di=di-1)
dec bx ;bot mot ky tu
jmp doctiep
luu:
stosb ;cat ky tu
inc bx ;tang so ky tu da doc len 1
jmp doctiep
thoi:
pop di ;lay lai con tro
ret
nhapchuoi endp
xuatchuoi proc
mov cx,bx ;dua so ky tu vao vong lap
for:
lodsb ; chuyen ky tu vao al
mov dl,al ;dua vao dl
mov ah,2 ;hien thi
int 21h
loop for
ret
xuatchuoi endp
end

13. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, viết chương trình hợp ngữ
dạng .EXE kiểm tra số lớn nhất nằm trong thanh ghi nào?

12. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, viết chương trình hợp ngữ
dạng .EXE kiểm tra số nhỏ nhất nằm trong thanh ghi nào?
;cho 2 so tu nhien trong 2 thanh ghi ax bx
;viet ct kiem tra so nho nhat nam trong thanh ghi nao
.model small
.stack 100h
.data
s1 db 'so nho nhat nam trong thanh thanh ghi ax $'
s2 db 'so nho nhat nam trong thanh thanh ghi bx $'
.code
main proc
mov ax,@data
mov ds,ax

mov ax,'8';gia su thanh ghi ax luu gia tri 8


mov bx,'6';gia su thanh ghi ax luu gia tri 6

cmp ax,bx
jb kl1
jmp kl2
kl1:
mov ah,9
lea dx,s1
int 21h

kl2:
mov ah,9
lea dx,s2
int 21h
mov ah,4ch
int 21h
main endp
end

You might also like