【汇编】包含多个段的程序

记录 2017-01-27 2 条评论 访问: 4,840 次

编程时要注意何处是数据,何处是栈,何处是代码。不要将其放入一个段,是程序混乱。
考虑使用多个段来存放数据。
我们用和定义代码段一样的方法来定义多个段,然后再这些段里定义需要的数据,或通过定义数据来获取栈空间。

assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
       mov ss,ax
       mov sp,16
       mov ax,data
       mov ds,ax
       mov bx,0
       mov cx,8
    s: push [bx]
       add bx,2
       loop s
       mov bx,0
       mov cx,8
   s0: pop [bx]
       add bx,2
       loop s0
       mov ax,4c00h
       int 21h
code ends
end start

end 表明程序结束。同时后面可以跟一个标号,指明这个程序的开始点。这个入口被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU 的 CS:IP 被设置指向这个入口,从而开始执行程序中的第一条指令。

定义多个段的方法

与定义代码段的方法一样

段名 segment
段名 ends

对段地址的引用

通过地址访问段中的数据。地址分为两部分,段地址和偏移地址。段名相当于一个标号,代表段地址。一个段中的数据的段地址可由段名代表,偏移地址取决于它在段中的位置。例如 data 段中的数据“0abch”地址是:data:6。
注意:

mov ds,data

这条指令是错误的,程序中对段名的引用,被编译器处理为一个表示段地址的数值。

代码段、数据段、栈段完全是我们的安排

在原程序中使用伪指令 “assume cs:code,ds:data,ss:stack” 将 cs, ds 和 ss 分别和 code, data, stack 段相连。这样做之后,CPU 是否就会将 cs 指向code, ds 指向 data, ss 指向 stack呢?当然不是!assume 是伪指令,由编译器执行,仅在源程序中存在,CPU 并不知道它们。不必深究 assume 的作用,只要知道需要用它将定义的具有一定用途的段和相关的寄存器联系起来就可以了。(我们随后还要用 mov 指令把相关段名对应的地址传递给寄存器)

总结

CPU 如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作占空间,完全是靠程序中具体的汇编指令,和汇编指令对 CS:IP, SS:SP, DS 等寄存器的设置来决定的。如何划分段是我们的习惯问题。合理的划分段可以让程序结构更加清楚。


除非注明,嗯VIEW文章均为原创,转载请以链接形式标明本文地址
本文地址:https://www.umview.com/assembly-language-3

本文由 Mark 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

2 条评论

  1. 摩天之星
    摩天之星

    好专业

  2. 论文代写服务的评论
    论文代写服务的评论

    感谢楼主的分析

添加新评论