Câu 1: Địa chỉ của chuỗi kí tự cần in ra màn hình nằm trong thanh ghi nào?
Lời giải:
Lời giải: Trong kiến trúc x86, khi thực hiện các thao tác I/O để in chuỗi ký tự ra màn hình thông qua các ngắt hệ thống của DOS (ví dụ: INT 21h/AH=09h), thanh ghi DX được sử dụng để lưu địa chỉ offset của chuỗi cần in. Đây là quy ước chuẩn trong lập trình hợp ngữ x86 để chỉ định vị trí dữ liệu cho các chức năng liên quan đến chuỗi.
Câu 2: Trong ngắt 21H, hàm dùng để in 1 kí tự ra màn hình là?
Lời giải:
Lời giải: Trong ngắt 21H của DOS, hàm 02H được sử dụng để xuất (in) một ký tự đơn ra màn hình. Ký tự cần in phải được đặt trong thanh ghi DL trước khi gọi ngắt. Các hàm khác như 01H dùng để đọc ký tự từ bàn phím, 09H để in một chuỗi, và 4CH để kết thúc chương trình.
Câu 3: Khi dùng hàm 2 của INT 21h để hiển thị một ký tự lên màn hình, mã của ký tự cần hiển thị được đưa vào thanh ghi nào?
Lời giải:
Lời giải: Trong lập trình Assembly sử dụng MS-DOS, hàm 2 của ngắt INT 21h (với AH = 02h) được dùng để hiển thị một ký tự ra màn hình. Để chức năng này hoạt động, mã ASCII của ký tự cần hiển thị phải được đặt vào thanh ghi DL trước khi gọi ngắt INT 21h. Các thanh ghi khác không dùng cho mục đích này.
Câu 4: Khi thực hiện gõ vào 1 ký tự từ bàn phím dùng hàm 1 của INT 21h, thì mã ASCII của ký tự được gõ vào chứa trong thanh ghi nào?
Lời giải:
Lời giải: Theo quy ước của ngắt DOS INT 21h, hàm 1 (hoặc 01h) dùng để đọc một ký tự từ bàn phím và mã ASCII của ký tự đó sẽ được lưu trữ trong thanh ghi AL. Đây là quy định chuẩn cho việc nhập liệu đơn ký tự trong môi trường DOS, trong khi thanh ghi DL thường được dùng cho việc xuất ký tự (hàm 02h).
Câu 5: Để gõ vào một ký tự từ bàn phím, ta dùng hàm nào của INT 21h?
Lời giải:
Lời giải: Hàm 1 của ngắt INT 21h là chức năng đọc một ký tự từ bàn phím và hiển thị (echo) nó ra màn hình. Đây là hàm cơ bản được sử dụng để nhận dữ liệu đầu vào là ký tự đơn từ người dùng trong môi trường DOS. Các hàm khác như Hàm 2 (hiển thị ký tự), Hàm 4Ch (kết thúc chương trình) hoặc Hàm 9 (hiển thị chuỗi) không phục vụ mục đích nhập liệu ký tự từ bàn phím.
Câu 6: Để hiện thị một ký tự lên màn hình, ta dùng hàm nào của INT 21h?
Lời giải:
Lời giải: Để hiển thị một ký tự lên màn hình trong môi trường MS-DOS, ta sử dụng hàm 02h của ngắt INT 21h. Ký tự cần hiển thị phải được đặt vào thanh ghi DL trước khi thực hiện lời gọi ngắt. Hàm này rất phổ biến trong lập trình hợp ngữ để xuất dữ liệu ký tự đơn lẻ.
Câu 7: Để hiện thị một xâu ký tự lên màn hình, ta dùng hàm nào của INT 21h?
Lời giải:
Lời giải: Hàm 9 (AH=09h) của INT 21h là hàm chuẩn được sử dụng để hiển thị một xâu ký tự lên màn hình trong môi trường DOS. Để sử dụng hàm này, địa chỉ offset của xâu ký tự (kết thúc bằng ký tự ‘$’) phải được nạp vào thanh ghi DX trước khi gọi ngắt. Các hàm khác có mục đích khác như đọc ký tự (Hàm 1), hiển thị một ký tự đơn (Hàm 2) hoặc kết thúc chương trình (Hàm 4Ch).
Câu 8: Để kết thúc chương trình loại .EXE, ta dùng hàm nào của INT 21h?
Lời giải:
Lời giải: Hàm 4Ch của ngắt INT 21h là hàm chuẩn được sử dụng để kết thúc một chương trình (loại .EXE) và trả quyền điều khiển về cho hệ điều hành DOS. Khi gọi hàm này, chương trình sẽ đặt một mã trạng thái (return code) vào thanh ghi AL để thông báo kết quả thực thi. Các hàm khác như hàm 01h, 02h và 09h dùng cho các tác vụ nhập/xuất ký tự và chuỗi.
Câu 9: Sau khi thực hiện các lệnh? MOV AH,05H MOV AL,03H XCHG AH,AL
Lời giải:
Lời giải: Ban đầu, lệnh MOV AH,05H sẽ đặt giá trị 05H vào thanh ghi AH, và lệnh MOV AL,03H sẽ đặt giá trị 03H vào thanh ghi AL. Lệnh XCHG AH,AL thực hiện trao đổi nội dung giữa hai thanh ghi AH và AL. Do đó, sau khi thực hiện lệnh XCHG, thanh ghi AH sẽ chứa giá trị 03H và thanh ghi AL sẽ chứa giá trị 05H.
Câu 10: Giả sử có AX=1000,BX=2000,CX=3000, sau khi thực hiện các lệnh PUSH AX PUSH BX PUSH CX POP AX POP BX POP CX Sẽ được
Lời giải:
Lời giải: Hoạt động của ngăn xếp (stack) tuân theo nguyên tắc LIFO (Last In, First Out). Khi thực hiện PUSH AX, PUSH BX, PUSH CX, các giá trị 1000, 2000, 3000 lần lượt được đưa vào stack. Sau đó, khi thực hiện POP AX, POP BX, POP CX, giá trị cuối cùng được đưa vào (CX=3000) sẽ được POP ra đầu tiên vào AX, tiếp theo là BX=2000 và cuối cùng là CX=1000, dẫn đến AX=3000, BX=2000, CX=1000.
Câu 11: Giả sử AX=2,BX=3, sau lệnh ADC AX,BX sẽ có?
Lời giải:
Lời giải: Lệnh ADC (Add with Carry) thực hiện phép cộng AX = AX + BX + CF (Carry Flag). Với AX=2 và BX=3, nếu CF=0 thì AX=5, nếu CF=1 thì AX=6. Thanh ghi BX không bị thay đổi bởi lệnh này, do đó giá trị của BX vẫn là 3. Vì vậy, AX có thể là 5 hoặc 6, còn BX là 3.
Câu 12: Giả sử AH=02, AL=03, sau lệnh MUL AH thì giá trị AH bằng bao nhiêu?
Lời giải:
Lời giải: Lệnh `MUL AH` thực hiện phép nhân không dấu giữa thanh ghi AL và thanh ghi AH, tức là `AL * AH`. Kết quả của phép nhân 8-bit này là một số 16-bit được lưu vào thanh ghi AX, trong đó AH chứa byte cao và AL chứa byte thấp. Với `AH=02`, `AL=03`, ta có `03 * 02 = 06` (hệ thập lục phân là `0006H`), do đó `AH = 00H` và `AL = 06H`.
Câu 13: Để đảo các bit trong một thanh ghi có thể?
Lời giải:
Lời giải: Đáp án C là chính xác vì phép toán XOR có một thuộc tính đặc biệt: một bit bất kỳ khi XOR với 1 sẽ bị đảo trạng thái (0 thành 1, 1 thành 0). Do giá trị 0FFH trong hệ nhị phân là 11111111, việc thực hiện phép XOR thanh ghi với 0FFH sẽ đảo ngược tất cả 8 bit trong thanh ghi đó.
Câu 14: Giả sử AL=35H,CL=4, sau lệnh SHR AL,CL ta được?
Lời giải:
Lời giải: Lệnh SHR AL,CL thực hiện dịch phải giá trị trong thanh ghi AL đi CL (4) bit. Giá trị ban đầu AL=35H tương đương 0011 0101b. Sau khi dịch phải 4 bit, AL sẽ trở thành 0000 0011b, tức là 3H. Thanh ghi CL chứa số lần dịch và không bị thay đổi bởi lệnh SHR, nên CL vẫn giữ nguyên giá trị 4.
Câu 15: Giả sử AX=35F7H, BX=126EH, sau lệnh CMP AX,BX lệnh nào sau đây chuyển điều khiển chương trình đến nhãn N?
Lời giải:
Lời giải: Lệnh CMP AX, BX thực hiện phép so sánh hai toán hạng bằng cách lấy AX trừ đi BX và thiết lập các cờ trạng thái tương ứng. Trong trường hợp này, giá trị của AX (35F7H) lớn hơn giá trị của BX (126EH). Lệnh “JG N” (Jump if Greater) sẽ nhảy đến nhãn N khi kết quả so sánh cho thấy toán hạng đích (AX) lớn hơn toán hạng nguồn (BX) đối với số có dấu.
Câu 16: Giả sử AX=35F7H, BX=126EH, sau lệnh CMP AH,BL lệnh nào sau đây chuyển điều khiển chương trình đến nhãn N?
Lời giải:
Lời giải: Lệnh `CMP AH, BL` so sánh giá trị của thanh ghi `AH` và `BL`. Từ giá trị ban đầu, ta có `AH = 35H` và `BL = 6EH`. Vì `35H` (tức 53 thập phân) nhỏ hơn `6EH` (tức 110 thập phân), nên kết quả so sánh là “nhỏ hơn”. Do đó, lệnh `JL N` (Jump if Less – Nhảy nếu nhỏ hơn) sẽ được thực thi để chuyển điều khiển đến nhãn N.
Câu 17: Giả sử AX=10, BX=15, sau đoạn chương trình sau ta sẽ có SUB AX,BX CMP AX,0 JG Tiep NEG AX JMP Next Tiep: ADD AX,15 JMP KT Next: ADD AX,20 KT:
Lời giải:
Lời giải: Ban đầu, lệnh `SUB AX, BX` thực hiện phép trừ `10 - 15`, kết quả `AX = -5`. Vì `AX` là số âm, điều kiện của lệnh nhảy `JG` (Jump if Greater) không được thỏa mãn nên chương trình không nhảy đến nhãn `Tiep`. Thay vào đó, chương trình thực hiện lệnh `NEG AX`, đổi dấu `AX` thành `5`, sau đó nhảy đến nhãn `Next` và thực hiện `ADD AX, 20`, cho kết quả cuối cùng là `AX = 25`.
Câu 18: Sau đoạn chương trình sau ta có MOV CX,7 MOV AX,0 TONG: ADD AX,CX LOOP TONG
Lời giải:
Lời giải: Đoạn chương trình này tính tổng các số từ 1 đến 7. Ban đầu, thanh ghi CX được khởi tạo là 7 và AX là 0. Lệnh LOOP sẽ thực hiện vòng lặp 7 lần; trong mỗi lần lặp, lệnh ADD AX, CX sẽ cộng giá trị hiện tại của CX vào AX, sau đó CX tự động giảm đi 1. Kết quả cuối cùng là AX = 7 + 6 + 5 + 4 + 3 + 2 + 1 = 28.
Câu 19: Các thanh ghi nào giữ kết quả trong các lệnh nhân chia 16 bit?
Lời giải:
Lời giải: Trong kiến trúc vi xử lý 16 bit (ví dụ 8086), các lệnh nhân (MUL/IMUL) và chia (DIV/IDIV) sử dụng thanh ghi AX và DX để lưu trữ kết quả. Cụ thể, trong phép nhân 16 bit, kết quả 32 bit sẽ được lưu vào cặp thanh ghi DX:AX, với DX chứa 16 bit cao và AX chứa 16 bit thấp. Đối với phép chia 16 bit, AX chứa thương số và DX chứa số dư.
Câu 20: Mục đích đoạn lệnh sau dùng để ? PUSH CX MOV CX,0FFFFh LOOP $ POP CX
Lời giải:
Lời giải: Đoạn lệnh này được dùng để tạo một khoảng trễ (delay) trong quá trình thực thi chương trình. Lệnh MOV CX,0FFFFh nạp một giá trị lớn vào thanh ghi CX, sau đó lệnh LOOP $ sẽ lặp lại 65536 lần (0FFFFh là 65535), làm tiêu tốn thời gian của CPU. Các lệnh PUSH CX và POP CX đảm bảo rằng giá trị ban đầu của thanh ghi CX được bảo toàn trước và sau vòng lặp trễ.
Câu 21: Để xoá thanh ghi CX về 0, lệnh nào sau đây là đúng?
Lời giải:
Lời giải: Lệnh `XOR CX, CX` là cách đúng và hiệu quả nhất để xóa thanh ghi CX về 0 trong lập trình hợp ngữ x86. Khi một giá trị được XOR với chính nó, kết quả luôn là 0, do đó thao tác này được sử dụng rộng rãi để khởi tạo các thanh ghi. Các lệnh khác như `OR CX,0` không làm thay đổi giá trị, `CMP CX,0` chỉ so sánh, và `MOV CX,[0]` di chuyển dữ liệu từ địa chỉ bộ nhớ chứ không xóa thanh ghi về 0.
Câu 22: Lệnh nào sau đây dùng để xuất dữ liệu ra cổng?
Lời giải:
Lời giải: Lệnh OUT (Output) trong các hệ vi xử lý (ví dụ 8086/8088) được dùng để xuất dữ liệu từ thanh ghi ra một cổng I/O cụ thể. Đây là lệnh chuyên dụng cho thao tác ghi dữ liệu từ CPU ra các thiết bị ngoại vi thông qua cổng. Ngược lại, lệnh IN được sử dụng để đọc dữ liệu từ một cổng I/O.
Câu 23: Sau đoạn chương trình dưới ta có? CMP AX,BX JG KT XCHG AX,BX KT:
Lời giải:
Lời giải: Đoạn mã này thực hiện so sánh hai thanh ghi AX và BX. Lệnh `JG KT` (Jump if Greater) sẽ nhảy đến nhãn KT nếu giá trị trong AX lớn hơn BX, bỏ qua lệnh hoán đổi. Ngược lại, nếu AX nhỏ hơn hoặc bằng BX, lệnh `XCHG AX,BX` sẽ được thực thi để đổi chỗ hai giá trị. Do đó, kết quả cuối cùng luôn đảm bảo thanh ghi AX chứa giá trị lớn nhất.
Câu 24: Với cấu trúc IF – Then - else, dùng các lệnh nào sau đây để thực hiện công việc phù hợp với điều kiện?
Lời giải:
Lời giải: Để thực hiện cấu trúc rẽ nhánh IF-Then-Else, vi xử lý sử dụng kết hợp lệnh nhảy có điều kiện và lệnh nhảy không điều kiện. Lệnh nhảy có điều kiện được dùng để kiểm tra điều kiện (IF) và quyết định thực thi khối lệnh “Then” hay nhảy tới khối lệnh “Else”. Sau khi thực thi xong khối “Then”, lệnh nhảy không điều kiện sẽ được dùng để bỏ qua khối “Else” và đi đến phần tiếp theo của chương trình.
Câu 25: Sau khi thực hiện đoạn chương trình sau, thanh ghi BX có giá trị bằng bao nhiêu ? XOR AX, AX XOR BX, BX MOV AX, 5857H MOV BX, 58A8H XOR AX, BX
Lời giải:
Lời giải: Đoạn chương trình thực hiện các phép gán và thao tác với thanh ghi. Các lệnh “XOR AX, AX” và “XOR BX, BX” khởi tạo AX và BX về 0. Tiếp theo, “MOV AX, 5857H” gán AX bằng 5857H và “MOV BX, 58A8H” gán BX bằng 58A8H. Lệnh cuối cùng “XOR AX, BX” chỉ thay đổi giá trị của thanh ghi AX, trong khi thanh ghi BX vẫn giữ nguyên giá trị là 58A8H.
Câu 26: Xét đoạn chương trình và cho biết kết quả ? DATA M1 DB ‘abcd,$’ Code …… CLD LEA SI,M1 LODSB
Lời giải:
Lời giải: Lệnh CLD (Clear Direction Flag) đặt cờ DF bằng 0, khiến các thao tác chuỗi tăng địa chỉ. Lệnh LEA SI,M1 nạp địa chỉ hiệu dụng của M1 vào thanh ghi SI. Cuối cùng, LODSB (Load String Byte) sẽ nạp một byte từ địa chỉ được trỏ bởi DS:SI (tức là từ M1) vào thanh ghi AL, và sau đó tăng SI lên 1.
Câu 27: Xét đoạn chương trình sau: MOV BL,3Bh MOV AX,132A h DIV BL Thương được đặt vào thanh ghi nào?
Lời giải:
Lời giải: Trong kiến trúc vi xử lý x86, khi lệnh `DIV` thực hiện phép chia một toán hạng 16-bit (số bị chia trong `AX`) cho một toán hạng 8-bit (số chia trong `BL`), kết quả thương số sẽ được lưu trữ trong thanh ghi `AL`. Đồng thời, số dư của phép chia sẽ được lưu trữ trong thanh ghi `AH`.
Câu 28: Xét đoạn chương trình sau: MOV BX,223Bh MOV AX,13 2Ah MUL BX Kết quả của câu lệnh nhân được đặt vào thanh ghi nào?
Lời giải:
Lời giải: Trong kiến trúc vi xử lý x86, khi lệnh MUL thực hiện phép nhân không dấu với một toán hạng 16-bit (như BX), thanh ghi AX sẽ được nhân ngầm với giá trị trong BX. Kết quả 32-bit của phép nhân này sẽ được lưu trữ vào cặp thanh ghi DX:AX, với phần cao 16 bit nằm trong DX và phần thấp 16 bit nằm trong AX.
Câu 29: Xét đoạn chương trình sau: MOV CX,0 MOV AH,1 DOC: INT 21h CMP AL,0 JE thoat INC CX JMP DOC Thoat: Bộ đếm CX có chức năng gì?
Lời giải:
Lời giải: Trong đoạn chương trình, thanh ghi CX được khởi tạo bằng 0. Mỗi khi một ký tự được đọc từ bàn phím (INT 21h, AH=1), lệnh INC CX sẽ tăng giá trị của CX lên 1. Vòng lặp DOC tiếp tục cho đến khi ký tự đọc vào AL bằng 0, nghĩa là một ký tự đặc biệt được sử dụng làm điều kiện dừng. Do đó, CX có chức năng đếm số lượng ký tự đã được đọc thành công trước khi vòng lặp kết thúc.
Câu 30: Xét đoạn chương trình sau: MOV CX,0 MOV AH,1 DOC: INT 21h CMP AL,0 JE thoat INC CX JMP DOC Thoat: Bộ đếm CX có giá trị như thế nào?
Lời giải:
Lời giải: Đoạn chương trình sử dụng vòng lặp để đọc các ký tự từ bàn phím thông qua ngắt INT 21h (AH=1). Mỗi khi một ký tự được đọc vào và không phải là ký tự có giá trị 0, bộ đếm CX sẽ được tăng lên. Khi ký tự đọc vào có giá trị bằng 0, chương trình sẽ thoát khỏi vòng lặp, và CX sẽ giữ giá trị tổng số ký tự đã được nhập trước khi gặp điều kiện dừng.