第六章——包含多个段的程序

下面,将学会:

  1. 如何设置,程序的起始位置;
  2. 将数据,程序、栈放入不同的段;
  3. 清楚的理解它们在内存中的位置分布。

  1. 最开始(首先),咱们将数据段,栈段,程序段,放在一个程序中(不分段)。
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,它们也会有对应的命令。

  1. 所以,咱们要跳过前面的数据,直接执行后面的代码(可以通过修改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除了通知编译器程序结束外,还可以通知程序的入口在什么地方。

  1. 上面可以看出,数据和代码在同一个段中。但是,我们将数据、代码、栈放入不同的段中。逻辑和管理或许或更清晰一些。

题目:编写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

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/88998870
今日推荐