Tải bản đầy đủ (.pdf) (28 trang)

tổng hợp bài tập môn học vi xử lý vi điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (811.76 KB, 28 trang )

TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP
KHOA ĐIỆN TỬ
BỘ MÔN TIN HỌC CÔNG NGHIỆP



SÁCH GIAO BÀI TẬP
TÊN HỌC PHẦN: VI XỬ LÝ – VI ĐIỀU KHIỂN
MÃ HỌC PHẦN: TEE408


NGƯỜI BIÊN SOẠN: NGUYỄN TUẤN LINH










Lưu hành nội bộ

2

TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHIỆP
KHOA ĐIỆN TỬ
BỘ MÔN TIN HỌC CÔNG NGHIỆP
o0o




SÁCH GIAO BÀI TẬP
TÊN HỌC PHẦN: VI XỬ LÝ – VI ĐIỀU KHIỂN
MÃ HỌC PHẦN: TEE408



Thái nguyên, ngày …. tháng…. năm 2014
TRƯỞNG BỘ MÔN THCN







NGƯỜI BIÊN SOẠN






NGUYỄN TUÁN LINH







Lưu hành nội bộ
3

CHƯƠNG 1. TỔNG QUAN VỀ VI XỬ LÝ – VI ĐIỀU KHIỂN

1.1. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra nhị phân 1 byte:
112, 21, 32, 45, 92 , 156, 231, 143, 69.
1.2. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra hệ thập lục phân :
41,39,58,91,146, 246, 99,88, 140,177.
1.3. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.4. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập lục phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.5. Hãy chuyển đổi các số thập lục phân sau đây ra thập phân : AF , 20 , A5 , CF , B8 , D9 ,
E5 .
1.6. Hãy chuyển đổi các số thập lục phân sau đây ra nhị phân : AF , 20 , A5 , CF , B8 , D9 , E5
.
1.7. Hãy chuyển đổi các số thực biểu diễn dạng thập phân sau đây ra nhị phân :
112.18 , 21.25 , 32.04, 45.625, 92.40 , 156.2, 231.5 , 143.60 , 69.32
1.8. Hãy chuyển đổi các số thực biểu diễn dạng nhị phân sau đây ra số thập phân:
0101 01100.011 , 0101 1110.0011 , 0101 1100.011 , 0111 0111.1101 , 0101 1110.0111 , 0101
1001.0011
1.9. Hãy chuyển đổi các số thập lục phân lẻ sau đây ra thập phân :
AF.22 , 20.E , A5.2F , CF.04 , B8.9 , D9.E , E5.A
1.10. Đổi các số sau từ hệ thập phân sang hệ nhị phân:
a) 28; b) 89; c) 294
d) 34,5; e) 55,25; f) 46,3125
1.11. Đổi các số sau từ hệ nhị phân sang hệ thập phân:
a) 11001; b) 111001

c) 10111011; d) 10001001
1.12. Biểu diễn các số sau dùng dấu và độ lớn (8 bit):
a) +69; b) +105; c) -28; d) -121
1.13. Biểu diễn các số sau dùng dấu và độ lớn (16 bit):
a) +109; b) +105; c) -98; d) -101
1.14. Biểu diễn các số sau dùng mã bù 2 (8 bit - không dấu):
a) 57; b) 48; c) 98; d) 111
1.15. Biểu diễn các số sau dùng mã bù 2 (8 bit - có dấu):
a) +57; b) +48; c) -98; d) -31
1.16. Biểu diễn các số sau dùng mã bù 2 (16 bit - không dấu):
a) 157; b) 108; c) 128; d) 35
1.17. Biểu diễn các số sau dùng mã bù 2 (16 bit - có dấu):
4

a) 137; b) 119; c) -113; d) -53
1.18. Có các biểu diễn sau (dùng dấu và độ lớn), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1001 1100
c) 0000 0000 1001 0010; d) 1000 0000 0110 1100
1.19. Có các biểu diễn sau (dùng mã bù 2 - không dấu), hãy xác định giá trị:
a) 0100 001 b) 1010 0100
c) 0000 0000 1001 0010; d) 1000 0000 0010 0100
1.20. Có các biểu diễn sau (dùng mã bù 2 - có dấu), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1101 1100
c) 0000 0000 0101 0011; d) 1111 1111 1110 1110
1.21. Cho biết kết quả khi thực hiện trên máy tính các phép cộng sau (8 bit) và giải thích:
a) 56 + 78 (không dấu); b) 121 + 40 (không dấu)
c) 68 + 40 (có dấu) ; d) 67 + (-100) (có dấu)
e) 102 + 88 (có dấu); f) (-80) + (-62) (có dấu)
1.22. Sử dụng thuật toán dời bít của Booth thực hiện các phép nhân sau đây
a) 11*13 ; b) 12*13 ; c) 9*11 ; d) 10*11

1.23. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD :
a) 235 ; b) 647 ; e) 568 f) 729
1.24. Hãy chuyển các số nhị phân BCD ra số thập phân sau đây :
a) 1001 0011 0111 ; 0111 1000 0101 0110 ; 0101 1001 0011 0110
1.25. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD rồi cộng theo nhị phân. Kết
quả chuyển sang số thập phân.
a) 123 + 456 ; 348 +241 ; 532 + 461 ; 255 + 433.

