rep & lodsb & stosb
rep
rep是组合语言的重复动作,用于将lodsb, stosb, movsb, scasb, cmpsb这些重复执行
还有repe当equal时重复,repne当not equal时重复
这些指令的b结尾是byte,可使用其它单位后缀
cldrep cmpsb
cld表示rep正序(设定DF旗标=0),std表示rep倒序(DF=1)
若发现执行异常请手动cld,使用过std 将其回复为cld
lodsb
从rsi指向的位址读入一个byte至al,并将rsi递增,lodsw则到ax以此类推 \
global _start
section .datahello: 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 .datahello: 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
stosb
将al的值存入至rdi指向的位址,并将rdi递增
section .bsstemp: 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 .bsstemp: 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