我使用 TASM。
我将这个IO.h 文件用于控制台的输入和输出。也为itoa
和atoi
。
我的程序是:(目的是简单地复制到20h
2 个内存位置并输出两者。)
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
标签?我发现它延伸到代码段之外非常奇怪。没有那个标签就不能正常工作。