assembly - 如果不添加 start : and end start in EMU8086? 会发生什么

标签 assembly x86-16 emu8086

我在 8086 汇编方面没有太多经验,我想知道如果您不写起始标签 (start:) 和该标签的结尾,程序会发生什么 < br/>(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: and end start not included (相同的代码,但排除了标签):

  • 当程序启动时,会执行以下几行,但不在我包含 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 都会重置。

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

最佳答案

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

关于assembly - 如果不添加 start : and end start in EMU8086? 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902858/

相关文章:

assembly - 使用 ymm 寄存器作为 "memory-like"存储位置

c++ - 指令集如何区分值和引用

assembly - 如何在 16 位汇编程序中传递/检索 DOS 命令行参数?

linux - 用户空间中 x86-64 Linux 上 CS 和 SS 寄存器的含义?

c++ - 从汇编程序写入返回值时发生意外页面错误

assembly - 8086 无操作系统编程;分割

assembly - "Divide error -Overflow"8086 emu 错误

assembly - 显示 assembly 时间

assembly - 如何检查emu8086中CF标志是否为1?

x86-16 - 为什么下面的8086汇编代码只显示2559以下的数字?