代码段中存放数据

1.前面我们写的程序中,只有一个代码段,我们先来在代码段中使用数据,看看和单独一个数据段存放数据有什么差别。

考虑这样一个问题,编程计算以下8个数据的和,结果存放在ax寄存器中:

0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

我们希望循环进行累加,所以要将数据存放在一个连续内存当中,如何将这些数据存储在一组地址连续的内存单元中呢?我们可以用指令一个一个将他们送入地址连续的内存单元,可是这样又存在一个问题,到哪里去找这段内存空间?

从规范的角度讲,我们是不能自己随便决定哪段空间可以使用,应该让系统来为我们分配。我们可以在程序中,定义我们希望处理的数据,这些数据就会被编译,连接程序作为程序的一部分写到可执行文件中。当可执行文件被加载入内存时,这些数据也就同时被载入内存中。与此同时,我们要处理的数据也就自然而然的获得了存储空间。

程序如下:

assumme 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

解释一下,程序第一行中的“dw"的含义是定义字型数据。dw即define word。在这里,我们使用dw定义了8个字型数据(数据之间使用逗号分隔),他们所占的内存空间大小是16字节。

程序中的指令要对这8个数据进行累加,可这8个数据在哪呢?由于他们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从cs中得到他们的段地址。它们的偏移地址是多少呢?因为用dw定义的数据处于代码段的最开始,所以偏移地址是0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。

根据上面的分析,我们就会发现一个问题,代码段的开始部分并不是我们想要执行的代码,而是定义的8个数据,所以直接执行会产生问题,如何在这个程序编译之后再系统中直接运行呢?我们可以通过标号指定代码段的入口点

程序如下:

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

注意我们加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。这里,我们要再次讨论end的作用。end除了通知编译器程序结束之外,还可以通知编译器程序的入口地址在什么地方。在上述程序中我们用end指令指明了程序的入口在标号start处。

现在的问题是,根据什么设置CPU的CS:IP指向程序的第一条要执行的指令?也就是说,如何知道那一条指令是程序第一条要执行的指令?这一点,是由可执行文件中的描述信息指明的(Linux下面目标文件是ELF格式,在ELF Header中存有入口地址)。我们知道可执行文件是由描述信息和程序组成,程序来自于源程序中的汇编指令和定义的数据。我们上面的程序中,用伪指令end描述了程序的结束和程序的入口,在编译连接后,由end
start指明程序的入口,被转化为一个入口地址,存储在可执行文件的描述信息中。

归根结底,我们若要CPU从何处开始执行程序,只要在源程序中用”end 标号“指明就可以了。

代码段中存放数据,码迷,mamicode.com

时间: 2024-10-09 22:45:49

代码段中存放数据的相关文章

PE代码段中的数据

PE代码段中可能包含一些数据,比如 optional header中的data directory会索引到一些数据,比如import/export table等等: 还有一些jump table/switch table等等. 一般来说,direct/indirect call/branch的目标,可能是代码,也可能是数据,比如: mov eax, offset_funccall eax 以及 mov eax, offset_shellcodexor [eax + N]call eax 但是第二

TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识同一台计算机的不同的应用进程. 1)源端口:源端口和IP地址的作用是标识报文的返回地址. 2)目的端口:端口指明接收方计算机上的应用程序接口. TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接. 2.序号和确认号:是TCP可靠传输的关键部分.序号是本报文段发送

向值栈中存放数据与从值栈中读取数据

一.set方法方式 1.使用set方法存数据 public class GetValueStackAction extends ActionSupport{ //使用值栈的get方法往值栈中存数据 public String execute(){ //1获取ActionContext对象 ActionContext ctx = ActionContext.getContext(); //2.获取ValueStack对象 ValueStack vs =ctx.getValueStack(); /*

使用正则表达式提取一段标识语言( html 或 xml )代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有 空格等)。此处假设需提取 test 标签的 attr 属性值,请自行构建包含该标签的串

<test attr="ddd"> <test attr/s*=/s*["|'](.*?)["|'].*?> <test attr="ddd"> <test attr\s*=\s*[" |'](.*?)[" |'].*?>

替换数据库表中某个代码段中某个字段的某一段字符串sql

update 表名 set 字段=replace(字段同前面的,需要替换的字符串,被替换的字符串) where 条件 例如:update t_social_lead_learn set format_lead_learn =replace(format_lead_learn,'http://dsideal-yy.oss-cn-qingdao.aliyuncs.com','http://dsideal.obs.cn-north-1.myhuaweicloud.com') where id in (

操作系统学习(五) 、代码段和数据段描述符

一.代码段和数据段描述符格式 段描述符通用格式如下所示: 代码段和数据段描述符中各个位的含义如下所示: 二.代码段和数据段描述符类型 当段描述符中S标志位(描述符类型)被置位,则该描述符用于代码段或数据段.此时类型字段中最高比特位(第二个双字的位11)用于确定是数据段描述符(复位)还是代码段描述符(置位). 代码段和数据段描述符类型如下所示: 对于数据段描述符,类型字段的低3位(位8,9,10)分别用于表示已访问A,可写W,和扩展方向E,根据可写比特位W的设置,一个数据段可以是只读的,也可以是可

程序运行中(BSS段、数据段、代码段、堆栈)

程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小

C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区 域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读