【问题标题】:What happens if you don't add start: and end start in EMU8086?如果在 EMU8086 中不添加 start: 和 end start 会怎样?
【发布时间】:2019-11-17 16:53:56
【问题描述】:

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

所以我的问题是这些标签是执行所必需的,当这些标签被排除时,代码是否会访问一些不应该访问的地址,以及围绕执行代码的这些标签是否与 start(=='{' ) 和 main() 在 java 类中的结尾(=='}')?

*其他信息和结果

我正在编写一个程序来打印包含在数组中的数字 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。顺便说一句,DX 每次mov dl,[bx] 执行时都会重置。

这就是我现在能理解和找到的全部内容。

【问题讨论】:

    标签: assembly x86-16 emu8086


    【解决方案1】:

    如果你不包括startemu8086 显然会默认从头开始。由于您将数据放在那里,因此您的指令只是将您的 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 并不关心您是否打算将它们作为数据,如果它们在执行路径中,它将尝试将它们解码为指令。

    【讨论】:

    • 在哪里可以找到这些信息?
    • 究竟是什么信息?机器码?在指令集引用或使用反汇编程序。
    【解决方案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
    

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

    【讨论】:

    • 我忘记提及的事情是,我尝试了添加start: 标签和排除end start 的组合,并且发生了同样的事情,就好像我同时排除了它们一样在同一时间。似乎他们一直在牵手。
    • 开始:标签只是代码中的一个位置标记。这只是为代码提供了一种从当前段中提取偏移量的方法。 start: 标签可以在没有 'end start' 的情况下使用而不会出错,但不能相反。例如,没有 start: 标签的 'end start' 应该提供和错误。
    • @fysnet:你是对的:在 MASM / TASM 语法中,end 通常会使汇编程序停止读取输入。这就是为什么它被称为end 而不是例如。 FASM 的entry _start 只是设置了入口点而没有其他奇怪的效果。在其他工具链中,链接器需要知道入口点,因为组装+链接是分开的,并且目标文件元数据不存储入口点。例如在 GNU binutils 中 ld -e _start 是默认值,否则 .text 部分的顶部带有警告,就像 Jester 发现 emu8086 没有 end 所做的那样。
    • @fysnet 有没有什么有趣的文章可以推荐/链接?
    • 您使用的汇编器应该有这方面的文档。检查汇编程序的文档。例如,通过 Google 快速搜索,MASM 的地址为 docs.microsoft.com/en-us/cpp/assembler/masm/…。 TASM 应该有类似的文档。 NASM 肯定会。
    猜你喜欢
    • 2021-07-04
    • 2016-12-05
    • 2019-09-07
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多