(十)包含多个段的程序、end 和 dw的使用--汇编笔记

汇编语言

Posted by YiMiTuMi on March 20, 2020

包含多个段的程序

程序获取空间的两种方法:

 1)在加载程序的时候为程序分配。

 2)程序在执行过程中向系统申请。

我们若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中做出说明。我们通过在源程序中定义段来进行内存空间的获取。

在代码段中使用数据(end 标号 和 dw)

计算 0123H 0456H 0789H 0abcH 0defH 0fedH 0cbaH 0987H 的和(用循环)

实现:

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

dw 含义:定义字型数据。dw即“define word”。定义了8个字型数据,所占的内存大小为16个字节

由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以可以从CS中得到它们的段地址。

用dw定义的数据处于代码段的最开始,所以偏移地址为0,所以这8个数据就在代码段的偏移0、2、4、8、A、C、E处。程序运行时,它们的地址就是cs:0、cs:2、cs:4、cs:8、cs:A、cs:C、cs:E。(因为是字类型,占2个内存单元)

程序中用bx存放被加2递增的偏移地址,用循环来进行累加。(一个字占2个内存空间)

由于程序的入口不是我们所希望执行的指令,所以编译成可执行文件在系统中运行会出现问题。(前16位为dw数据)

实现2:

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除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。

以上程序中,我们用end指令指明了程序的入口在标号start处,也就是说 “mov bx, 0”是程序的第一条指令。

单任务DOS中,可执行文件中的程序执行过程如下:

 1)由其他的程序将可执行文件中的程序加载入内存。

 2)设置CS:IP指向程序的第一条要执行的指令(程序的入口),从而使程序得以运行。

 3)程序运行结束后,返回到加载者。

cs:ip指向程序的第一条要执行的指令,是由可执行文件中的描述信息指明的。可执行文件由描述信息和程序组成,程序来自于源程序中的汇编指令和定义的数据。描述信息则主要是编译、连接程序对源程序中相关伪指令进行处理所得到的信息。在上面程序中,用伪指令end描述了程序的结束和程序得到入口。在编译、连接后,由“end start”指明的程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中。当程序被加载入内存后,加载者从程序的可执行文件的描述信息中读到程序的入口地址,设置CS:IP。这样CPU就从我们希望的地址处开始执行。

指明CPU从何处开始执行程序格式:

end 标号

框架:

assume cs:code

code segment
		.
		.
		数据
		.
		.
start:
		.
		.
		代码
		.
		.

code ends

end start

仙人掌 – 坚强、讲爱情进行到底