跳到內容

rep & lodsb & stosb

rep是組合語言的重複動作,用於將lodsb, stosb, movsb, scasb, cmpsb這些重複執行
還有repe當equal時重複,repne當not equal時重複
這些指令的b結尾是byte,可使用其它單位後綴

cld
rep cmpsb

cld表示rep正序(設定DF旗標=0),std表示rep倒序(DF=1)
若發現執行異常請手動cld,使用過std須將其恢復為cld

從rsi指向的位址讀入一個byte至al,並將rsi遞增,lodsw則到ax以此類推

global _start
section .data
hello: db 'Hello, World!',10
section .text
_start:
mov rsi, hello
lodsb ; al=0x48 (H), rsi=rsi+1
lodsb ; al=0x65 (e), rsi=rsi+1
mov rax, 60
xor rdi, rdi
syscall

使用rep重複,先將rcx設成循環次數再執行rep lodsb

global _start
section .data
hello: db 'Hello, World!',10
section .text
_start:
mov rsi, hello
mov rcx, 2
rep lodsb
; al=0x48 (H), rsi=rsi+1
; al=0x65 (e), rsi=rsi+1
mov rax, 60
xor rdi, rdi
syscall

一般情況不使用rep lodsb,因為會一直將讀取到al的值覆蓋掉只有最後一個

將al的值存入至rdi指向的位址,並將rdi遞增

section .bss
temp: resq 2
global _start
section .text
_start:
mov rax, 65
mov rdi, temp
stosb ; rdi="A", rdi=rdi+1, 若要查看請找rdi-1的位址 x/s $rdi-1
mov rax, 60
xor rdi, rdi
syscall

使用rep重複,先將rcx設成循環次數再執行rep stosb

section .bss
temp: resq 2
global _start
section .text
_start:
mov rax, 65
mov rdi, temp
mov rcx, 2
rep stosb
; x/s $rdi-2 "AA"
mov rax, 60
xor rdi, rdi
syscall
```asm