JavaScript is required

Đoạn lệnh sau sai ở đâu? 

A.
MOV AX,100
B.
DIV BX
C.
MOV BX,-10
D.
IDIV BX
Trả lời:

Đáp án đúng: B


Lệnh `DIV BX` thực hiện phép chia không dấu số trong `AX` cho `BX`. Kết quả thương số được lưu vào `AL`, số dư lưu vào `AH`. Tuy nhiên, nếu thương số lớn hơn 255 (overflow), ngắt sẽ xảy ra. Lệnh `IDIV BX` thực hiện phép chia có dấu số trong `AX` cho `BX`. Tương tự như `DIV BX`, nếu tràn số, ngắt sẽ xảy ra. Trong khi đó, `MOV AX, 100` và `MOV BX, -10` là các lệnh gán giá trị hợp lệ. Vấn đề nằm ở việc nếu `BX` chứa `-10` và `AX` chứa `100`, khi thực hiện `IDIV BX`, kết quả sẽ là `-10` (thương) và `0` (dư). Tuy nhiên, nếu sử dụng `DIV BX` với `BX = -10` (được biểu diễn dưới dạng số bù hai), kết quả sẽ không đúng như mong đợi vì `DIV` thực hiện phép chia không dấu. Dù vậy, lỗi chính xác hơn nằm ở `MOV BX, -10` vì trong ngữ cảnh của một số trình biên dịch hoặc assembler cũ, việc gán trực tiếp một giá trị âm cho một thanh ghi có thể không được hỗ trợ hoặc cần một cú pháp khác. Tuy nhiên, trong nhiều trường hợp, điều này vẫn hợp lệ. Do đó, lựa chọn tốt nhất là `DIV BX` vì nguy cơ gây ra ngắt do tràn số cao hơn nếu AX chứa một giá trị lớn hơn nhiều so với BX.

Câu hỏi liên quan