Majelis - String

Kami telah menggunakan string panjang variabel dalam contoh kami sebelumnya. String panjang variabel dapat memiliki karakter sebanyak yang diperlukan. Umumnya, kami menentukan panjang string dengan salah satu dari dua cara -

  • Menyimpan panjang string secara eksplisit
  • Menggunakan karakter sentinel

Kita bisa menyimpan panjang string secara eksplisit dengan menggunakan simbol $ location counter yang mewakili nilai saat ini dari counter lokasi. Dalam contoh berikut -

msg  db  'Hello, world!',0xa ;our dear string
len  equ  $ - msg            ;length of our dear string

$ menunjuk ke byte setelah karakter terakhir dari variabel string msg . Karena itu,$-msgmemberikan panjang string. Kami juga bisa menulis

msg db 'Hello, world!',0xa ;our dear string
len equ 13                 ;length of our dear string

Alternatifnya, Anda dapat menyimpan string dengan karakter sentinel di belakangnya untuk membatasi string alih-alih menyimpan panjang string secara eksplisit. Karakter sentinel harus merupakan karakter khusus yang tidak muncul dalam string.

Misalnya -

message DB 'I am loving it!', 0

Instruksi String

Setiap instruksi string mungkin memerlukan operan sumber, operan tujuan atau keduanya. Untuk segmen 32-bit, instruksi string menggunakan register ESI dan EDI masing-masing untuk menunjuk ke operan sumber dan tujuan.

Untuk segmen 16-bit, register SI dan DI masing-masing digunakan untuk menunjuk ke sumber dan tujuan.

Ada lima instruksi dasar untuk memproses string. Mereka adalah -

  • MOVS - Instruksi ini memindahkan data 1 Byte, Word atau Doubleword dari lokasi memori ke lokasi lain.

  • LODS- Instruksi ini dimuat dari memori. Jika operan adalah satu byte, maka akan dimuat ke register AL, jika operand adalah satu kata, itu dimuat ke register AX dan doubleword dimuat ke register EAX.

  • STOS - Instruksi ini menyimpan data dari register (AL, AX, atau EAX) ke memori.

  • CMPS- Instruksi ini membandingkan dua item data dalam memori. Data bisa dalam ukuran byte, word atau doubleword.

  • SCAS - Instruksi ini membandingkan isi register (AL, AX atau EAX) dengan isi item di memori.

Setiap instruksi di atas memiliki versi byte, word, dan doubleword, dan instruksi string dapat diulang dengan menggunakan awalan pengulangan.

Instruksi ini menggunakan pasangan register ES: DI dan DS: SI, di mana register DI dan SI berisi alamat offset valid yang mengacu pada byte yang disimpan dalam memori. SI biasanya dikaitkan dengan DS (segmen data) dan DI selalu dikaitkan dengan ES (segmen tambahan).

Register DS: SI (atau ESI) dan ES: DI (atau EDI) masing-masing mengarah ke operand sumber dan tujuan. Operand sumber diasumsikan berada di DS: SI (atau ESI) dan operand tujuan di ES: DI (atau EDI) di memori.

Untuk alamat 16-bit, register SI dan DI digunakan, dan untuk alamat 32-bit, register ESI dan EDI digunakan.

Tabel berikut menyediakan berbagai versi instruksi string dan ruang yang diasumsikan dari operan.

Instruksi Dasar Operand di Operasi Byte Operasi Kata Operasi Kata Ganda
MOVS ES: DI, DS: SI MOVSB MOVSW MOVSD
LODS AX, DS: SI LODSB LODSW LODSD
STOS ES: DI, AX STOSB STOSW STOSD
CMPS DS: SI, ES: DI CMPSB CMPSW CMPSD
SCAS ES: DI, AX SCASB SCASW SCASD

Awalan Pengulangan

Awalan REP, ketika diatur sebelum instruksi string, misalnya - REP MOVSB, menyebabkan pengulangan instruksi berdasarkan penghitung yang ditempatkan di register CX. REP menjalankan instruksi, menurunkan CX sebanyak 1, dan memeriksa apakah CX adalah nol. Ini mengulangi pemrosesan instruksi sampai CX nol.

Direction Flag (DF) menentukan arah operasi.

  • Gunakan CLD (Clear Direction Flag, DF = 0) untuk melakukan operasi dari kiri ke kanan.
  • Gunakan STD (Set Direction Flag, DF = 1) untuk melakukan operasi dari kanan ke kiri.

Awalan REP juga memiliki variasi berikut:

  • REP: Ini adalah pengulangan tanpa syarat. Ini mengulangi operasi sampai CX nol.

  • REPE atau REPZ: Ini adalah pengulangan bersyarat. Ini mengulangi operasi sementara bendera nol menunjukkan sama dengan / nol. Ini berhenti ketika ZF menunjukkan tidak sama dengan / nol atau ketika CX adalah nol.

  • REPNE atau REPNZ: Ini juga merupakan pengulangan bersyarat. Ini mengulangi operasi sementara bendera nol menunjukkan tidak sama dengan / nol. Ini berhenti ketika ZF menunjukkan sama dengan / nol atau ketika CX diturunkan menjadi nol.