♨️Strings

Có vẻ các bạn cũng quá quen đối với các dòng code này:

msg    db     "Hello World!!" ,0xa
len    equ    $-msg

Thì nếu bạn nào chưa quen thì mình sẽ nói lại 1 lần nữa. Hai dòng code trên có chức năng khai báo 1 chuỗi và độ dài vào các biến cụ thể ở đây nó là biến msg và chứa độ dài(len) = 13. 0xa là kí tự đặc biệt giúp ngắt chuỗi và xuống dòng. . Bạn có thể kiểm tra điều này trong bảng mã ascii

Hôm nay, bạn sẽ được biết đến một cách mới để có thể gán chuỗi như ý muốn của mình:

msg    db    "Hello World!!", 0x0

Giải thích một chút về "0x0" thì nó dùng để phân định chuỗi, nó được gọi là sentinel character. Thì việc này sẽ giúp ta không cần phải lưu độ dài chuỗi nữa nhưng cần chú ý hơn các kí tự đặc biệt này không được xuất hiện trong chuỗi.

Strings Instruction

Tương tự với các instructions khác thì các strings instruction cũng cần có các toán hạng nguồn và toán hạng đích. Đối với 32bits thì thanh ghi ESI trỏ đến toán hạng nguồn còn EDI thì sẽ trỏ đến toán hạng đích.

Các strings Instructions đó là:

  • MOVS : instruction này sẽ moves 1 byte, word hoặc Double Word từ vùng nhớ đến nơi khác.

  • LODS : instruction này sẽ load từ memory. Tùy vào dữ liệu nó load thì thanh ghi nó sẽ được chỉnh phù hợp với dữ liệu đó. ví dụ ( AL-1 byte | AX-2 bytes | EAX-4 bytes )

  • STOS: instruction này sẽ lưu trữ dữ liệu từ thanh ghi (EAX) vào memory.

  • CMPS: instruction này sẽ so sánh 2 dữ liệu trong memory.

  • SCAS: instruction này sẽ so sánh dữ liệu của thanh ghi AL, AX, EAX với một dữ liệu khác trong bộ nhớ.

Basic Instruction
Operands at
Byte Operation
Word Operation
Double word Operation

MOVS

EDI, ESI

MOVSB

MOVSW

MOVSD

LODS

AX, ESI

LODSB

LODSW

LODSD

STOS

EDI, AX

STOSB

STOSW

STOSD

CMPS

ESI, EDI

CMPSB

CMPSW

CMPSD

SCAS

EDI, AX

SCASB

SCASW

SCASD

Các instructions này mình sẽ nói sau khi có các ví dụ cụ thể.

Bài này bạn chỉ cần nhớ cú pháp của nó là được.

Last updated