下面,将学会:
- 如何设置,程序的起始位置;
- 将数据,程序、栈放入不同的段;
- 清楚的理解它们在内存中的位置分布。
- 最开始(首先),咱们将数据段,栈段,程序段,放在一个程序中(不分段)。
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end
但是这样,会导致,程序是从数据段(开头),开始向下执行。因为,虽然这些单元中存储的是数据,但它们也是二进制形式。如果,debug-u,它们也会有对应的命令。
- 所以,咱们要跳过前面的数据,直接执行后面的代码(
可以通过修改IP的值) 。至于前面的数据,在程序读入内存的时候,已经写入内存。它们并不需要执行。这里,我们增加start标号
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
end除了通知编译器程序结束外,还可以通知程序的入口在什么地方。
- 上面可以看出,数据和代码在同一个段中。但是,我们将数据、代码、栈放入不同的段中。逻辑和管理或许或更清晰一些。
题目:编写code段中的代码,将a段和b段中的数据依次相加,将结果存放在c段中。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax ;设置段基址
mov sp,16
mov bx,0 ;指针
mov cx,8 ;循环次数
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
经过调试,跟踪。
你会发现:
a=0710h,b=0712h,c=0713h。即数据段在程序段的前面,且,每个段的大小是16的整数倍(因为上面的是基址)。
参考文章:https://blog.csdn.net/u013018721/article/details/51219127