Assembly 数据段中变量声明的顺序会导致不同的输出
我用TASM 我使用IO.h文件进行控制台的输入和输出。也适用于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标签?我觉得非常
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