NoteDeep

4.1 源程序写出到执行的过程

编写(NodePad++、UltraEdit等)
编译、连接(MASM.EXE,生成目标文件, LINK.EXE, 生成可执行文件 )
可执行文件
程序:源程序的机器码, 数据:源程序中的数据
相关描述信息:程序大小, 占用内存的大小
执行可执行文件中的程序
将机器码和数据加载入内存, 进行初始化

4.2 源程序

assume cs:codesg
codesg segment // 代码段
start: mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00h
int 21h
codesg ends
end

汇编指令:被翻译成机器码, CPU执行
伪指令:除了汇编指令, 没有对应的机器码
由编译器执行伪指令, 根据伪指令进行编译工作

XXX segment // 定义一个段
XXX ends // 段结束
成对使用
XXX:段名
一个汇编程序由多个段组成, 用来存放代码、数据、栈
至少有一个段

end
编程序的结束标记

assume
假设:寄存器和段的关联假设
assume cs:codesg // 将cs和代码段关联

程序

源程序中最终由计算机执行、处理的指令或数据
编译后的结果

标号

一个标号代表了一个地址

程序的结构

定义一个段
汇编代码处理
程序结束
段和段寄存器关联

程序返回

DOS中的程序运行
DOS是一个单任务操作系统

一个程序结束后将CPU的控制权交给使它得以运行的程序--程序返回

在程序的末尾添加返回的程序段
mov ax, 4c00H
int 21H // 中断

语法错误和逻辑错误


编译和链接

cmd
.asm-->.obj-->.exe
编译
masm 1.asm
链接
link 1.obj

简化
masm 1.asm;
link 1.obj;

简化
ml 1.asm

编译和链接
当源程序很大时, 可以将他们分为多个源程序文件来编译, 每个源程序编译成目标文件后, 再用链接程序将他们链接到一起, 生成一个可执行文件

链接
将机器码目标文件中的一些不能直接用来生成可执行文件的部分处理成可执行信息

可执行文件中的程序装入内存并运行的原理

操作系统的外壳

操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统, 都要提供一个称为shell(外壳)的程序, 用户通过这个程序来操作计算机系统工作。

DOS中有一个程序command.com, 称为命令解析器

4.1:
执行程序时, command将程序加载入内存
command设置CPU的CS:IP指向程序的第一条指令, 从而使程序得以运行
程序运行结束后, 返回到command中, CPU继续运行command


编译--链接--加载入内存--运行


程序执行过程的跟踪

观察程序运行的过程, 可以使用debug

debug将程序载入内存, 设置CS:IP指向程序入口, debug不放弃对CPU的控制, 就可以用debug相关命令单步执行程序, 查看每条指令的执行结果

执行程序
debug32 1.exe
寄存器CX:存放程序的长度

EXE文件中的程序加载过程

DS和CS相差10, 256个字节

1.找到一段起始地址SA:0000的容量足够的内存
2.前256个字节, PSP, DOS要利用PSP来和加载程序通信
3.SA+10:0, 程序开始的地方

还有一步重定位的工作

总结

ds中存放程序所在内存区的段地址, 偏移地址为0
这个内存区前256字节存放PSP, dos用来和程序进行通信
256字节之后的空间存放程序

从ds中可以得到PSP的段地址SA
可以得到程序的物理地址

用u查看指令
用t单步执行
int 21 用p命令执行
显示program termainated normally, 返回到debug中
表示程序正常结束

q命令退出debug, 返回到command中

实验三













评论列表

    4.1 源程序写出到执行的过程
    4.2 源程序可执行文件中的程序装入内存并运行的原理程序执行过程的跟踪
    实验三