包含多个段的程序

在前一章我们提到0:200~0:2FF地址空间是相对安全的,但是这段空间的容量只有256个字节。

在操作系统中只要是通过操作系统申请的空间就都是安全的,操作系统负责给程序分配安全的空间。在操作系统允许的情况下,程序可以取得任意数量的空间。

按程序获取所需空间的时间,获取空间方法可分为两种:

  1. 在加载程序的时候为程序分配
  2. 在程序执行的过程中向系统申请

本书中不论描述第二种

对于汇编程序,如果需要他在被加载的时候取得所需的空间,就必须要在源程序中做出说明,对于汇编源程序来讲就是在汇编源程序中做出相应段的声明。

在代码段中使用数据

这样的想法是,在代码段中声明了数据。那么操作系统将其加载进入内存的时候就不可避免的需要为这些声明在代码段中的数据分配空间。虽然这样子看起来不是十分的优雅。

并且对于这个来说,还需要自己来计算数据的存储位置。

同时如果汇编程序的开头不是指令的话,那么就需要end声明来说明汇编程序的开始。给操作系统一个提示,告诉操作系统,程序的入口,在某某标号处。

在单任务操作系统中,可执行文件中的程序执行过程如下:

  1. 由其他程序将可执行文件中的程序加载入内存
  2. 设置CS:IP,即设置程序的入口(第一条要执行的指令)
  3. 运行结束,返回

伪指令end就是描述一个程序的入口,比如end start那么在编译连接以后,end指令指定的程序入口为start(一个标号地址),被转换称为一个入口地址,存储在可执行文件的描述信息中。操作系统就根据次信息,设置CS:IP。

将数据、代码、栈放入不同的段

为什么要这么做。事实上,不管怎么做,实际在内存中并没有很大的区别,那么为什么需要这个各个不同的段呢。

这实际上是为了适应我们人类的思维,让源代码看起来更加的优雅易读。

我们在汇编源程序中声明了不同的段,分别用来存储数据和代码。事实上这个全部都放在一个段里面之后被加载进内存并没有多大的区别。

我们不需要计算数据程序的地址,而直接可以时候段名来代替。

在说一遍,段寄存器是不能够直接使用直接量的,段名也不行,所以必须使用通用寄存器来做中转。

编写、调试具有多个段的程序

cx中的程序长度为整个汇编源文件翻译称为机器指令的长度,包括数据段

一个段至少会占用16个字节,

数据段是定义在程序段之前还是之后都无所谓

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/freesfu/p/11031129.html

时间: 2024-10-08 07:37:16

包含多个段的程序的相关文章

小甲鱼零基础汇编语言学习笔记第六章之包含多个段的程序

在前面的几个章节中,我们的程序都是只有一个代码段,本章我们开始学习如何编写包含多个段的程序. 1.在代码段中使用数据 首先考虑这样一个问题,计算以下8个数据的和,结果存放在ax寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身,可现在我们要累加就是已经给定了数值的数据. 代码如下: 1 assume cs:codesg 2 codesg segment 3 dw 0123H

汇编入门学习笔记 (五)—— 包含多个段的程序

疯狂的暑假学习之  汇编入门学习笔记 (五)-- 包含多个段的程序 参考: <汇编语言> 王爽 第6章 1.在代码中使用数据. assume cs:code code segment dw 0123h,0456h,0789h,0defh mov ax,0 mov bx,0 mov ax,4c00H int 21h code ends end dw 表示定义字型数据,db 表示定义字节型数据. 上面代码编译连接,用debug调试,-u cs:0 查看汇编代码,发现没有看到 mov ax,0  m

汇编语言(王爽) 第6章包含多个段的程序

程序到了内存中我们分为code(代码)段,也就是大部分指令段,数据段,栈 6.1 在代码段中使用数据 上图 dw表示define word定义一个字,16位 会出现cs执行的前16位是数据段,后面才是指令,所以要把IP设成10h 或者直接在第一条指令前面在start,再在最后面的end start 程序运行的第一条不是汇编指令可能会报错把 6.2 在代码段中使用栈 这的题目都是从内存单元的数据换到另一个内存单元 开始奇怪,为啥不直接换,还要专门定义一个栈空间出来做个中间体 查了资料才知道,内存单

王爽《汇编语言》第三版 第六章 包含多个段的程序

6.1 在代码段中使用数据 "dw"的含义是定义字型数据.dw即define word. 由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址. 因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0.2.4.6.8.A.C.E处. end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方. 6.2 在代码段中使用栈 6.3 将数据.代码.栈放入不同的段 我们用和定义代码段一样的方法来定义多个

《汇编语言》总结03 —— 包含多个段的程序

在我们一开始写的汇编源程序时,只有一个代码段,现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在总结第二提到过0:200~0:2FF是相对安全的,可这段空间容量只有256个字节,如果我们需要的空间超过256个字节该怎么办? 在操作系统的环境中,合法地通过操作系统取得的空间都是安全的,因为操作系统不会让一个程序所用的空间和其他程序以及系统自己的空间相冲突.在操作系统允许的情况下,程序可以取得任意容量的空间. 程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是程序在

汇编语言学习第六章-包含多个段的程序

本博文系列参考自<<汇编语言>>第三版,作者:王爽 在前面的介绍的程序中只有一个代码段.那么如果我们需要将代码,数据分别存储在不同的内存空间应该怎么办呢?我们知道我们不可能随便使用任何一段内存空间,因为我们这段内存地址空间可能存储着非常重要的内容.其实,这只是我们考虑的太多啦,一旦我们将程序载入内存后,操作系统为我们分配的用于程序运行的内存空间都是安全的,绝对不会与其他程序的内存空间相重叠的. 往往程序获取内存有两种方式:一种是在程序载入内存的时候操作系统已经分配好的内存空间,另外

汇编语言学习笔记(6)——包含多个段的程序

1.程序取得所需空间的方法有两种,一种是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请. 2.我们若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中做出说明.我们通过在源程序中定义段来进行内存空间的获取 3.程序运行的时候,CS寄存器中存放代码段的段地址. 4.在源程序中使用end 标号来指明程序的入口(要执行的第一条指令),所以程序架构就可以如下: assume cs:code code segment -- 数据 -- start: -- 代码 -- code en

汇编语言——包含多个段的程序

多个段在一起 问题:利用栈,将程序中定义的数据段数据逆序存放. 1 assume cs:codesg ; 定义代码段的位置(codesg的值就是cs寄存器的值) 2 codesg segment 3 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 4 ; dw(define word)的含义是定义字型数据,db->定义字节型数据 5 ; 由于我们是在代码段定义的这些数据,所以这些数据是在代码段的(即(cs)=(ds)) 6 dw 0,0,0,

汇编语言第六章-包含多个段的程序

(1)将下面的程序编译连接,用debug加载,跟踪然后回答问题 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