Kích thước chương trình (đoạn code) có phụ thuộc vào kích thước thanh ghi cs không? tại sao?

Sau khi ôn lại các kiến thức nền tảng về biểu diễn dữ liệu, phần tiếp theo chúng ta cần nắm vững để có thể code Assembly 32bit là kiến thức về các thanh ghi.

3. Các thanh ghi 32 bit

Trong Assembly, các lệnh sẽ rất gần với mã máy. Đối với máy tính thì không có khái niệm biến như chúng ta thường sử dụng trong các ngôn ngữ bậc cao.

Thay vào đó, chúng ta sẽ thao tác qua các thanh ghi và bộ nhớ.

3.1 Thanh ghi đa năng

Các thanh ghi đa năng có thể được chia thành 3 nhóm:

  • Nhóm thanh ghi dữ liệu
  • Nhóm thanh ghi con trỏ
  • Nhóm thanh ghi chỉ số

3.1.1 Thanh ghi dữ liệu

Có 4 thanh ghi dữ liệu:

  • EAX: thanh ghi tích lũy. Thường được dùng trong nhập xuất và các lệnh tính toán số học như nhân, chia.
  • EBX: thanh ghi cơ sở. Thường được dùng để đánh dấu địa chỉ, lưu địa chỉ bắt đầu của 1 mảng.
  • EDX: thanh ghi dữ liệu. Thanh ghi này cũng thường được sử dụng trong nhập xuất như EAX
  • ECX: thanh ghi đếm. Thường được dùng trong vòng lặp, đếm số lần lặp.

Mỗi thanh ghi trên được chia thành các đoạn nhỏ hơn như sau:

  • Nhỏ nhất là hai thanh ghi 8 bit AH và AL.
  • Hai thanh ghi AH và AL hợp lại thành thanh ghi 16 bit AX. Trong đó AH chứa phần bit cao và AL chứa phần bit thấp của thanh ghi AX.
  • Thanh ghi AX chứa phần bit thấp của thanh ghi 32 bit EAX.

Cách chia nhỏ này tương tự với 3 thanh ghi đa năng còn lại.

Bit cao và bit thấp là sao ? Lấy VD với thanh ghi AX. Thanh ghi 16 bit AX gồm 2 phần:

  • 8 bit cao AH
  • 8 bit thấp AL

Việc thay đổi giá trị của 2 thanh ghi trên sẽ làm thay đổi giá trị của AX.
Giả sử ban đầu AX = 0 thì trong AX sẽ trông như này: 00000000 00000000b

  • Nếu ta gán cho AL giá trị 5 thì lúc này giá trị của AX cũng là 5: 00000000 00000101b
  • Nếu ta gán cho AH giá trị 5 thì lúc này giá trị của AX sẽ là 1280: 00000101 00000000b
  • Nếu ta gán cho cả AH và AL giá trị 5 thì lúc này AX sẽ mang giá trị 1285: 00000101 00000101b

Việc thay đổi giá trị của AX cũng sẽ làm EAX thay đổi theo. Tuy nhiên, chúng ta chỉ có thể trực tiếp thay đổi giá trị 16 bit thấp của EAX [tức AX], muốn thay đổi giá trị 16 bit cao của EAX thì sẽ cần sử dụng các thủ thuật khác, ví dụ như dịch bit trái [

Chủ Đề