You are on page 1of 7

BÀI TẬP KIẾN TRÚC MÁY TÍNH VÀ HỢP NGỮ

Chương 2 – Lập trình hợp ngữ


22. Hãy viết lệnh ñịnh nghĩa hằng -1 với tên là TRU_MOT.

TRU_MOT EQU -1

23. Hãy viết lệnh ñịnh nghĩa hằng "Tiep tuc?" với tên là TIEP_TUC.

TIEP_TUC EQU "Tiep tuc?"

24. Hãy viết lệnh khai báo biến B1 kiểu byte có trị là -1.

B1 DB -1

25. Hãy viết lệnh khai báo biến W1 kiểu word có trị là -1. Byte thấp và cao
của W1 có trị là bao nhiêu (dạng thập lục)?

W1 DW -1

Do trị -1 kiểu word có dạng thập lục là 0FFFFh, nên byte thấp và cao của W1
ñều có giá trị là 0FFh.
26. Hãy viết lệnh khai báo biến W2 kiểu word có trị là 4096. Byte thấp và
cao của W2 có trị là bao nhiêu (dạng thập lục)?

W2 DW 4096

Do trị 4096 có dạng thập lục là 1000h, nên byte thấp của W2 có trị 00h, byte
cao của nó có trị 10h.
27. Viết lệnh khai báo W3 có trị và kiểu như W2 ở câu trên nhưng thêm hai
biến W3H ñể truy cập byte cao và W3L ñể truy cập byte thấp của W3. Hướng
dẫn: dùng lệnh LABEL.

W3 LABEL WORD
W3L DB 00h
W3H DB 10h

28. Viết lệnh khai báo mảng Array1 kiểu byte có trị các phần tử lần lượt là
ABh, CDh, EFh, 01h, 23h. Hãy cho biết trị của từ ở ñịa chỉ Array1+2.

ARRAY1 DB 0ABh, 0CDh, 0EFh, 01h, 23h

Byte ở ñịa chỉ Array1 là 0ABh. Byte ở ñịa chỉ Array1+2 sẽ là 0EFh. Tiếp theo
là 01h.
Từ gồm 2 byte, thấp trước cao sau, nên từ ở Array1+2 sẽ là 01EFh.
29. Viết lệnh khai báo mảng Str1 kiểu byte có trị là "12A45". Viết lệnh khai
báo mảng Str2 kiểu byte có trị giống như Str1 nhưng ñược viết dưới dạng số
(thay vì dạng chuỗi).
STR1 DB "12A45"
STR2 DB 31h, 32h, 41h, 34h, 35h

32. Giả sử A ñược lưu tại ñịa chỉ ô 0000h. Hãy cho biết C lưu tại ñịa chỉ ô nào
với khai báo sau.

A DB 7
B DW 1ABCh
C DB "1234"

A lưu ở 0000h và chiếm 1 byte. Do ñó B sẽ lưu ở 0000h+1 = 0001h và chiếm


2 byte (vì là từ).
Vậy C sẽ lưu ở 0001h+2 = 0003h.
37. Muốn ñưa ñịa chỉ ñoạn của biến A vào thanh ghi AX thì dùng lệnh gì?

MOV AX, SEG A

40. Cho biết trị của AX và BX sau khi thực hiện lệnh sau:

MOV AX, 25
MOV BX, 23
XCHG AX, BX

Do lệnh XCHG hoán ñổi giá trị hai tác tố, nên AX giờ sẽ có trị 23, BX có trị 25.
41. A và B là hai biến kiểu từ. Có thể dùng lệnh XCHG A, B ñể hoán ñổi trị
của hai biến A và B không? Nếu không, hãy viết (một hoặc nhiều) lệnh khác
ñể thực hiện.
Không thể dùng lệnh XCHG A, B ñể hoán trị A và B. Bởi vì cả hai tác tố ñều là
vùng nhớ. Do ñó cần dùng ñoạn lệnh sau:

MOV AX, A
XCHG AX, B
MOV A, AX

42. Hãy cho biết trị không dấu và có dấu của BL là bao nhiêu sau khi thực
hiện lệnh: (bình luận thêm trường hợp có dấu)

MOV BL, 127


ADD BL, 1

Sau lệnh này, trị không dấu của BL là 128, trị có dấu là -128.
Trong trường hợp có dấu, kết quả bị sai vì ñáng lý ra 127+1 phải là 128.
44. Hãy cho biết trị của AL là bao nhiêu (và giải thích) sau khi thực hiện
lệnh:

MOV AL, -128