1.26. Tính tổng sau: 4A9Bh + 97A2h

1.27. Đổi các giá trị sau thành byte
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.28. Đổi các giá trị sau thành bit
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.29. Cho các s ố nhị phân sau, hãy xác đị nh giá trị c ủ a chúng n ếu chúng là (i) s ố nhị
phân không dấu; (ii) s ố nhị phân có dấu
a. 0000B
5

b. 0001B
c. 0111B
d. 1000B
e. 1001B
f. 1110B

g. 1111B

1.30. Thực hiện các phép toán sau trên số nhị phân có dấu 8 bit và cho biết kết quả có bị tràn
hay không
a. 15+109
b. 127-64
c. 64+64
d. -32-96

1.31. Xác định độ lớn các vùng không gian bộ nhớ có tầm địa chỉ:
a. 0000H – FFFFH
b. 000000H – FFFFFFH
c. 14000000H – 17FFFFFFH
d. 00000000H – FFFFFFFFH
1.32. Cho kích thước vùng nhớ là 862kB. Địa chỉ bắt đầu là 0, tính địa chỉ kết thúc viết dạng
hexa.


6

CHƯƠNG 2. HỌ VI XỬ LÝ INTEL 80X86

2.1. Giải thích các lệnh sau:
MOV AL,5Bh
MOV BL,0ADh
ADD AL,BL
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.2. Giải thích các lệnh sau:
MOV AX,170Fh
MOV BX,80EBh

ADD AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.3. Giải thích các lệnh sau:
MOV AL,41h
MOV BL,50h
CMP AL,BL
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.4. Giải thích các lệnh sau:
MOV AX,3D85h
MOV BX,2CFEh
CMP AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.5. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn DS và thanh ghi lệch BX với DS=0F35h,
BX=150Dh. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.6. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn CS và thanh ghi lệch IP với CS=4530h,
IP=49A6h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.7. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn ES và thanh ghi lệch DI với ES=1793h,
DI=2004h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.8. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn SS và thanh ghi lệch SP với SS=11080,
SP=2004. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào trong
bộ nhớ.
2.9. Giả sử có một ngăn xếp có địa chỉ đáy là FFFEh.
7


- Hãy giải thích và xác định địa chỉ đỉnh của ngăn xếp sau khi thực hiện đẩy vào các giá trị sau:
05F3h, 4D3Ch,796Ah,418Bh
- Giải thích và xác định địa chỉ đỉnh của ngăn xếp và giá trị của các thanh ghi AX, BX, CX, DX sau
khi thực hiện các lệnh:
POP DX
POP AX
POP BX
POP CX
2.10. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,5729h
MOV BX,922Dh
MOV CX,723Fh
PUSH AX
PUSH BX
PUSH CX
POP AX
POP CX
POP BX
ADD AX,BX
ADD BX,CX
Hãy cho biết giá trị của các thanh ghi AX, BX, CX sau khi thực hiện các lệnh này.
2.11. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,02B5h
MOV CX,5
SHL AX,CX
Hãy cho biết giá trị của thanh ghi AX sau mỗi lần dịch
2.12. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,0446h
MOV CX,4

SHR AX,CX
Hãy cho biết giá trị của thanh ghi AX sau mỗi lần dịch
2.13. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2534
MOV BX,5000
MUL BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.14. Giải thích các lệnh trong đoạn chương trình sau:
MOV AL,7Fh
MOV BL,13h
8

MUL BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.15. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2500
MOV BL,50
DIV BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.16. Giải thích các lệnh trong đoạn chương trình sau:
MOV DX,6400
MOV AX,2000
MOV BX,10000
DIV BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.17. Hãy giải thích và chỉ ra chế độ địa chỉ của các lệnh sau:

a/ MOV AX,058Dh b/ MOV AL,[BX] c/ MOV AX,[BP]+[SI]+0100h d/ MOV
BL,[0653h] e/ MOV AX,[SI]+50 f/ ADD DX,53h[BX][SI]
g/ ADD AL,3Bh[SI] h/ MOV BX,7Ch[BP] i/ SUB AL,BL
j/ AND AX,[BX+10] k/ OR CX,[DI+30h]
2.18. Giải thích các lệnh trong đoạn chương trình sau:
Nhap:
MOV AH,1
INT 21h
CMP AL,41h
JL nhap
CMP AL,5Ah
JG nhap
SUB AL,20h
MOV DL,AL
MOV AH,2
INT 21h
2.19. Thanh ghi AX bằng bao nhiêu sau khi thực hiện những câu lệnh sau.
MOV AX, Array1
INC AX
ADD AH, 1
SUB AX, Array1



9

Array1 DW 10h, 20h
Array2 DW 30h, 40h

2.20. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống

MOV BX, Array2 ;
BX= ….
XCHG AX, BX ;
AX= ….
INC AX ;
AX=….
ADD Array2, Array1 ;
Array2=
SUB AX, Array1 ;
AX=….
SUB BH, BL ;
BX= ….
….
….

