第23部分- Linux x86 64位汇编 字符串存储加载
除了字符串从一个内存位置传送到另一个内存位置外,还有用于把内存中的字符串值加载到寄存器以及传会至内存位置中的指令。
lods
lods指令把内存中的字符串值传送到EAX寄存器中。
有多种格式:lodsb, lodsw, lodsl,lodsq
使用ESI寄存器作为隐藏的源操作数。
stos
STOS指令可以把EAX寄存器中的数据存放到一个内存位置中。
有STOSB,STOSW,STOSL,STOSQ。
使用EDI寄存器作为隐含的目标操作数。
加载示例
.extern printf ;//调用外部的printf函数
.section .data
space:
.ascii "h"
oa:
.byte 0x0a
end:
.byte 0
.section .bss
.lcomm stobuffer, 256
.section .text
.globl _start
_start:
nop
leal space, %esi
leal stobuffer, %edi
movl $255, %ecx
cld
lodsb
rep stosb
leal oa, %esi
lodsb
stosb
leal end, %esi
lodsb
lodsb
movq $stobuffer,%rdi
call printf
movq $60,%rax
syscall
as -g -o stostest.o stostest.s
ld -o stostest stostest.o -lc -I /lib64/ld-linux-x86-64.so.2
在这里打印的时候,需要注意的是由于引入了printf函数,该函数指向的buffer的指针是48位地址的bss地址,不是32位的。