如果不在 EMU8086 中添加 start: 和 end start 会怎样?

What happens if you don't add start: and end start in EMU8086?

我在 8086 汇编方面没有太多经验,我想知道如果你不写起始标签 (start:) 和该标签的结尾 [=52],程序中会发生什么=](end start)(围绕执行代码的标签)?

所以我的问题是这个标签是否是执行所必需的,当这些标签被排除在外时,代码是否访问了一些不应该访问的地址,这些围绕执行代码的标签是否与 start(==' {') and the end(=='}') of main() in java class?

*其他信息和结果

我正在编写一个程序来打印数组中包含的数字 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: and end start not included (相同的代码,但排除了标签):

最后输出全为零。

因为有这一行add dx,48d所以打印出来就是这样,所以打印出来的都是00000。顺便说一句,每次 mov dl,[bx] 执行时 DX 都会重置。

这就是我目前所能理解和找到的全部内容。

如果您不包含 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 不关心您是否打算将它们作为数据,如果它们在执行路径中,它会尝试将它们解码为指令。

取决于使用的汇编器,我不熟悉emu8086作为汇编器,更多的是作为仿真器,需要告诉汇编器程序的起点或入口点在哪里。例如,在 C 中,这将是

int main(int argc, char *argv[]) {

行。

所有可执行文件都需要知道它们的入口点在哪里,因此在操作系统将其加载到内存后,正确的入口点将获得控制权。

在早期的 DOS 时代,这个入口点位于距代码段 100h 的偏移处。如果您没有指定起始地址,则假定为 100h 偏移量。与您的代码和 DOS .EXE 文件一样,假定偏移量为 00h was/is。因此结果 .

汇编程序应该允许您使用不同的技术来指示起点。看起来您正在使用的汇编程序使用

end start

其他人可能会使用非常相似的技术。

但是,请注意 'end' 关键字。一些汇编程序看到此关键字并忽略此文件中它后面的任何内容。因此,如果您在

之后放置任何内容
end start ;the "end start" label

在您上面显示的源代码中,汇编程序可能会忽略它。