如何将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?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Irvine32 库的 MASM 打印数组

MASM Assembly 中的数组(非常困惑的初学者)

在 Assembly x86 MASM 中连接字符串和数组的大小

组装(masm)数组操作

使用 MASM32 随机化装配中的数字

在 MASM 8086 程序集中读取多个文件