我没有8086汇编方面的丰富经验,如果您不写起始标签(start:
)和该标签的末尾,我想知道程序中会发生什么
( end start
)(围绕执行代码的标签)?
所以我的问题是,这些标签对于执行是必需的吗,代码是否访问了一些当排除这些标签时不应该访问的地址,并且这些包围执行代码的标签是否与start(=='{' )和Java类中main()
的结尾(=='}')?
*其他信息和结果
我正在编写一个程序,用于打印数组中包含的数字1-5。我尝试了添加和不添加标签的情况,结果如下:
;assembly for printing an array of the integers 1-5
;data segment
data segment
NIZA db 1,2,3,4,5
ends
;code segment
code segment
start: ;the "start:" label
;setting ds and es
mov ax,data
mov ds,ax
mov es,ax
mov bx,OFFSET NIZA
mov cx,5
pecatenje_na_niza:
mov dl,[bx]
add dx,48d
mov ah,2
int 21h
inc bx
loop pecatenje_na_niza
mov ah,1
int 21h
mov ah,4ch
int 21h
end start ;the "end start" label
ends
1)包括start:
和end start
:
2)不包括start:
和end start
(相同的代码,但不包括标签):
程序启动时,将执行以下几行,而这些行不在我包含start:
和end start
的那一行中:
(我找不到从模拟器复制的方法,所以我要粘贴屏幕截图)
这是执行以下代码行之前和之后模拟器中NIZA数组的值:
最后输出都是全零。
由于行add dx,48d
的存在,所以打印是原来的,所以这就是它打印的全部是00000
的原因。顺便说一下,每次执行mov dl,[bx]
时,DX都会重置。
这就是我现在所能理解和发现的。
答案 0 :(得分:3)
如果您不包括start
,则emu8086显然默认为从头开始。由于您将数据放在此处,因此指令只是将NIZA
数组值解释为代码。
1 00000000 0102 add [bp+si], ax
2 00000002 0304 add ax, [si]
3 00000004 050000 add ax, strict word 0
4 00000007 0000 add [bx+si], al
您可以看到1-5个字节,然后看到一些零填充。 CPU不在乎您是否打算将这些数据用作数据,如果它们在执行路径中,它将尝试将它们解码为指令。
答案 1 :(得分:2)
取决于所使用的汇编程序,我不熟悉emu8086作为汇编程序,而是作为仿真器,因此需要告知汇编程序程序的起始点或入口点在哪里。例如,在C中,这将是
int main(int argc, char *argv[]) {
行。
所有可执行文件都需要知道它们的入口点在哪里,因此在操作系统将其加载到内存中之后,正确的入口点将获得控制权。
在DOS早期,此入口点与代码段的距离为100h。如果未指定起始地址,则假定为100h偏移量。与您的代码和DOS .EXE文件一样,假定偏移为00h。因此,结果Jester expresses above。
组装者应允许您使用不同的技巧来指示起点。看起来您正在使用的汇编程序正在使用
end start
其他人可能会使用非常相似的技术。
但是,请小心使用“ end”关键字。一些汇编程序会看到此关键字,并忽略此文件中的所有内容。因此,如果您在
之后放置任何内容end start ;the "end start" label
在上面显示的源代码中,汇编器可能会忽略它。