汇编语言第四章总结
基本语法结构:
assume cs:段名 段名 segment …… 段名 end end
ps: assume 用于寄存器和特定段关联起来
程序返回:
mov ax, 4c00h int 21h
-p 执行 int 指令
告诉系统这款内存可以使用了
debug x.exe, 可以对某个程序进行过程跟踪
exe 程序加载过程:
1、找到以 SA:0000 为起始地址的容量足够的内存区;
2、在这个段内存区域的前256个字节创建一个 程序段前缀 (PSP) 的数据区域
DOS利用PSP来和被加载的程序通信(PSP 是啥我也不知道)
ps:百度查到PSP
PSP内有程序返回、程序文件名等信息
个人觉得挺有意思的:https://baike.baidu.com/item/%E7%A8%8B%E5%BA%8F%E6%AE%B5%E5%89%8D%E7%BC%80/2173868?fr=aladdin
3、从这段内存区域的256字节处开始,将程序装入SA+10H:0;
为了防止访问到PSP部分,PSP 和 程序段 的 物理地址连续,由于段地址不同
以及 寄存器 限制,二者无法互通
4、将该地址的段地址存入 ds 寄存器中,初始化其他相关寄存器,设置CS:IP指向
程序的入口
ps:这里还有重定位未涉及,我还没学到操作系统所以,先放放
为什么需要 编译 和 链接 分开?
当代码量过大时如果 编译 一步完成 那么如果 代码存在语法错误,每一次编译都需要
完完整整的重新编译一次,非常浪费时间,所以就把编译切割成一份份的,哪一份错了就重新编译哪一份
当所有文件都通过编译,链接 就将编译出来的 .obj 文件 连接起来 生成 .exe 文件
系统是如何知道,.exe 文件需要多少内存的?
.exe 文件中包含一些信息,这些信息包括了 程序入口、 文件大小、程序的位置,
系统就是根据这些信息 对 寄存器 进行 相关设置
eg:
start翻译出来的信息 就会成为 exe文件的 所包含的 程序入口,然后系统就会知道描述文件中
的内容 去设置 CS :ip。
下面是一个完整的ASM源码,实现了 栈内部数据的交换
assume cs:codesg codesg segment mov ax, 2000 mov ss, ax mov sp, 0 add sp, 10 pop ax pop bx push ax push bx pop ax pop bx mov ax, 4c00 int 21 codesg ends end