汇编语言(王爽)-第一个程序


一个源程序从写出到执行的过程

  1. 编写汇编源程序

    产生存储源程序的文本文件

  2. 对源程序进行编译连接

    使用汇编语言编译程序对源程序文本文件进行编译,产生目标文件

    使用连接程序对目标文件进行连接,生成可执行文件

    可执行文件中包含:

    1. 程序(汇编指令翻译成的机器码)和数据(源程序中定义的数据)

    2. 相关描述信息

  3. 执行可执行文件中的程序

    由操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化,然后由CPU执行程序


源程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
assume cs:codesg

codesg segment

mov ax,0123H
mov bx,0456H
add ax,bx
add ax,bx

mov ax,4c00H
int 21H

codesg ends

end

伪指令

汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令

汇编指令可被编译为机器指令,被CPU执行

伪指令由编译器执行,编译器根据伪指令来进行相关编译工作

segment–ends

segmentends成对出现,功能是定义一个段,一个段必须有一个名称来标识

格式:

1
2
3
4
5
段名 segment

...

段名 ends

一个汇编程序由多个段组成,用于存放代码、数据或当作栈空间来使用

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

end

汇编语言的结束标记

当碰到伪指令end,就结束对源程序的编译

assume

用于假设某一段寄存器和程序中的某一个用segment--ends定义的段相关联,通过assume说明这种关联

源程序中的“程序”

可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行、处理的指令或数据,称为程序

程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中

标号

codesg,一个标号指代一个地址

段名称最终将被编译、连接程序处理为一个段的段地址

程序的结构

源程序是由一些段构成的。可以在这些段中存放代码、数据、或将某个段当作栈空间

编程运算2^3

  1. 定义一个段

    1
    2
    3
    abc segment
    ...
    abc ends
  2. 在段中写入汇编指令

    1
    2
    3
    4
    5
    6
    7
    abc segment

    mov ax,2
    add ax,ax
    add ax,ax

    abc ends
  3. 指出程序何处结束

    1
    2
    3
    4
    5
    6
    7
    8
    9
    abc segment

    mov ax,2
    add ax,ax
    add ax,ax

    abc ends

    end
  4. abc段被当作代码段来使用,所以,应将abccs联系起来

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    assume cs:abc

    abc segment

    mov ax,2
    add ax,ax
    add ax,ax

    abc ends

    end

程序返回

一个程序结束后,将CPU的控制权交还给使它得以运行的程序,被称为程序返回

在程序的末尾添加返回的程序段

1
2
mov ax,4c00H
int 21H

1.png

语法错误和逻辑错误

程序在编译时被编译器发现的错误是语法错误,例:拼写错误

在源程序编译后,在运行时发生的错误是逻辑错误,例:无程序返回


编辑源程序

可以用任意的文本编辑器来编辑源程序,只要最终将其存储为纯文本文件即可

2.png

3.png


编译

对源程序进行编辑后,得到源程序文件c:\1.asm

采用微软masm5.0汇编编译器

  1. 运行masm.exe

    4.png

    输入c:\1.asm(默认后缀为.asm

  2. 输出.obj文件

    5.png

    默认输出1.obj,可自定义输出目录

  3. 输入列表文件名称

    列表文件(.lst)是将源程序编译为目标文件过程中产生的中间结果,Enter跳过

    6.png

  4. 输入交叉引用文件的名称

    交叉引用文件(.crf)同列表文件用途相同,Enter跳过

    7.png

  5. 编译完成

    生成.obj目标文件

    8.png

    编译器输出的最后两行表示源程序无警告错误和必须要改正的错误

一般来说,有两类错误使我们得不到所期望的目标文件:

  1. 程序中有必须要改正的错误

  2. 找不到所给出的源程序文件


连接

对源程序进行编译得到目标文件之后,需对目标文件进行连接,从而得到可执行文件

使用微软Overlay Linker 3.60连接器

  1. 运行link.exe

    9.png

    输入1(默认后缀.obj

  2. 输入可执行文件名称

    10.png

  3. 输入映像文件名称

    11.png

    映像文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果,Enter跳过

  4. 输入库文件名称

    12.png

    库文件中包含一些可以调用的子程序,若程序中调用了某一库文件中的子程序,则在连接中,需将库文件与目标文件进行连接,生成可执行文件,Enter跳过

  5. 生成可执行文件

    13.png

    在当前路径下,出现1.exe,这是对目标文件1.obj进行连接所得到的结果

    若连接过程中出现错误,将得不到可执行文件

连接的作用

  1. 当源程序很大时,可以将它分为多个源程序文件进行编译,每个源程序编译成目标文件之后,再用连接程序将它们连接到一起,生成一个可执行文件

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

  3. 在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件


以简化的方式进行编译和连接

1
masm c:\1;

14.png

生成目标文件1.obj,并在编译过程中自动忽略中间文件的生成

1
link 1;

15.png

生成可执行文件1.exe,并在过程中自动忽略中间文件的生成


1.exe的执行

16.png

程序执行,无输出


谁将可执行文件中的程序装载进内存并使它运行

操作系统的外壳

任何通用的操作系统,都要提供一个称为shell(外壳)的程序,供用户使用这个程序来操作计算机系统进行工作

DOS中有一个程序command.com,在DOS中称为命令解释器,也就是DOSshell

DOS启动后,初始化后,运行command.com,在屏幕上显示盘符和路径组成的提示符

用户所输入的所要执行的命令,由command执行,完成后,显示结果并再次出现提示符,等待用户输入

用户执行程序,输入可执行文件名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序入口。之后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示提示符,等待用户的输入

DOS中,command处理各种输入(命令或可执行文件)。我们通过command来进行工作

程序执行过程

  1. DOS中执行1.exe,是正在运行的command1.exe加载入内存的

  2. command设置CPUCS:IP指向程序的第一条指令(程序入口),使程序运行

  3. 程序运行结束后,返回到command中,CPU继续运行command

汇编语言从写出到执行的过程

17.png


程序执行过程的跟踪

为了观察程序的运行过程,可以使用DebugDebug可以将程序加载入内存,设置CS:IP指向程序入口,但Debug并不放弃对CPU的控制,这样,可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行结果

18.png

使用R命令查看各寄存器设置情况

19.png

CX中存放的是程序的长度,1.exe中程序的机器码共15个字节,则CX中的内容为00FH

DOS系统中.EXE文件加载过程

23.png

程序加载后,DS存放程序所在内存区的段地址

DS中的值即为PSP的段地址SA

SA*16+0+256即为程序的物理地址,即为CS:IP的地址

使用U查看其他指令

20.png

12AE:0000-12AE:000E都为程序的机器码

T命令进行单步执行

执行到int 21时,使用P命令

21.png

执行int 21后,显示Program terminated normally,返回Debug,表示程序正常结束

在此过程中,程序的加载顺序是:command加载DebugDebug加载1.exe。返回顺序是:1.exe返回到DebugDebug返回到command

---------------The End---------------
0%