如果您不在EMU8086中添加开始:和结束开始,该怎么办?

时间:2019-11-17 16:53:56

标签: assembly x86-16 emu8086

我没有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的那一行中:
    (我找不到从模拟器复制的方法,所以我要粘贴屏幕截图) extra lines added when <code>start:</code> and <code>end start</code> are not included
    这是执行以下代码行之前和之后模拟器中NIZA数组的值:

  • 之前: Array values before executing the starting code

  • 之后: Array values after executing the starting code

最后输出都是全零。

  • 输出: Result after the execution of the whole program

由于行add dx,48d的存在,所以打印是原来的,所以这就是它打印的全部是00000的原因。顺便说一下,每次执行mov dl,[bx]时,DX都会重置。

这就是我现在所能理解和发现的。

2 个答案:

答案 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

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