0

我使用 TASM。

我将这个IO.h 文件用于控制台的输入和输出。也为itoaatoi

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

include io.h

data segment
    msg2 db 13, 10, "here it is", 13, 10, 0
    tmp dw ?, 0
    num dw ?, 0
    tmp2 dw ?, 0
data ends
code segment
    assume cs:code, ds:data
    start:
        ;load segments
    mov ax, data
    mov ds, ax

    ;store 20h
    mov ax, 20h
    ;copy to both num and tmp2
    mov num, ax
    mov tmp2, ax

    ;output
    output msg2
            ; (itoa puts the output-able into destination, "tmp" here)
    itoa tmp, tmp2
    output tmp

    ;output
    output msg2
    itoa tmp, num
    output tmp
    ;return control
    mov ax, 4c00h
    int 21h
code ends
    end start

我得到的输出是:

here it is
32
here it is
12851

但是,当我对变量定义的顺序进行小幅更改时(我交换 tmp2 和 num ):

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

有人可以解释为什么会这样吗?在这两种情况下,第二个输出都是我所期望的。

ps:另外,为什么我们必须使用start标签?我发现它延伸到代码段之外非常奇怪。没有那个标签就不能正常工作。

4

1 回答 1

2

您链接的io.h仅包含一个调用itoa_proc库中的宏,因此我们不知道该过程是如何工作的。它可能会使用一些额外的空间,因此即使结果 ( 32) 适合 2 个字节,它也可能会覆盖以下内存位置,从而破坏您的价值。请注意,128510x3233在内存中的样子0x330x32只是 的 ascii 表示32。只是在这里猜测,但itoa可能首先产生右对齐输出,然后将其移动到左侧。

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

于 2013-01-26T13:25:35.917 回答