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