rep & lodsb & stosb
rep是組合語言的重複動作,用於將lodsb, stosb, movsb, scasb, cmpsb這些重複執行
還有repe當equal時重複,repne當not equal時重複
這些指令的b結尾是byte,可使用其它單位後綴
cldrep cmpsbcld表示rep正序(設定DF旗標=0),std表示rep倒序(DF=1)
若發現執行異常請手動cld,使用過std須將其恢復為cld
從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一般情況不使用rep lodsb,因為會一直將讀取到al的值覆蓋掉只有最後一個
將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