Array1 DW AAh, BBh
Array2 DW 01h, 02h


2.21. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
MOV AX, Array1 ;
AX= ….
XCHG Array2, AX ;
AX= ….
DEC AX ;
AX=….
SUB Array2, 2 ;
Array2=
MOV BX, Array2 ;
AX=….

ADD AH, BL ;
AX= ….
….
….

Array1 DW 20h, 10h
Array2 DW 30h, 40h

2.22. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
ADD AX, 0123H ;
AX= ….
PUSH AX ;
POP BX
AX= ….
BX
SUB AX, BX ;
AX=….
SUB Array2, 2 ;
Array2=
MOV BX, Array2 ;
AX=….
ADD AH, BL ;
AX= ….
….
….

Array1 DB 1Fh, 62h
Array2 DB 2Fh, 49h

2.23. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống

ADD AX, 0123H ;
AX= ….
PUSH AX ;
POP BX
AX= ….
BX
SUB AX, BX ;
AX=….
SUB Array2, 2 ;
Array2=
MOV BX, Array2 ;
AX=….
10

ADD AH, BL ;
AX= ….
….
….

Array1 DB 1Fh, 62h
Array2 DB 2Fh, 49h


2.24. Xác định giá trị trong thanh ghi AL và BL sau khi thực hiện xong đoạn chương trình
sau
org 100h
MOV AL, -52
MOV BL, -42
SAR AL, 4
IMUL BL

SAL AL, 2
RCR AL, 1
SAR BL, 5
RET
2.25. Xác định giá trị trong thanh ghi AX và BX sau khi thực hiện xong đoạn chương trình
sau
org 100h
MOV AL, -55
MOV BL, 23
SHR AL, 2
IMUL BL
SAL AL, 2
RCR AL, 1
SHR BL, 4
RCR BL, 2
RET
2.26. Xác định giá trị trong thanh ghi AX và BX sau khi thực hiện xong đoạn chương trình
sau
org 100h
MOV AL, -5
MOV BL, -12
SHR AL, 2
IMUL BL
SAL AL, 2
ADD BL, AL
RCR AL, 1
SHR BL, 4
RCR BL, 2
RET


2.27. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong đoạn
chương trình sau:
org 100h
mov AX, 1122h ;
11

mov BX, 0A3Dh ;
mov CX, 80A1h ;
mov DX, 1357h ;
start:
ADD AL, BL
SUB BL, AL
CMP AL, BL
JA TA1
XOR DX, CX
JMP OK
TA1:OR DX, CX
JMP OK
OK:
ret
2.28. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong đoạn
chương trình sau:

org 100h
mov AX, 1234h;
mov BX, 5678h;
mov CX, 2468h;
mov DX, 1357h;
start:
PUSH AX

PUSH BX
PUSH CX
PUSH DX
ADD AX, BX
DEC CX
POP BX
DIV BL
POP BX
ADD AX, BX
POP CX
INC CX
POP DX
SUB DX, AX
MUL DL
RET

2.29. Sau khi thực hiện đoạn chương trình, thanh ghi BX có giá trị bằng bao nhiêu
org 100h
mov AX,0
Mov BX,0
mov al, 5
mov bl, 10h
add bl, al
xor bl, 55h
12

2.30. Sau khi thực hiện đoạn chương trình, thanh ghi AX có giá trị bằng bao nhiêu ?
org 100h
mov AX,0
Mov BX,0

mov al, 5
mov bl, 10h
add al, bl
xor bl, 55h
2.31. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi BL bằng bao nhiêu ?
2.32. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi AL bằng bao nhiêu ?
2.33. Giả sử cho: AX=1000H; BX=2000H; CX=3000H. Sau khi thực hiện các lệnh:
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
POP CX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.34. Giả sử cho: AX=FF00H; BX=0001H; CX=1000H. Sau khi thực hiện các lệnh:
PUSH CX
PUSH BX
PUSH AX
POP AX
POP BX

POP CX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.35. Giả sử cho: AX=1234H; BX=3456H; DX=1111H. Sau khi thực hiện các lệnh:
MOV AX, CX
PUSH BX
PUSH AX
POP AX
POP BX
POP DX
Cho biết giá trị trong các thanh ghi AX, BX, CX

2.36. Xác định nội dung của các thanh ghi AX, BX và các ô nhớ1000h, 1001h, 1002h, 1003h
13

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
HD: xác định các chế độ địa chỉ được sử dụng trong mỗi ý

