汇编语言第四章总结

基本语法结构:

    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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值