字符串的存儲與加載

字符串的存儲與加載是指,將字符串的值加載到寄存器和將其傳回內存位置中。其使用指令lods指令和stos指令

  • lods指令用於把內存中的字符串值傳送到eax寄存器中,該指令有三種不同格式:lodsb(1字節)、lodsw(2字節)、lodsl(4字節)。lods指令使用esi寄存器作為隱含的源操作數。esi寄存器必須包含要加載的字符串所在的內存地址。

  • 在使用lods指令把字符串值存放到eax寄存器之後,可以使用stos指令把它存放到另一個內存位置。

  • stos也有3種格式:stosb、stosw、stosl。stos指令使用edi寄存器作為隱含的目標操作數,執行stos指令時,根據長度遞增或遞減edi寄存器的值。

  • stos指令最大的用處在於和rep指令一起使用,多次把一個字符串值複製到大型字符串值中的時候,比如把空格字符複製到256字節的緩衝區區域。如下示例:

# stos.s

.section .data
space:
    .ascii " "
.section .bss
    .lcomm buffer, 256
.section .text
.globl _start
_start:
    nop
    leal space, %esi
    leal buffer, %edi
    movl $256, %ecx

    cld
    lodsb
    rep stosb

    movl $1, %eax
    movl $0, %ebx
    int $0x80

make之後調試運行如下:

Breakpoint 1, _start () at stos.s:11
11    nop
(gdb) print/x $eax
$1 = 0x0
(gdb) x/16b &buffer
0x80490a0 <buffer>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x80490a8 <buffer+8>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
(gdb) s
12    leal space, %esi
(gdb) s
13    leal buffer, %edi
(gdb) s
14    movl $256, %ecx
(gdb) s
16    cld
(gdb) s
17    lodsb
(gdb) s
18    rep stosb
(gdb) print/x $eax
$4 = 0x20
(gdb) s
20    movl $1, %eax
(gdb) s
21    movl $0, %ebx
(gdb) x/16b &buffer
0x80490a0 <buffer>: 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
0x80490a8 <buffer+8>: 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20
(gdb)

輸出結果顯示程序達到了我們預期,stosb指令執行之後,內存位置buffer包含的都是空格。


书籍推荐