如果不在 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 (相同的代码,但排除了标签):
当程序启动时,有几行会执行,但不在我包含 start:
和 end start
:
的行中
(我找不到从模拟器复制的方法,所以我要粘贴截图)
下面是执行这行代码前后模拟器中数组 NIZA 的值:
之前:
之后:
最后输出全为零。
- 输出:
因为有这一行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
在您上面显示的源代码中,汇编程序可能会忽略它。
我在 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 (相同的代码,但排除了标签):
当程序启动时,有几行会执行,但不在我包含
start:
和end start
:
的行中 (我找不到从模拟器复制的方法,所以我要粘贴截图)
下面是执行这行代码前后模拟器中数组 NIZA 的值:之前:
之后:
最后输出全为零。
- 输出:
因为有这一行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
在您上面显示的源代码中,汇编程序可能会忽略它。