Tham số ngầm định trong lệnh nhân assembly?

Cho mình hỏi là trong lệnh nhân/chia trong assembly (Intel based assembly) thì ví dụ trong phép nhân 16bit, khi nào nó ngầm định tích sẽ lưu vào thanh gi AX và khi nào là DX vậy?

Mình chỉ học qua x86 architecture thôi, nên không biết intel có giống x86 về cái này không. Nhưng đại khái thì:

DX:AX là một register pair. AX là 16-bit register chứa bit “thấp” (low-order bits) và DX cũng là 16-bit register nhưng nó chứa bit “cao” (high-order bits).

Ví dụ: Một con số decimal

4,294,967,284

được đại diện trong 32-bit binary

11111111111111111111111111110100

thì DX sẽ chứa 16 bit đầu tiên từ trái qua phải, và AX sẽ chứa 16 bit còn lại

DX: 1111111111111111
AX: 1111111111110100

Nếu như bạn hiểu phần này rồi, thì mình nghĩ bạn đã biết được câu trả lời rồi đó :grin: . Vì AX chứa low-order bits, nên nó luôn thay đổi khi bạn xài mul 16-bit. DX chỉ chứa high-order bits thôi, nên nó chỉ thay đổi khi nào bạn nhân 2 con số 16-bit nào đó mà tạo ra kết quả lớn hơn 16-bit. Lúc đó DX sẽ được xài với AX để ngăng chặng bit overflow.

5 Likes

cảm ơn bạn, mỉnh hiểu rồi. :grin::grin:

à cho mỉnh hỏi thêm, nếu là phép chia 32 bit thì mh có thể dùng thanh gia edx huặc eax để làm số bị chia hả, vì trong phép chia, ngâm định cặp edx:eax là số bị chia mà.

Không nhé bạn :slight_smile: để chia một số 32 bit cho một số 32 bit bằng (I)DIV thì phải đưa số bị chia vào eax rồi XOR edx, edx hay CDQ.
Với phép nhân 32x32 thì cả edxeax đều bị ghi đè.

5 Likes

cảm ơn bạn, mh hiểu rồi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?