zoukankan      html  css  js  c++  java
  • 汇编学习(第四章开始)

    一、编写汇编源程序
    使用文本编辑器(如记事本、Nodepad++、UltraEdit等),用汇编语言编写汇编源程序
    二、编译连接
    使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件;

    再用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。
    三、执行可执行文件中的程序
    在操作系统中,执行可执行文件中的程序。

    操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如:设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。
    四、源程序包括 汇编指令 和 伪指令
    汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
    伪指令:没有对应的机器码的指令,最终不被CPU所执行。
    谁来执行伪指令呢?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。
    五:定义一个段
    segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。

    segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。

    一个段必须有一个名称来标识,使用格式为:
    段名 segment
    段名 ends
    一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。

    一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。

    End 是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令 end,就结束对源程序的编译。

    如果程序写完了,要在结尾处加上伪指令end 。否则,编译器在编译程序时,无法知道程序在何处结束。

    切记:不要搞混了end和ends。
    六:寄存器与段的关联假设
    assume:含义为“假设”。

    它假设某一段寄存器和程序中的某一个用 segment … ends 定义的段相关联。

    通过assume说明这种关联,在需要的情况下 ,编译程序可以将段寄存器和某一个具体的段相联系。

    七、源程序
    程序的结构(任务:编程运算 2∧3。)
    定义一个段
    实现处理任务
    程序结束
    段与段寄存器关联

    汇编程序
    assume cs:abc(段与段寄存器关联)
    abc segment(定义一个段)
    mov ax,2 (实现处理任务)
    add ax,ax
    add ax,ax
    abc ends(结束一个段)
    end (程序结束)
    八、程序返回
    我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?
    现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:程序返回。

    如何返回呢?
    应该在程序的末尾添加返回的程序段。
    mov ax,4c00H
    int 21H
    这两条指令所实现的功能就是程序返回。

    九、上机
    1、编辑 1.asm
    2、编译 masm 1.asm,成功得到1.obj
    3、连接 link 1.obj,成功得到1.exe

    以简化的方式编译和连接
    masm 1.asm;和link 1.obj;
    后面跟上分号

    如果想更快
    ml 1.asm
    直接生产1.obj和1.exe

    编译连和接的作用是什么呢?

    连接的作用有以下几个:
    当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;

    程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;

    十、DOS加载exe程序

    程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;

    这个内存区的前256 个字节中存放的是PSP(作用:dos用来和程序进行通信。)

    从 256字节处向后的空间存放的是程序。

    所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA×16+0。

    因为PSP占256(100H)字节,所以程序的物理地址是:
    SA×16+0+256= SA×16+16×16=(SA+16)×16+0
    可用段地址和偏移地址表示为:SA+10:0。

  • 相关阅读:
    validate BST
    LC282. Expression Add Operators
    nginx统计日志命令
    iptables和firewalld命令
    nginx安装
    测试服务器IO
    规范主机名和设置最大文件进程数
    Docker安装
    MySQL/MariaDB二进制安装
    Docker原理
  • 原文地址:https://www.cnblogs.com/poli/p/4637997.html
Copyright © 2011-2022 走看看