NASM 紧随其后附加到带有内存的字符串

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

对于上下文,我在 64 位 Debian 发行版上使用 NASM。

我仍在学习汇编作为编写我自己的编程语言的一部分,但我最近遇到了一个我不确定如何处理的问题。以下是我的编译器吐出的一段代码:

section .text
global _start
section .var_1 write
    char_1 db 'Q', 0
section .var_2 write
    string_1 db 'Asdf', 0
section .var_3 write
    char_2 db 'W', 0
section .text
_start:
push 4 ; String length onto stack
push string_1
;; Push a raw char onto the stack
mov bl, [char_1]
push bx
pop ax
pop rbx
pop rcx
mov byte [rbx+rcx], al

如果我然后打印出

string_1
的值,我会看到
AsdfWQ
。据我了解,这是因为我使用
mov
命令追加加上我在字符串的终止符之后声明了一些数据。我一直在尝试在 Google 上四处搜索,但没有找到解决此问题的方法(部分原因是我不知道要搜索什么)。从概念上讲,我认为我可以将
string_1
之后的所有内容的地址移动到我附加的长度的偏移量,但是如果在那之后我有大约 40 条不同的数据,这似乎非常低效。所以我想弄清楚的是,我如何管理可能增加或减少装配大小的动态数据?


编辑

感谢 fuz 指出通过

brk
调用的动态内存分配有效,我对程序做了一些修改,但仍然遇到问题:

section .var_1 write                                                                                                                                                                           
    hello_string db '', 0                                                                                                                                                                      
section .var_2 write                                                                                                                                                                           
    again_string db 'Again!', 0                                                                                                                                                                
section .text                                                                                                                                                                                  
    _start:                                                                                                                                                                                    
                                                                                                                                                                                               
    ;; Get current break address                                                                                                                                                               
    mov rdi, 0                                                                                                                                                                                 
    mov rax, 12                                                                                                                                                                                
    syscall                                                                                                                                                                                    
                                                                                                                                                                                               
    ;; Attempt to allocate 8 bytes for string                                                                                                                                                  
    mov rdi, rax                                                                                                                                                                               
    add rdi, 8                                                                                                                                                                                 
    mov rax, 12                                                                                                                                                                                
    syscall                                                                                                                                                                                    
                                                                                                                                                                                               
    ;; Set the memory address to some label                                                                                                                                                    
    mov qword [hello_string], rax                                                                                                                                                              
                                                                                                                                                                                               
    ;; Try declaring a string                                                                                                                                                                  
    mov byte [hello_string], 'H'                                                                                                                                                               
    mov byte [hello_string+1], 'e'                                                                                                                                                             
    mov byte [hello_string+2], 'l'                                                                                                                                                             
    mov byte [hello_string+3], 'l'
    mov byte [hello_string+4], 'o'
    mov byte [hello_string+5], ','
    mov byte [hello_string+6], ' '
    mov byte [hello_string+7], 0
    ;; Print the string
    mov rsi, hello_string
    mov rax, 1
    mov rdx, 8
    mov rdi, 1
    syscall
    ;; Print the other string
    mov rsi, again_string
    mov rax, 1
    mov rdx, 5
    mov rdi, 1
    syscall

这导致

Hello, ello,
这意味着我仍在覆盖与
again_string
标签关联的数据?但我的印象是使用
brk
分配会在数据初始化后这样做?

string assembly memory-management x86-64 nasm
© www.soinside.com 2019 - 2024. All rights reserved.