3.1.Trắc nghiệm
1. d 2. d 3. c 4. a 5. a 6. b 7. b 8. d 9. c 10. b 11. a 12. d 13. d 14. b 15. c 16. c 17. d 18. b 19. b 20. a 21. a 22. d 23. b 24. b 25. b 26. b 27. d 28. b 29. a 30. b 3.2.Tự luận
1. Chương trình hợp ngữ như sau:
.model small .stack 100 .data
msg1 db “Nhap vao mot day so thap phan co gia tri tu 0 den 255, cach nhau boi dau SPACE, ket thuc nhap bang dau ENTER: $”
msg2 db 13,10, “Day so sau khi sap xep tang dan la: $”
msg3 db 13,10,”Nhap sai, hay nhap lai !!!$”
ST db 100dup(‘$’) .code
MAIN PROC
MOV AX, DATA MOX DS, AX MOX AH, 9 LEA DX, MSG1 INT 21H
XOR DI, DI XOR BL, BL NHAP:
MOV AH,1 INT 21H CMP AL, 0DH
; KHOI TAO DS
; Hiển thị MSG1 bằng hàm 9 của ngắt 21h
; Lấyđịa chỉ MSG1 vào DX
; Hiển thị chuỗi MSG1
;Chương trình nhập số từ bàn phím, lưu vào chuỗi ST
; Xóa DI, sử dụng DI để lưu biến đếm
; Xóa BL, sử dụng BL lưu số trước khi cho vào chuỗi ST
; Chương trình nhập số
; Nhập kí tứ
; So sánh kí tự vừa nhập với ENTER (kết thúc chuỗi)
187
JE END_NHAP_0 CMP AL, 30H
JB CHECK_SPACE CMP AL, 39
JA THONG_BAO XOR AH, AH MOV DX, AX SUB DX, 30H MOV CL, BL XOR CH, CH
MOV AL, 10 MUL CL
MOV CX, AX ADD
CX, DX CMP
CX, 256 JNB
THONG_BAO
MOV BL, CL JMP NHAP CHECK_SPACE:
CMP AL, 20H JE LUU THONG_BAO:
MOV AH, 9 LEA DX, MSG3 INT 21H
JMP NHAP LUU:
MOV ST[DI], BL INC DI
CMP DI,100 JNB END_NHAP_1
XOR BL, BL JMP NHAP END_NHAP_0:
MOV ST[DI], BL JMP LUU_KT END_NHAP_1:
DEC DI LUU_KT:
MOV CX, DI XOR DI, DI
; Nếu đúng thì dừng nhập
; So sánh kí tự vừa nhập với ‘0’
; Nếu nhỏ hơn thì nhảy đến chương trình kiểm tra SPACE
; So sánh kí tự vừa nhập với ‘0’
; Nếu lớn hơn nhảy đến thông báo nhập sai
;Xóa AH để AX=AL
; Chuyển mã ASCII kí tự vừa nhập vào DX
; DX lưu giá trị nhị phân của số vừa nhập
;Chuyển giá trị trong BL vào CLđể thao tác mà không làm ảnh hưởng BL
; Xóa CH để CX = CL
; Thuật toán lưu nhiều chữ số x = x*10 + 'so vua nhap'
; Chuẩn bị thực hiện phép nhân với 10
; Nhân số đã có ở CL với AL=1, kết quả mặc định lưu trong AX
; Chuyển kết quả phép nhân vào CX
; Cộng số vừa nhập vào số đã có
; So sánh số hiện có với 256
; Nếu >= 256, nhảy đến thông báo nhập sai
; Nếu nhỏ hơn thì lưu giá trị vừa tính trong CL trở lại BL
;Quay về chương trình nhập để nhập tiếp
; Kiểm tra kí tự vừa nhập có phải SPACE hay không
; Nếu đúng thì lưu số hiển thị vào chuỗi ST
; Hiển thị MSG3
;Quay về chương trình nhập để nhập lại kí tự
; Lưu số thập phân trong BL vào chuỗ ST
; Tăng DI để chỉ vào ngăn nhớ tiếp theo
; So sánh biến đếm với kích thước chuỗi ST
; Nếu không nhỏ hơn thì kết thúc việc nhập chuỗi
; Xóa BL để nhập số thập phân tiếp theo
; Quay về chương trình chính để nhập số thập phân tiếp theo
; Để CX lưu số phần tử thực sự của chuỗi
; Chương trình so sánh và sắp xếp chuỗi tăng dần
; Xóa DI để DI làm biến đếm
188
XOR SI, SI BAT_DAU:
MOV AL, ST[SI]
CMP SI, CX JA HIEN_THI MOV DI, SI SO_SANH:
INC DI
MOV BL, ST[DI]
CMP DI, CX JA TIEP CMP AL, BL JA DOI_CHO JMP SO_SANH
DOI_CHO:
MOV ST[DI], AL MOV ST[DI], BL MOV AL, ST[DI]
JMP SO_SANH TIEP:
INC SI
JMP BAT_DAU
HIEN_THI:
MOV AH,9 LEA DX, MSG2 INT 21H
XOR SI, SI LAP:
MOV AL, ST[SI]
CMP SI, CX JA END_HIEN_THI MOV BL, 100 XOR AH, AH DIV BL MOV DH, AH CMP AL, 0 JE CHUC_0 MOV AH, 2 ADD AL, 30H MOV DL, AL INT 21H JMP CHUC_1 CHUC_0:
MOV BL, 10
; Xóa SI để SI làm biến đếm
; Lưu giá trị ô nhớ đang xét vào AL
; So sánh kết thúc chuỗi
; Nếu lớn hơn thì chuyển sang hiển thị chuỗi
; Chỉ đến ô nhớ tiếp theo
; Lưu giá trị ô nhớ đang xét vào BL
; So sánh kết thúc chuỗi
; Nếu lớn hơn thì nhảy đến tiếp
; So sánh 2 số
; Nếu lớn hơn thì đổi chỗ 2 số
; Nếu không lớn hơn thì giữ nguyên và tiến hành so sánh số tiếp theo
; Lưu giá trị trong AL vào ST[di]
; Lưu giá trị trong BL vào ST[di]
; Lưu giá trị trong ST[di] vào AL
;So sánh với giá trị ô nhớ tiếp theo
; Xét ô nhớ tiếp theo
; Tiếp tục so sánh nội dung ô nhớ này với ô nhớ tiếp theo
; Hiển thị chuỗi đã sắp xếp
; So sánh kết thúc chuỗi
; Xóa AH để AX = AL
;BL lưu chữ số hàng trăm
;DH lưu hàng chục và hàng đơn vị
;So sánh chữ số hàng trăm với 0
; Nếu bằng 0 thì lấy tiếp chữ số hàng chục
; Khi không có hàng trăm
189
MOV AL,GH XOR AH, AH DIV BL MOV DH, AH CMP AL, 0 JE DON_VI MOV AH, 2 ADD AL, 30H MOV DL, AL INT 21H
JUMP DON_VI CHUC_1:
MOV BL, 10 MOV AL, DH XOR AH, AH DIV BL MOV DH, AH MOV AH, 2 ADD AL, 30H MOV DL, AL INT 21H
JUMP DON_VI DON_VI:
ADD DH, 30H MOV DL, DH MOV AH, 2 INT 21H MOV DL, 20H MOV AH, 2 INT 21H INC SI CMP SI, 100
JNB END_HIEN_THI JMP LAP
END_HIEN_THI:
MAIN ENDP END MAIN
; BL lưu chữ số hàng chục
; DH lưu hàng đơn vị
; So sánh chữ số hàng chục với 0
; Nếu bằng 0 thì lấy tiếp chữ số hàng đơn vị
;Khi có chữ số hàng trăm
;BL lưu chữ số hàng chục
;DH lưu chữ số hàng đơn vị
; Xuất ra dấu SPACE
2. Chương trình hợp ngữ như sau:
.model small .stack 100h .data
MSG1 DB 'NHAP SO N: $' MSG2 DB 13,10,'TONG S LA: $' MSG3 DB 13,10,'S LA LE $' MSG4 DB 13,10,'S LA CHAN $' N DB ?
.CODE
; Hiển thị chuỗi MSG1
190
MAIN PROC MOV AX, @DATA MOV DS, AX MOV AH, 9 LEA DX, MSG1
INT 21H MOV AH, 1 INT 21H SUB AL, 30H XOR BX, BX LAP:
XOR AH, AH PUSH AX MUL AL ADD BX, AX POP AX DEC AL CMP AL, 0 JNE LAP MOV AH, 9
LEA DX, MSG1 INT 21H
XOR AX, AX MOV AX, BX PUSH AX MOV BX, 100 MOV CX, 1 MOV DX,0 BEGIN_PRINT:
CMP BX, 0 JZ END_PRINT CMP CX, 0 JE CALC CMP AX, BX JB GIULAI CALC:
MOV CX, 0 MOV DX, 0 DIV BX PUSH DX ADD AL, 30H XOR DX, DX MOV DL, AX MOV AH, 2 INT 21H POP DX
; Cất AX tại đỉnh ngăn xếp
; BX = BX + AX
; Lấy lại AX từ đỉnh ngăn xếp
; So sánh AL và 0
; nếu AL không bằng 0 sẽ nhảy về 'lap:'
; In chuỗi MSG1 ra màn hình
; chuyển giá trị S vào AX
; Cất AX vào đỉnh ngăn xếp
; Dùng 100 làm số bị chia
; BX = 0 sẽ nhảy đếnEND_PRINT
; CX = 0 sẽ nhảy đến CALC
; So sánh AX và BX
; Nếu AX < BX sẽ nhảy đến nhãn GIULAI
; Nhãn này in ra màn hình từng số của kết quả
191
MOV AX, DX GIULAI:
PUSH AX MOV DX, 0 MOV AX, BX DIV CS:MUOI MOV BX, AX POP AX
JMP BEGIN_PRINT MUOI DW 10 END_PRINT:
POP AX POP CX POP BX POP DX
MOV AH, 4CH INT 21H MAIN ENDP END MAIN
;Chia bx cho 10
; Gán kết quả trở lại BX
; Lấy lại AX từ đỉnh ngăn xếp
; Thoát về DOS
3. Một số chương trình cơ bản:
3.1. Tính tổng liên tiếp từ M đến N MOV AX,M
MOV BX,M MOV CX,(N-M) TOP:
ADD BL,1 ADD AX,BX LOOP TOP
3.2. Tính tích liên tiếp từ M đến N MOV AL,M
MOV BL,M MOV CX,(N-M) TOP:
INC BL MUL BL LOOP TOP
3.3. Nhập N số tự nhiên có 1 chữ số và lưu vào ngăn xếp MOV CX,N
L: