跳转到内容

rep & lodsb & stosb

rep

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

lodsb

从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

stosb

将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