Assembly 数据段中变量声明的顺序会导致不同的输出

Assembly 数据段中变量声明的顺序会导致不同的输出,assembly,x86-16,tasm,Assembly,X86 16,Tasm,我用TASM 我使用IO.h文件进行控制台的输入和输出。也适用于itoa和atoi 我的程序是:(目的是简单地复制到20h到两个内存位置并同时输出。) 我得到的结果是: here it is 32 here it is 12851 但是,当我对变量定义的顺序做一个小的更改时(我交换tmp2和num): 输出为: here it is 32 here it is 32 有人能解释为什么会这样吗? 第二个输出是我在这两种情况下所期望的 p、 s:还有,为什么我们必须使用start标签?我觉得非常

我用TASM

我使用IO.h文件进行控制台的输入和输出。也适用于
itoa
atoi

我的程序是:(目的是简单地复制到
20h
到两个内存位置并同时输出。)

我得到的结果是:

here it is
32
here it is
12851
但是,当我对变量定义的顺序做一个小的更改时(我交换tmp2和num):

输出为:

here it is
32
here it is
32
有人能解释为什么会这样吗? 第二个输出是我在这两种情况下所期望的


p、 s:还有,为什么我们必须使用
start
标签?我觉得非常奇怪,它将扩展到了代码段之外。如果没有该标签,它将无法正常工作。

您链接的
io.h
只包含一个在库中调用
itoa\u proc
的宏,因此我们不知道该过程是如何工作的。它可能会占用一些额外的空间,因此即使结果(
32
)放入2个字节,它也可能会覆盖以下内存位置,从而破坏您的值。请注意,
12851
0x3233
,它在内存中看起来像
0x33
0x32
,它只是
32
的ascii表示形式。这里只是猜测一下,但itoa可能首先生成右对齐的输出,然后将其移动到左侧


阅读文档或源代码(如果有),或者为输出字符串保留更多空间。我假设对于16位数字,7个字节就足够了:1表示可能的符号,5表示数字,1表示终止零。

end start
告诉汇编程序和链接器两件事:所有汇编源代码都在这里结束,而
start
是执行应该开始的地方。谢谢@AlexeyFrunze。
data segment
    msg2 db 13, 10, "here it is", 13, 10, 0
    tmp dw ?, 0
    tmp2 dw ?, 0
    num dw ?, 0
data ends
here it is
32
here it is
32