NEG AL

Trị của AL vẫn là -128.


Vì lệnh NEG không thể ñổi dấu trị -128 (tức 80h).
46. Viết nhóm lệnh tương ñương với lệnh gán B = B – A – 1, trong ñó A, B là
vùng nhớ (biến) kiểu từ.

MOV AX, B
SUB AX, A
SUB AX, 1
MOV B, AX

47. Viết nhóm lệnh tương ñương với lệnh gán C = 2 * B – 3 * A, trong ñó A,
B, C là vùng nhớ (biến) kiểu từ.

MOV AX, B
ADD AX, B
SUB AX, A
SUB AX, A
SUB AX, A
MOV C, AX

48. Viết nhóm lệnh nhập một ký tự từ bàn phím và cất vào BL. Nếu nhập ký
tự 7 thì BL có trị bao nhiêu? Nếu nhập B thì BL có trị bao nhiêu? Nếu nhập d
thì BL có trị bao nhiêu?

MOV AH, 1
INT 21h
MOV BL, AL

Nếu nhập '7' thì BL = 37h.


Nếu nhập 'B' thì BL = 42h.
Nếu nhập 'd' thì BL = 64h.
49. Viết nhóm lệnh xuất số 1 lên màn hình.

MOV AH, 2
MOV DL, '1'
INT 21h

50. Viết nhóm lệnh xuất số 123 lên màn hình.


MOV AH, 2
MOV DL, '1'
INT 21h
MOV DL, '2'
INT 21h
MOV DL, '3'
INT 21h

51. Viết nhóm lệnh xuất chuỗi "Chuong trinh dau tien cua toi" (không có dấu
nháy kép) lên màn hình.

.DATA
STR DB "Chuong trinh dau tien cua toi$"
.CODE
MOV AX, SEG STR
MOV DS, AX
LEA DX, STR
MOV AH, 9
INT 21h

52. Viết nhóm lệnh xuất chuỗi "ky hieu chi dong do la My la dau $" (không
có dấu nháy kép) lên màn hình.

.DATA
STR DB "ky hieu chi dong do la My la dau $"
.CODE
MOV AX, SEG STR
MOV DS, AX
LEA DX, STR
MOV AH, 9
INT 21h
MOV AH, 2
MOV DL, '$'
INT 21h

53. Viết nhóm lệnh ñể kết thúc chương trình.

MOV AH, 4Ch


INT 21h
Chương 3 – Kiểu ñịnh vị & cờ
11. Cho w1 là biến kiểu từ. Hãy viết lệnh ñưa trị của w1 vào AX theo kiểu
ñịnh vị trực tiếp.

MOV AX, W1

12. Cho b2 là biến kiểu byte. Hãy viết lệnh ñưa trị của b2 vào AL theo kiểu
ñịnh vị gián tiếp thanh ghi.

LEA BX, B2 ;Nạp trước ñịa chỉ ô của B2 vào BX


MOV AL, [DS:BX]
Chương 4 – Lệnh nhảy & lặp
8. Viết lệnh hợp ngữ tương ñương for (CX = 0; CX < 10; CX++) {...}

MOV CX, 0 ;Khởi trị


LAP:
;...
INC CX ;Tăng biến
CMP CX, 10 ;Kiểm tra ñiều kiện
JB LAP ;Tiếp tục lặp

9. Viết lệnh hợp ngữ tương ñương while (AX >= BX) {CX++; AX -=BX}

LAP:
CMP AX, BX ;Kiểm tra ñiều kiện
JA HET_LAP ;Ngắt vòng lặp

INC CX
SUB AX, BX

JMP LAP ;Quay về ñầu vòng lặp


HET_LAP:

18. Cho ví dụ dùng hàm 0Ah ñể nhập chuỗi dài tối ña 30 ký tự (không kể
Enter).

.DATA
LEN EQU 31
STR LABEL BYTE
MAXLEN DB LEN
ACTLEN DB ?
BUFF DB LEN DUP (?)
.CODE
MOV AH, 0Ah
MOV BX, SEG STR
MOV DS, BX
LEA DX, STR
INT 21h

20. Viết ñoạn mã dùng hàm 40h ñể xuất chuỗi "Luong cua Tran Hai = $1,000
/ thang".
.DATA
STR DB "Luong cua Tran Hai = $1,000 / thang"
LEN EQU $ - STR
.CODE
MOV AH, 40h
MOV BX, 1 ;ðưa ra màn hình
MOV CX, LEN ;ðộ dài chuỗi
INT 21h

You might also like