2.37. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL>=0x41) && (AL<=0x5A) )
AL=AL+0x20;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.38. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL=0x43) | (AL=0x63) )
printf(chr(AL));
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.39. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
for (AL=100; AL> 0;AL )
AL=AL+50;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.40. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AX=1000;
WHILE (AX > 0) {AX=AX-100;}
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.41. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AL=0x61;
CX=0x1A;
do{
14

AL=AL-0x20;
printf(chr(AL));

CX=CX-1;
while ( CX>0);
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.42. Viết chương trình nhập vào từ bàn phím 1 kí tự. Kiểm tra xem, nếu kí tự đó là chữ cái
hoa hoặc thường thì in ra màn hình.
2.43. Viết chương trình nhập vào từ bàn phím 1 kí tự. In kí tự đó ra toàn màn hình.
2.44. Viết chương trình in ra màn hình các kí tự trong bảng mã ASCII.
2.45. Viết chương trình nhập vào hai số nguyên. In ra màn hình tổng, hiệu, tích, thương của
hai số đó.
2.46. Viết chương trình nhập vào từ bàn phím một mảng. Sắp xếp mảng theo thứ tự tăng dần,
giảm dần.
2.47. Viết chương trình nhập vào một mảng. Tìm min, max của mảng và in ra màn hình.
2.48. Viết chương trình nhập vào một xâu kí tự. In xâu kí tự theo chiều ngược lại.
2.49. Viết chương trình nhập vào một xâu họ và tên. Tách tên và in ra màn hình.
2.50. Viết chương trình nhập vào 3 số thực a,b,c.
Giải và biện luận phương trình bậc 2: ax
2
+ bx +c =0.
2.51. Viết chương trình trong C/C++ thực hiện xóa màn hình, tính tổng, hiệu, tích thương
của hai số nhập vào từ bàn phím (Các thao tác này thực hiện bằng mã lệnh của
ASSEMBLY)
2.52. Viết chương trình liên kết giữa ASSEMBLY và C/C++ thực hiện tìm min, max của
một mảng; sắp xếp mảng.
2.53. Viết các chương trình con thực hiện các thao tác cơ bản (tùy giáo viên ra cụ thể).
2.54. Viết các MACRO thực hiện các thao tác cơ bản (tùy giáo viên ra cụ thể).
2.55. Điền giá trị vào (…) để chương trình thực hiện việc in một chuỗi ký tự màn hình?
MODEL SMALL
.STACK 100h
.DATA
msg ….

.CODE
main PROC
MOV AX,@DATA ;
MOV DS,AX
MOV AX,… ;
INT …
MOV …,02h ;
MOV …,0C15h ;
INT …
LEA DX,… ;
MOV AH,… ;
INT …
MOV AH,4Ch ;
INT 21h
main ENDP
END main
HD: quan tâm đến các ngắt sử dụng trong chương trình
15

2.56. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số nhị
phân.
HD: dựa vào thuật toán đổi một số từ hệ mười sang hệ 2 và sử dụng hàm 01h
của ngắt 21h
2.57. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số thập
phân.
HD: dựa vào thuật toán đổi một số từ hệ 2 sang hệ 10 và sử dụng hàm 01h của
ngắt 21h
2.58. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng số hệ 16.
HD: dựa vào thuật toán: lấy số cần đổi chia cho 10, nếu số dư nhỏ hơn hoặc 9
thì in ra màn hình, còn số dư lớn hơn 9 và nhỏ hoặc bằng 15 thì lấy số dư cộng

với 37H. Sử dụng hàm 01h của ngắt 21h
2.59. *Viết chương trình nhập một số hệ thập phân có 3 chữ số vào thanh ghi đa năng
HD: dựa vào thuật toán: chia số cần chuyển cho 10, lấy số dư chuyển vào thanh
ghi và sử dụng hàm 02h của ngắt 21h để nạp vào thanh ghi
2.60. *Viết chương trình nhập một số hệ nhị phân có 8 chữ số vào thanh ghi AL
HD: sử dụng các lệnh dịch quay
2.61. *Viết chương trình nhập một số hệ hexa có 4 chữ số vào thanh ghi AX
2.62. *Khai báo ba mảng A, B, C kích thước 10 phần tử, mỗi phần tử có kích thước 1 byte,
giá trị khởi tạo tùy ý. Hãy viết chương trình thực hiện C=A+B
2.63. *Viết chương trình nhập một xâu, độ dài 5 ký tự, in ra màn hình xâu đó dưới dạng chữ
hoa.
2.64. 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.
2.65. 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.
2.66. 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.
2.67. Thực hiện nhập vào 2 số tự nhiên nhỏ hơn 10. Tìm số nhỏ nhất trong 2 số và in kết quả
ra màn hình trên dòng tiếp theo.
2.68. 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ữ in thường
từ 'a' đến 'ch'.
2.69. 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ữ in thường
từ 'ch' đến 'z'.
2.70. 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.
2.71. Thực hiện nhập vào từ bàn phím 1 ký tự là chữ cái in hoa, sau đó đếm số lượng bit 1
trong biểu diễn nhị phân mã ASCII của ký tự vừa nhập.
2.72. Cho trước 2 chữ cái in hoa ch1 và ch2 (ch1<ch2), thực hiện đếm số chữ cái trong đoạn
từ ch1 đến ch2 và lưu kết quả vào thanh ghi BX.
2.73. Cho trước 2 chữ thường ch1 và ch2 (ch1<ch2), thực hiện đếm số chữ cái trong đoạn từ

ch1 đến ch2 và lưu kết quả vào thanh ghi BX.
2.74. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, và nhập vào một ký tự ch bất kỳ. Đếm
số lượng ký ch trong chuỗi và lưu kết quả vào AX
2.75. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, đếm số lượng ký tự là chữ cái và nhập
vào AX, số lượng ký tự là số nhập vào thanh ghi BX
16

2.76. Thực hiện nhập vào một số tự nhiên N<8, tính N! và lưu kết quả vào BX.
2.77. Thực hiên in dạng biểu diễn nhị phân của thanh ghi BX.
2.78. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX. kiểm tra số nhỏ nhất nằm trong
thanh ghi nào?
2.79. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra số lớn nhất nằm trong
thanh ghi nào?
2.80. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra hiệu của 2 số, nếu có trị
tuyệt đối nhỏ hơn 10 thì in trị tuyệt đối ra màn hình, ngược lại in kết quả vào thanh ghi
DX.
2.81. Thực hiện nhập một số tự nhiên N (N<65536)vào từ bàn phím và lưu kết quả vào thanh
ghi BX.
2.82. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập phân của số tự nhiên
đó.
2.83. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập lục phân của số tự
nhiên đó.
2.84. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn bát phân của số tự nhiên
đó.
2.85. Cho một xâu S gồm các chữ cái in thường, tạo ra sâ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.
2.86. Cho một xâu ký tự S, tạo ra xâu S1 là xâu đảo ngược của xâu S và in xâu S1 ra màn
hình.
2.87. Cho 2 xâu ký tự S1 và S2, kiểm tra xem S1 và S2 có bằng nhau hay không?
2.88. Cho xâu ký tự S, kiểm tra xem S có phải là xâu đối xứng hay không?

2.89. Cho xâu ký tự S, đếm số ký tự là chữ số có trong S.
2.90. Nhập vào từ bàn phím một xâu ký tự và lưu độ dài của xâu vào thanh ghi BX.
2.91. Cho xâu ký tự S độ dài l, tạo ra xâu S1 từ xâu S bằng cách lấy trong S từ vị trí thứ
i(0<i<l) n ký tự (0<n<l-i).
2.92. Thực hiện nhập một ký tự ch vào từ bàn phím và in ra màn hình 10 dòng, mỗi dòng
chưa 10 kí tự ch.
2.93. Cho xâu ký tự S, thực hiện tạo xâu S1 từ xâu S bằng cách loại bỏ trong xâu S các ký tự
là dấu cách.
2.94. Cho xâu ký tự S, nhập từ bàn phím một ký tự ch và kiểm tra xem ch có trong xâu S hay
không?
2.95. Cho xâu ký tự S, đếm số lượng ký tự 'A' có trong xâu S.
2.96. Cho xâu ký tự S, tính tổng của các ký tự số có trong xâu S và lưu kết quả vào thanh ghi
BX.

17

CHƯƠNG 3. HỌ VI ĐIỀU KHIỂN 8051

3.1. Nếu thanh ghi A được sử dụng để chứa kết quả của các phép toán, hãy cho biết giá trị của
thanh ghi A sau khi thực hiện các phép toán sau:
a. 6Ah+0Fh
b. A8h+CDh
c. 9Ch-5Fh
d. AFh-7Dh
e. 1Fh*EDh
f. 10h*1Fh
3.2. Nếu thanh ghi B được sử dụng để chứa kết quả của các phép toán, hãy cho biết giá trị của
thanh ghi B sau khi thực hiện các phép toán sau:
a. 0110 1010b+1111b
b. 1010 1000b+1100 1101b

c. 1001 1100b-0101 111b
d. 1010 1111b-0111 1101b
e. 0001 1111b*1110 1101b
f. 0001 0000b*0001 1111b
3.3. Nếu thanh ghi Avà B được sử dụng để chứa kết quả của các phép toán, hãy cho biết giá trị
của 2 thanh ghi sau khi thực hiện các phép toán sau:
a. ABh*Fh
b. 10h*1Ah
c. CFh*2Ch
d. 10h*Abh
e. CDE0h/10h
f. 1F2Dh/8Ah
3.4. Cho biết giá trị (ở dạng hexa) của thanh ghi PSW nếu muốn sử dụng
a. Bank 0
b. Bank 1
c. Bank 2
d. Bank 3
Các Bit khác mặc định bằng 0
3.5. Cho biết giá trị (ở dạng hexa) của thanh ghi PSWsau khi thực hiện các phép toán sau
a. FFh+FFh
b. 80h+80h
c. 80h-01h
d. FFh+01h
e. ABh-80H
f. F0H-10h
3.6. Nếu chuyển các giá trị sau đây vào thanh ghi A, thanh ghi PSW có giá trị bằng bao nhiêu
a. A=F0h
b. A=ABh
18


c. A=00h
d. A=FFh
Các bit không chịu ảnh hưởng có giá trị mặc định
3.7. Nếu chuyển các giá trị sau đây vào thanh ghi A, thanh ghi PSW có giá trị bằng bao nhiêu
nếu thanh ghi A chưa kết quả của phép toán
a. A=A9h+1h
b. A=9Ah+1h
c. A=AAh+1
d. A=99H+1
3.8. Cho biết giá trị (ở dạng hexa) của thanh ghi PSWsau khi thực hiện các phép toán sau
a. 7Fh+7Fh
b. 80h-01h
c. 6Ah+80h
d. ABh+CDh
3.9. Nếu gán cho PSW giá trị sau, những bank thanh ghi nào được chọn:
a. PSW=C8H
b. PSW=50H
c. PSW=10H

1. Các chế độ địa chỉ:
3.10. Cho trước bảng sau:
Lệnh 8051
Cách định địa chỉ của toán hạng

Thứ nhất
Thứ hai
ORG 0


MOV R0,#30H



MOV R1,#10


CLR A


MOV R2,A


MOV R3,A


Loop: MOV A,@R0


JB ACC.7,Neg


INC R3


SJMP Cont


Neg: INC R2


Cont:INC R0



DJNZ R1,Loop


SJMP $


END


Điền vào các chỗ trống trong cột các cách địa chỉ cho toán hạng thứ nhất và thứ 2.
3.11. Cho trước bảng sau:
Lệnh 8051
Cách định địa chỉ của toán hạng

Thứ nhất
Thứ hai
ORG 0


19

LJMP Start


ORG 0A80H


Start: MOV SP,#70H



MOV R2,#1CH


MOV A,#28H


MOV R0,#0C7H


PUSH 2


PUSH 0


ADD A, R2


POP 1


ADD A, R1


POP 0


MOV A, R3



ADD A, R0


SJMP $
END


Điền vào các chỗ trống trong cột các cách địa chỉ cho toán hạng thứ nhất và thứ 2.
3.12. Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM tại địa chỉ 40H đến 44H
sử dụng:
a. Chế độ đánh địa chỉ trực tiếp
b. Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp
3.13. Xác định chế độ địa chỉ để cộng nội dung của 2 ô nhớ 30h và 31h, kết quả lưu vào ô
nhớ 32h trong RAM nội
3.14. Xác định chế độ địa chỉ để cộng nội dung của 2 ô nhớ 30h và 31h, kết quả lưu vào
thanh ghi A trong RAM nội
3.15. Xác định chế độ địa chỉ để cộng nội dung của 2 thanh ghi R1 với R2, kết quả ghi vào ô
nhớ 30h
3.16. Xác định chế độ địa chỉ để cộng nội dung của 2 thanh ghi R1 với R2, kết quả ghi vào ô
nhớ 30h
3.17. Nạp giá trị 0FFh vào thanh ghi R1,lấy nội dung trong ô nhớ 35h cộng với nội dung
trong thanh ghi R1, kết quả lưu vào thanh ghi R2. Hãy xác định các chế độ địa chỉ để thực
hiện các thao tác trên
3.18. Nạp giá trị 0ABh vào ô nhớ 34h, nạp giá trị 1Dh thanh ghi R1, cộng nội dung trong ô
nhớ 34h với nội dung trong thanh ghi R1, kết quả lưu vào ô nhớ 30h. Hãy xác định các
chế độ địa chỉ để thực hiện các thao tác trên.
3.19. Câu 18. Địa chỉ của ô nhớ 40h được chứa trong thanh ghi R5, hãy cho biết các chế độ
địa chỉ được sử dụng để cộng nội dung của ô nhớ được lưu trong R5 với nội dung của ô

nhớ 41H. Kết quả byte cao được đưa vào thanh ghi A, byte thấp được chứa trong ô nhớ
42h.
3.20. Cộng nội dung của 5 ô nhớ liên tiếp, biết rằng địa chỉ của ô nhớ đầu tiên được lưu trong
thanh ghi R1 và R1 bằng 42h. Kết quả byte cao được lưu trong ô nhớ 30h, byte thấp lưu
trong 31h. Hãy xác định các chế độ địa chỉ của các thao tác trên
3.21. Hãy cho biết giá trị của các thanh ghi R0, R1, R2 sau khi thực hiện xong đoạn chương
trình dưới đây.
ORG 0000H
MOV DPTR, #200H
CLR A
MOVC A, @A + DPTR
MOV R0, A
20

INC DPTR
CLR A
MOVC A, @A + DPTR
MOV R1, A
INC DPTR
CLR A
MOVC A, @A + DPTR
MOV R2, A
HERE: SJMP HERE
ORG 200H
MYDATA: DB ‘VXL’
END ;
3.22. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh
MOV A,#12
; A











MOV A,#0C4H
; A










MOV R1,#1110B
; R1











ADD A,#11110001B
; A








CY

MOV DPTR,#2000H













3.23. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh

MOV R1,#36H
; R1








MOV A,R1
; A








MOV R7,#0FH
; R7









ANL A,R7
; A








INC A
; A








DEC A
; A









MOV DPTR,#2000









INC DPTR











3.24. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành đoạn chương trình sau:
MOV 30H, #0FEh
MOV R0,#30H
MOV A,@R0


3.25. Write a program to move (write) 40H to location 30H in internal RAM using 2
methods of addressing: direct addressing and indirect addressing.

3.26. Write a program to clear location 31H in internal RAM using 2 methods of addressing:
direct addressing and indirect addressing.
Hint: to clear means to reset the data to zero.
DPH
DPL
















DPH
DPL


























7Fh








R0














































30h



























A



























00h




























21

3.27. Write a program to move (read) the content of location 33H in internal RAM to register
A using 2 methods of addressing: direct addressing and indirect addressing.
3.28. Write a program to move the content of registerA to location 0033H in external RAM.
ORG 0000H
MOV DPTR,#0033H
MOVX @DPTTR,A
END
3.29. Write a program to write 40H to location 0030H in external RAM.
ORG 0000H
MOV A,#40H
MOV DPTR,#0030H
MOVX @DPTR,A
END
3.30. Viết các câu lệnh để xóa ô nhớ31H của RAM nội theo 2 cách
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.31. Viết các câu lệnh để ghi nội dung thanh ghi A vào ô nhớ 32H của RAM nội theo 2
cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.32. Viết các câu lệnh để đọc ô nhớ33H của RAM nội vào thanh ghi A của RAM nội theo 2
cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.

3.33. Viết các câu lệnh để chuyển dữ liệu ô nhớ 34H của RAM nội vào ô nhớ 35H của RAM
nội theo 2 cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.

2. Tập lệnh:
MOV
3.34. Viết chương trình nạp 16 byte trong vùng dữ liệu nội từ địa chỉ 30H voi giá trị là 16h
MOV A,#CONST1
MOV R0,#30H
MOV R1,#16
L1: MOV @R0, A
INC R0
DJNZ R1, L1
3.35. Viết chương trình nạp 32 byte trong vùng dữ liệu ngoại từ địa chỉ 20H với giá trị là 32h
MOV A,#CONST2
MOVDPTR,#20H
22

MOV R1,#32
L2: MOVX @DPTR, A
INC DPTR
DJNZ R1, L2
3.36. Viết chương trình hoán đổi nội dung 2 ô nhớ trong RAM nội cho nhau
MOV R1,#CONST1 ; R1 = 15H
MOV R7,#CONST2 ; R7 = 27H
PUSH 07
PUSH 01
POP 07 ; R7 = 15h
POP 01 ; R1 = 27H

ADD
3.37. Viết đoạn chương trình cộng nội dung thanh ghi A với 19H, cho biết nội dung của
thanh ghi PSW sau khi thực hiện xong đoạn chương trình trên
3.38. Viết đoạn chương trình cộng nội dung thanh ghi A với thanh ghi B (giả sử A=19h,
B=FEh). Cho biết nội dung của thanh ghi PSW sau khi thực hiện xong đoạn chương trình
trên
3.39. Giả sử ô nhớ 20h trong RAM nội có giá trị bằng 25, viết đoạn chương trình để cộng nội
dung trong thanh ghi A với ô nhớ 20H
3.40. Giả sử thanh ghi R0 chứa giá trị là 20h, hãy viết đoạn chương trình để cộng nội dung
của thanh ghi A với ô nhớ có địa chỉ được lưu trong R0
3.41. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 số bắt đầu từ ô nhớ30H. Hãy
viết CT con cộng chuỗi sốnày và ghi kết quảvào ô nhớ2FH (giả sử kết quả nhỏ hơn hoặc
bằng 255)
3.42. Giả sử các ngăn nhớ 40 - 44 của RAM có giá trị sau: 40 = (7D); 41 = (EB); 42 = (C5);
43 = (5B) và 44 = (30). Hãy viết một chương trình tính tổng của các giá trị trên. Cuối
chương trình giá trị thanh ghi A chứa byte thấp và R7 chứa byte cao (các giá trị trên được
cho ở dạng Hex).
3.43. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 sốbắt đầu từô nhớ 30H. Hãy
viết CT con cộng chuỗi số này và ghi kết quảvào ô nhớ 2EH:2FH (ô nhớ 2EH chứa byte
cao của kết quả và ô nhớ 2FH chứa byte thấp của kết quả).
3.44. Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H và 3B8DH. Cất
tổng số vào R7và R6 trong đó R6 chứa byte thấp.

INC/ DEC
3.45. Hãy viết giải thích cho các lệnh sau :
INC A ; A <-A + 1
INC B ; B<-B + 1
MOV R0,#30H
INC @R0 ; Tăng byte với contrỏ R0 lên 1 (30H) = (30H) + 1
INC R0

INC @R0 ; (31H) = (31H) + 1
INC 0 ; 1 cach khac de co R0 <-R0 + 1
INC @R0 ; (32H) = (32H) + 1
INC DPTR
3.46. Hãy viết giải thích cho các lệnh sau :
23

DEC A ; A <-A -1
DEC B; B <-B -1
MOV R0,#30H
DEC @R0 ; Giam o nho duoc chi boi R0 di 1 (30H) = (30H) -1
INC R0
DEC @R0 ; (31H) = (31H) -1
DEC 0; 1 cach khac de co R0 <-R0 -1
DEC @R0 ; (30H) = (30H) -1
rinh sau de giam noi dung DPTR di 1
DEC DPL ; Giam byte thap cua DPTR di 1
MOV R7, DPL ; chép vào R7
CJNE R7, #0FFH, SKIP ; Neu tran duoi thành FF thì phai muon
DEC DPH
MUL/DIV
3.47. Viết đoạn chương trình để thực hiện nhân 2 giá trị 8bit là 2 số của ngày sinh và 2 số
cuối của năm sinh . Cho biết kết quả của các thanh ghi liên quan sau khi thực hiện xong
đoạn chương trình trên
3.48. Viết đoạn chương trình để thực hiện chia 2 giá trị 8bit là 2 số của tháng inh và 2 số cuối
của năm sinh . Cho biết kết quả của các thanh ghi liên quan sau khi thực hiện xong đoạn
chương trình trên

DA
3.49. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện

xong :
a. MOV A,#25h
ADD A,#17h
DA A
b. MOV A,#25h
ADD A,#17h
ADD A,B
DA A
c. MOV A,#25h
ADD R0,#17h
ADD A,R0
DA A
d. MOV 20h,#17h
MOV A,#25h
ADD A,20h
DA A
e. MOV R0,#17h
MOV A,#25h
ADD A,@R0
DA A
Câu 1. Giả sử 5 dữ liệu BCD được lưu trong RAM tại địa chỉ bắt đầu từ 40H như sau:
40 = (71), 41 = (11), 42 = (65), 43 = (59) và 44 = (37). Hãy viết chương trình tính
tổng của tất cả 5 số trên và kết quả phải là dạng BCD.
ANL, ORL, XRL
24

3.50. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện
xong các câu lệnh:
a. MOV A,#15h
ANL A,#3Ah

b. MOV 20H,#24
ANL A,20H
c. MOV A,#3Ah
ANL A,#0FH

3.51. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện
xong các câu lệnh:
a. MOV A,#15h
ORL A,#3Fh
b. MOV A,#15
ORL A,#0F0H

3.52. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện
xong các câu lệnh:
c. MOV A,#15h
XRL A,#3Ah
d. MOV A,#15h
XRL A,#0F0H
MOV A,#3Ah
XRL A,#0FFH
INC A
ROTATE/SWAP
3.53. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực hiện
xong các câu lệnh:
a. MOV A,#0FH
RR A
RR A
b. MOV A,#0FH
RL
RL A

c. MOV A,0FH
SETB C ;
RRC A
d. MOV A0FH
SETB C
RLC A
3.54. Sử dụng lệnh dịch phải để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15
RR A ; A = 1000_0111B = 87H
CLR ACC.7 ; A = 0000_0111B = 07H = 7= 15/2
25

3.55. Sử dụng lệnh dịch phải có nhớ để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM2 ; A = -12 = F4H = 1111_0100B
MOV C,ACC.7 ; C = bit dau cua A
RRC A
3.56. Viết chương trình để thực hiện chia một số không dấu trong A cho 2n (n=1->8)( n
được lưu trước trong thanh ghi R7)
MOV R7,#2
MOV A,#00011111B ; A = 31
CALL DIV2EXPN ; A = 0000_0111B = 7 = 31 div 4
DIV2EXPN: ; Chương trình con chia nguyên không dấu cho 2^n
RR A
CLR ACC.7
DJNZ R7, DIV2EXPn
RET
END
SO SÁNH
3.57. Cho hai số 8 bit, số thứ 1 chứa trong (30H), số thứ 2 chứa trong (31H). Viết CT con so
sánh hai số này. Nếu sốthứ 1 lớn hơn hoặc bằng số thứ 2 thì set cờ F0, nếu ngược lại thì

xóa cờ F0

LẶP (MicroProcessor(HoangChi Thong)\Dap an bai tap VXL 8051 (LCT).pdf)
3.58. Viết CT xóa 20 ô nhớRAM nội có địa chỉbắt đầu là 30H
3.59. Viết CT xóa 250 ô nhớRAM ngoài có địa chỉbắt đầu là 4000H.
3.60. Viết CT xóa các ô nhớRAM nội từ địa chỉ20H đến 7FH
3.61. Viết CT xóa 2500 ô nhớRAM ngoài có địa chỉbắt đầu là 4000H
3.62. Viết CT chuyển một chuỗi dữliệu gồm 10 byte trong RAM nội có địa chỉ đầu là 30H
đến vùng
3.63. RAM nội có địa chỉ đầu là 40H

LỆNH NHẢY CÓ ĐIỀU KIỆN
3.64. Write a program to write 40H to internal RAM from location 30H to location 36H.
3.65. Write a program to clear ACC, then add 3 to the accumulator ten times.
3.66. Write a program to copy a block of 10 bytes from RAM location starting at 37h to
RAM location starting at 59h.
3.67. Cho sơ đồ kết nối, hãy viết chương trình theo yêu cầu theo sơ đồ giải thuật
3.68. Examine the content of A, if 5 ≤ A ≤ 10 then outputA to Port 1; if not, output A to Port
2.
3.69. Given a 20-byte string in internal RAM, starting ataddress 40H. Write a program that
output even numbers to Port 2.

TRỄ
3.70. Viết CT con delay 100µs, biết rằng thạch anh (xtal) dùng trong hệthống là:

×