如何将Assembly(irvine masm)中的字符串初始化回null?
Posted
技术标签:
【中文标题】如何将Assembly(irvine masm)中的字符串初始化回null?【英文标题】:How to reintialize a string in Assembly (irvine masm) back to null? 【发布时间】:2020-12-03 11:10:05 【问题描述】:我需要将一个字符串重新初始化为空或满是空值 (?)。如何将我的字符串改回充满未初始化的空值? 例如,如果我有
s1 byte ?,?,?,?,?
所以我有一个由 5 个字符组成的空字符串,它们是 null
然后我做了一些操作,使字符串像这样:
s1 byte "hello",0
如果我想回到过去,我该怎么办:
s1 byte ?,?,?,?,?
【问题讨论】:
【参考方案1】:汇编器在 BSS 段中定义用?
声明的内存变量,该段未初始化。大多数操作系统实际上会在程序加载时清除为 BSS 分配的内存(出于安全原因),但程序员不应依赖此。
BSS 内存可能在程序开始时包含垃圾,您不应假设它包含 NULL 字节。
当你想回到s1 byte ?,?,?,?,?
,你不需要做任何事情,它已经包含了垃圾。当然,您可以在运行时使用 MOV
指令将明确的 NULL 字符存储到 s1
,如果这对您的程序至关重要的话。
【讨论】:
谢谢,有没有办法调整字符串的大小? 但是程序员不应该依赖这个。 - 取决于你写的操作系统。 C 编译器确实会生成依赖于零 BSS 的 asm。例如在为 GNU/Linux 编译时,godbolt.org/z/zeofqe 显示 GCC 在 BSS 中使用.zero 32
用于 int foo[8] = 0;
。
NULL 不是字符。也许您的意思是 ASCII NUL(一个 L)作为 0
的花哨名称,也就是 C 中的 '\0'
。如果我在谈论隐式长度的 C 字符串,我通常会写“0 终止字符串”。
当你想为不同长度的字符串复用一个内存变量时,要么在BSS中静态地分配它,大小对应所有字符串中最长的,要么分配每个字符串动态地使用操作系统的服务。
@PeterCordes 0x00
不是 可打印 字符。 Arzaan 可能被***文章 en.wikipedia.org/wiki/Null_character 弄糊涂了以上是关于如何将Assembly(irvine masm)中的字符串初始化回null?的主要内容,如果未能解决你的问题,请参考以下文章