使用 nasm 在 Linux 二进制文件中获取可修改的保留内存

问题描述 投票:0回答:1

我正在尝试更改我的小型 x86 二进制文件中 nasm 的

section .bss
内的数据,但它不起作用。

我有一个用于 Linux 二进制文件的小 ELF 标头(类似于 here 中的最后一个标头)和预定义的字符串打印到 Linux 控制台:

global _start

BITS 32

        org     0x00010000

        ; tiny ELF header

_start:

        mov     ecx, string1
        mov     ebx, 1
        mov     dx, 8
        mov     ax, 4
        int     0x80

        xor     eax, eax
        mov     ebx, eax
        inc     eax
        int     0x80

section .data
string1 db  "Hello!", 0xa

但我需要一个可修改的文本缓冲区。我创造了

section .bss
printable:           resb    19 * 18

在我的源代码末尾并开始修改它们

        cld
        mov esi, string1
        mov al, 0x20
        mov ecx, 0x01
        rep stosb

由于分段错误而失败。无论是使用

mov [esi],al
更改一个字节还是使用
rep stosb
string1
printable
内存地址进行块更改 - 一切都会因分段错误而崩溃。

怎么了?

因此,我想要一个可修改的保留内存,但不放置在我的二进制文件中。所以我想通过代码构建文本。

linux assembly x86 nasm
1个回答
0
投票
mov     dx, 8
mov     ax, 4

你需要使用32位寄存器

cld
mov esi, string1
mov al, 0x20
mov ecx, 0x01
rep stosb

ESI 寄存器不是

rep stosb
的输入。为此使用 EDI。
例如。要将 string1 复制到 printable:

mov  edi, printable
mov  esi, string1
mov  ecx, 7
rep movsb
© www.soinside.com 2019 - 2024. All rights reserved.