[汇编语言]-第六章 包含多个段的程序 在一个段中存放数据,代码,栈

1- 程序取得所需空间的方法有两种,一是加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请.

2-在代码段中使用数据

编程计算以下8个数的和,结果存在ax寄存器中. 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

 1 assume cs:code
 2 code segment
 3     dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H    ;dw [define word]定义字符型数据
 4     mov bx,0
 5     mov ax,0
 6     mov cx,8
 7   s:add ax,cs:[bx]
 8     add bx,2
 9     loop s
10     
11     mov ax,4c00H
12     int 21h
13 code ends
14 end

如下图程序开始位置为:cs:ip 0B60:0000 但-u查看的代码,我们看不懂,第二图显示代码的开始位置为 0B60:0010,原因是什么呢?

程序开始 定义dw字符型数据,需要存储, 共8个字,16个字节.所以0B60:0000-0B60:0010存储[0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H],所以程序从0B60:0010开始.

0B60:0000到0B60:0010之间存储[0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H]

由以上可得出结论,dw定义的数据,存储从到段的开始0000处 开始存储.

但执行以上程序,需要把IP修改为0010才能正式执行代码.这样比较麻烦,所以引入start标记.请看以下代码

 1 assume cs:code
 2 code segment
 3     dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H    ;dw [define word]定义字符型数据
 4 start:mov bx,0
 5     mov ax,0
 6     mov cx,8
 7   s:add ax,cs:[bx]
 8     add bx,2
 9     loop s
10     
11     mov ax,4c00H
12     int 21h
13 code ends
14 end start

伪指令end的作用:

(1) 通知编译器程序结束

(2) 通知编译器程序的入口 [如上程序的入口在start处,即mov bx,0是程序的第一条指令]

以上总结: 我们想要CPU从何处开始执行程序,只要在源程序中用"end 标号"指明就可以 

有了以上方法,我们就可以这样安排程序框架 :

 1 assume cs:code
 2 code segment
 3         .
 4         .
 5         数据
 6         .
 7         .
 8 start:
 9         .
10         .
11         代码
12         .
13         .
14 code ends
15 end start

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

(1) 由其他程序(Debug, command或其他程序)将可执行程序文件中的程序加载入内存

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

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

3- 在代码段中使用栈

将程序中定义得数据逆序存放

 1 assume cs:code
 2 code segment
 3     dw    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
 4     dw    0,0,0,0,0,0,0,0
 5         
 6 start:  mov ax,cs
 7         mov ss,ax
 8         mov sp,32      ;将设置栈顶ss:sp指向cs:32
 9         
10         mov bx,0
11         mov cx,8
12     s:  push cs:[bx]
13         add bx,2
14         loop s        ;将以上代码段0-16单元中的8个字符型数据依次入栈
15         
16         mov bx,0
17         mov cx,8
18     s0: pop cs:[bx]
19         add bx,2
20         loop s0        ;以上依次出栈8个字符型数据到代码段0-16单元中
21         
22         mov ax,4c00H
23         int 21h
24 code ends
25 end start            ;指名程序的入口在start处

 dw作用:

(1) 定义数据 dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

(2) 开辟内存空间 dw 0,0,0,0,0,0,0,0

定义了8个字符型数据,也可以说开辟了8个字的内存空间,这段空间中每个字单元的数据依次是:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

实验:

 1 ;下面的程序实现依次使用内存0:0-0:15单元中的内容改写程序中的数据
 2 assume cs:code
 3 code segment
 4     dw  0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
 5 start:  mov ax,0
 6         mov ds,ax
 7         
 8         mov bx,0
 9         mov cx,8
10     s:  mov ax,[bx]
11         mov cs:[bx],ax
12         add bx,2
13         loop s
14         
15         mov ax,4c00H
16         int 21h
17 code ends
18 end start

 

 1 ;下面的程序实现依次使用内存0:0-0:15单元中的内容改写程序中的数据
 2 ;数据的传送用栈来进行,栈空间设置在程序内.
 3 assume cs:code
 4 code segment
 5     dw    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
 6     dw    0,0,0,0,0,0,0,0
 7 start:    mov ax,0
 8         mov ds,ax
 9         
10         mov ax,cs
11         mov ss,ax
12         mov sp,32
13         
14         mov    bx,0
15         mov cx,8
16     s:  push [bx]            ;内存0:0-0:15单元中的内容 入栈到ss:32
17         pop cs:[bx]          ;内存0:0-0:15单元中的内容 出栈到cs:0
18         add bx,2
19         loop s
20         
21         mov ax,4c00H
22         int 21h
23 code ends
24 end start
原文地址:https://www.cnblogs.com/galoishelley/p/3545505.html