第四章 第一个程序
4.1 一个源程序从写出到执行到过程
1) 编写汇编源程序
2)对源程序进行编译连接
可执行文件包含两部分内容。
程序(从源程序中对编译指令翻译过来对机器码)和数据(源程序中定义对数据)
相关对描述信息(比如,程序有多大,要占用多少内存空间等)
3)执行可执行文件中对程序。 (将机器码和数据载入内存,并进行相关初始化CS:IP)然后由cpu执行程序。
4.2 源程序
第一个程序
assume cs:codeseg
codesg segment
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H
codesg ends
end
汇编语言中包含两种指令 为指令 和 汇编指令
0. 汇编指令 :有对应机器码对指令,可以被编译为机器码
1.伪指令:编译器来执行对指令,编译器根据为指令进行相关编译工作。
1)segment
定义一个段对开始和结束 xxx 为段名
XXX segment
XXX ends
2)end 一个汇编程序对结束标记,编译器在遇到此伪指令将结束编译。注意区分end和ends
3)assume 假设某一段寄存器和程序中对某一个segment ends定义对段相关联。 例如 assume cs:codesg 将cs 和codeseg对地址关联起来
2. 源程序中的“程序”
程序指最终由计算机执行,处理的指令或数据
源程序就是包含汇编指令和伪指令代码的文件。
3. 标号
例如codesg 一个标号指代一个地址。
4. 程序的结构
源程序由一些段构成。段中存放代码,数据,或将某个段当作栈空间。
assume cs:abc
abc segment
mov ax, 2
add ax, ax
add ax, ax
abc ends
end
5. 程序返回
mov ax, 4c00H
int 21H
让程序返回
段结束: ends
程序结束: end
程序返回 mov ax, 4c00H
int 21H
6 语法错误和逻辑错误
assume cs:abc
abc segment
mov ax, 2
add ax, ax
add ax, ax
mov ax, 4c00H ; return the program to system
int 21H
abc ends
end
这里使用Notepad++ 也可以使用dos下段Edit, VIM等
4.4 编译
OBJ 源程序编译成目标文件
NULL.LST 列表文件 (可忽略)
NULL.CRF 交叉引用文件 (可忽略)
4.5 连接
使用微软等Overlay Linker 3.60
NULL。MAP 中间文件 可忽略
LIB 库文件 将库和目标文件连接在一起。 由于没有调用任何子程序,这里可以忽略。
这里提示没有栈段段警告。暂时忽略。
连接段简单作用:
1)当程序很大当时候,可以将他分为多个源文件来编译,每个源文件编译为目标文件后,再用连接器将它们连接到一起,生成一个可执行文件;
2)程序中调用某个库文件到子程序,要将这个库文件和该程序生成到目标文件连接到一起,生成一个可执行文件。
3)目标文件中到内容还不足以作为可执行文件,连接器处理这些最终到信息。所以只有一个源程序到情况下对目标文件也需要进行连接。
4.6 简化对方式进行编译和连接
使用命令行参数
masm c:\cp4\1.asm;
link 1;
4.7 1.exe执行
由于并没有输出命令行信息,因此执行以后看不到任何效果。
4.8 谁可将可执行对程序壮哉入内存并使用它们
command.exe装载1.exe
操作系统的外壳
DOS中有一个command。com dos命令解释器dos启动以后由command.com来解释用户的输入
如果用户启动一个程序,输入该程序的名称,command首先找到该可执行文件,然后将该可执行文件装载入内存,设置CS:IP指向程序入口。
此后command暂停运行,CPU运行程序结束以后,返回command中。
汇编程序从写出到执行的过程
编程(edit) -》 1.asm -》编译(masm)-》1.obj -》 连接(link) -》1.exe -》加载(command)-》内存中的程序 -》运行
4.9 程序执行过程的跟踪
debug 1.exe
cx中存放的是程序的长度 cx =000cH
空闲内存区 : SA:0
PSP区 SA:0 ;和dos操作系统通信
程序区 SA+10H:0
将内存起的段地址存入DS,初始化其他相关寄存器后,设置CS:IP指向程序入口
还有一个称为重定位段操作和操作系统相关,这里不讲解。
1)加载程序后ds中存放程序所在内存区段段地址,这个内存起段偏移地址为0,则程序所在内存起段地址为ds:0
2)这个内存区前256字节存放段是PSP,DOS用来和程序通信。葱56字节后面存放段空间是程序
程序加载顺序是 : command 加载Debug, Debug加载1.exe
返回顺序是 1.exe返回Debug ,Debug返回到command
查看PSP区段内容
实验代码
assume cs:codesg
codesg segment
mov ax, 2000H
mov ss, ax
mov sp, 0
add sp, 10
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax, 4c00H
int 21H
codesg ends
end