对于上下文,我在 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
分配会在数据初始化后这样做?