3.10 栈段
![_ _]()
mov ax, 1000
mov ds, ax
mov bx, 2000
mov ss, bx
mov sp, 10
push [0]
push [2]
push [4]
push [6]
push [8]
push [a]
push [c]
push [e]
![_2_ _2_]()
mov ax, 2000
mov ds, ax
mov ax, 1000
mov ss, ax
mov sp, 10
pop [e]
pop [c]
pop [a]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
4.1 一个源程序从写入到执行的过程
![_ _]()
-
一个汇编语言程序从写入到最终执行简要过程:
-
编写
- sublimtext、nodepad++、ultraEdit,用汇编语言写汇编源程序
-
编译和链接
- 使用汇编语言程序(MASM.EXE)对源程序文件进行编译,产生目标文件(.obj)
- 再用链接程序(LINK.EXE)对目标文件进行链接, 生成可在操作系统中直接运行的可执行文件
-
可执行文件
- 程序(从源程序中编译指令翻译过来的机器码)
- 数据 (源程序中定义的数据)
- 相关 描述的信息(比如:程序大小、占用内存空间)
-
执行
- 操作系统依照可执行卫建中的信息, 将执行文件中的机器码和数据加载到内存, 并进行相关的初始化, (比如:设置CS:IP)指向第一条执行的命令, 然后由CPU执行程序
4.2 源程序
assume cs:codesg # 假设代码段名称为codesg
codesg segment # 段的名字为codesg
start: mov ax, 0123
mvo bx, 0456
add ax, bx
add ax, ax
mov ax, 4c00
init 21h
codesg ends
end
-
sement和ends是成对出现的:
- 功能:定义以一个段, segment说明一个段的开始, ends表示结束
- 语法:段的名字 segment, 段的名字 ends
- 一个段必须有一个名称表示
- 一个汇编程序由多个段组成, 这些段被用来存放代码、数据、或栈空间使用
- 一个有意义的汇编程序至少要有一个段、用来存放代码
-
end:
- 是一个汇编程序的结束符, 编译器在编译汇编程序过程中, 如果遇到了end,就表示结束对源程序的编译
- 如果程序写完了。要在结尾处加上end, 否则编译器无法知道程序在何处结束
- end是结束, ends是段的结束
-
assume:
- 含义为“假设” 编译器会将codesg处理为一个地址,默认为cs代码段地址
- 它假设某一段寄存器和程序中的 某一个segment 。。。ends 定义的段相关联
- 通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系
-
汇编源程序:
- 伪指令(编译器处理)(上面的几个都属于伪指令)
- 汇编指令(编译为机器码)
- 源程序最终由计算机执行, 处理的指令和数据
-
标号:
- 一个标号指代了一个地址
- codesg:放在segment的前面,作为一个段的名称,这个名称最终被编译、链接程序 处理为一个段的地址
-
程序的返回:
- 一个程序结束后,将 CPU的控制权交还给使他得以运行的程序(执行它的程序,如:dos窗口), 我们成这个过程为:**程序返回**
- **应该在程序的末尾添加返回的程序段**:
-
- 这两条指令所实现的功能就是程序返回
4.3 编辑源程序
![_ _]()
4.4 编译和 链接
![Kapture_2019_09_09_at_0_11_24 Kapture_2019_09_09_at_0_11_24]()
-
编译和链接的作用是什么?
-
链接的作用有以下几个
- 当源程序很大时。可以将它分为多个源程序文件编译,每个源程序编译成为目标文件后,在用链接程序将他们链接到一起, 生成一个可执行文件
- 程序中调用了某些库文件中的子程序,需要将这个库文件和改程序生成的目标文件链接到一起, 生成一个可执行文件
- 一个源程序编译后,得到了有机器码的目标文件, 目标文件中的有些内容还不能直接用来生成可执行文件, 链接程序将此内容出来了为最终的可执行信息, 所以,在只有一个源程序文件, 而又不需要调用 某些库中子程序的情况下, 也必须用链接程序对目标文件处理, 生成可执行文件
4.5 可执行文件中的程序装入内存并运行的原理
![_ _]()
-
操作系统的外壳:
- 操作系统是由于多个功能模块组成的庞大、复杂的软件系统, 任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户使用这个程序来操作计算机系统工作
-
为了观察程序的运行过程,我们可以使用dug
- debug将程序加载到内存, 设置cs:ip的指向, 三debug不会放弃对CPU的控制, 这样就可以使用debug的相关命令来单步执行程序, 查看每条命令执行的结果
4.6 程序执行过程的跟踪
![debug_ debug_]()