1️⃣Modes

Có 3 modes chính:

  • Xử lí thanh ghi: register addressing

  • Xử lí trực tiếp: Immediate addressing

  • Xử lí bộ nhớ: Memory addressing

Register Addressing

Mỗi thanh ghi chứa một toán hạng. Phụ thuộc vào các instruction, thanh ghi có thể là toán hạng thứ nhất hoặc toán hạng thứ hai hoặc cả. Ví dụ:

mov dx, buffer   ; Register is first operand
mov count, cx	   ; Register in second operand
mov eax, ebx	   ; Both the operands are in registers

Vì việc xử lý dữ liệu giữa các thanh ghi không liên quan đến bộ nhớ nên nó xử lý dữ liệu rất nhanh.

Immediate Addressing

Một toán hạng immediate có một giá trị hằng số hoặc một biểu thức. Khi một instruction với 2 toán hạng sử dụng immediate addressing, thì toán hạng thứ nhất có thể là một thanh ghi hoặc một địa chỉ bộ nhớ và toán hạng thứ hai là một hằng số immediate(trực tiếp). Toán hạng đầu tiên xác định độ dài của dữ liệu. Ví dụ:

section .data
byte_value  db  150    ; A byte value is defined
word_value  dw  300    ; A word value is defined
section .text
    global _start
_start:
add  byte_value, 65    ; An immediate operand 65 is added
mov  ax, 0x45           ; Immediate constant 0x45 is transferred to AX

Direct Memory Addressing

Hiểu đơn giản thì mode này sẽ tương tác trực tiếp với các dữ liệu trong .data section, truy cập tới các vùng nhớ cụ thể, với các thanh ghi hoặc ngược lại. Đặc điểm của mode này là tương đối chậm vì phải truy cập và thao tác với memory.Ưu thế của mode này là việc truy cập đến bộ nhớ nhanh

add	byte_value, dl	; Adds the register in the memory location
mov	bx, word_value	; Operand from the memory is added to register

Direct-Offset Addressing

Chế độ xử lí này sử dụng các toán tủ số học để sửa đổi một địa chỉ. Ví dụ

byte_table    db   14, 15, 22, 45      ; Tables of bytes
word_table    dw   134, 345, 564, 123  ; Tables of words

Các thao tác sau truy cập dữ liệu từ các Tables trong bộ nhớ vào các thanh ghi:

mov cl, byte_table[2]	; Gets the 3rd element of the BYTE_TABLE
mov cl, byte_table + 2	; Gets the 3rd element of the BYTE_TABLE
mov cx, word_table[3]	; Gets the 4th element of the WORD_TABLE
mov cx, word_table + 3	; Gets the 4th element of the WORD_TABLE

Indirect Memory Addressing

Để tham chiếu tới địa chỉ của các thanh ghi ta sẽ có syntax như sau: [RAX]. Cách này gián tiếp gán địa chỉ của một data segment cho một thanh ghi sau đó tương tác địa chỉ bộ nhớ đó trên thanh ghi. Ví dụ:

my_table times 10 dw 0  ; Declear my_table constant 10 bytes \x00
mov ebx, [my_table]     ; address of my_table --> [ebx] 
mov [ebx], 110          ; my_table[0] = 110
add ebx, 2              ; ebx = ebx +2
mov [ebx], 123          ; my_table[1] = 123

The MOV Instruction

Mov instruction được sử dụng để chuyển data từ một storage space đến một nơi khác. Mov instruction sẽ lấy 2 operand (toán hạng).

Syntax:

mov  destination, source

mov instruction có 5 ràng buộc:

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

Lưu ý:

  • Cả hai toán hạng khi muốn sử dụng mov instruction phải cùng kích thước

  • Giá trị của toán hạng nguồn không thay đổi

Tôi có trường hợp sau:

MOV  EBX, [MY_TABLE]  ; Address of MY_TABLE --->  EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

Nếu bạn nhìn như kia thì bạn sẽ không thể biết nó di chuyển một byte hay một word. Trong những trường hợp như vậy, nó sẽ sử dụng một type specifier.

Một vài type specifier chung:

Type Specifier
Bytes addressed

BYTE

1

WORD

2

DWORD

4

QWORD

8

TBYTE

10

Nhìn bảng trên thì nó là byte :v. Lí do: 100 --> 0x6e < 0xff --> byte

Bài tập:

Chương trình sau đây minh họa một số khái niệm được thảo luận ở trên. Nó lưu trữ "Mot trăm ngàn đồng". Viết một chương trình thay thế thành "Hai trăm ngàn đồng" :)))

section .text 
    global _start
_start:
    mov     edx,len
    mov     ecx,name
    mov     ebx,0x1
    mov     eax,0x4
    int     0x80

    mov     [name],  dword "Hai "    ; Change to "hai "

    ;writing " --> "
    mov     edx, 0x5
    mov     ecx, dir
    mov     ebx, 0x1
    mov     eax, 0x4
    int     0x80

    ; writing Hai trăm ngàn đồng
    mov     edx,len
    mov     ecx,name
    mov     ebx,0x1
    mov     eax,0x4
    int     0x80

    mov     eax,0x1
    int     0x80
section .data 
    name db "Mot trăm ngàn đồng" 
    len equ $-name 
    dir db " --> "

Last updated