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:
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