汇编语言第四章总结

基本语法结构:

    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

 

posted @ 2020-02-29 14:56  秦_殇  阅读(189)  评论(0编辑  收藏  举报