汇编基础教程(5)程序编写

程序


1     源程序

1.1  构成

寄存器与段的关联假设

标号

定义一个段

  1.     段名 segment
  2.     段名 ends

程序结束标记

程序返回

  1.     应该在程序的末尾添加返回的程序段。
  2.      mov ax,4c00H
  3.      int 21H

程序运行

   DOS是一个单任务操作系统。

 

1.2  源程序中的“程序”

汇编源程序:

程序:源程序中最终由计算机执行、处理的指令或数据。

注意

 

1.3  段结束、程序结束、程序返回

 

1.4  语法错误和逻辑错误

语法错误

逻辑错误


2    程序执行的过程

2.1  一个汇编语言程序从写出到最终执行的简要过程:

 

2.2  连接

作用

 

2.3  可执行文件

可执行文件中包含两部分内容:

执行可执行文件中的程序

可执行文件中的程序装入内存并运行的原理

exe的执行过程

    实际过程

    操作过程

 

2.4  程序执行过程的跟踪

   

总结


3    程序编写

3.1  两个基本的问题

  1.    reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
  2.    sreg的集合包括:ds、ss、cs、es。

 

3.2  数据在哪里

机器指令处理的数据所在位置

汇编语言中数据位置的表达

   汇编语言中用三个概念来表达数据的位置。

1、立即数(idata)

   

2、寄存器

 

3、段地址(SA)和偏移地址(EA)

存放段地址的寄存器也可以显性的给出。

显性的给出存放段地址的寄存器

寻址方式

   当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。

   

3.3  指令处理的数据有多长

  8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作

  对于这个问题,汇编语言中用以下方法处理。

  1.  下面的指令中,寄存器指明了指令进行的是字节操作:
  1.     下面的指令中,寄存器指明了指令进行的是字操作:

    在没有寄存器参与的内存单元访问指令中,用word ptr或byte ptr显性地指明所要访问的内存单元的长度是很必要的。

    否则,CPU无法得知所要访问的单元是字单元,还是字节单元

  1.    下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元:
  1.     下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单元:

有些指令默认了访问的是字单元还是字节单元,

 

3.4  数据处理

在代码段中使用数据

   

  1.   因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0、2、4、6、8、A、C、E处。
  2.   程序运行时,它们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。

探讨end的作用:

    

在代码段中使用栈

   完成下面的程序,利用栈,将程序中定义的数据逆序存放

   程序的思路大致如下:

   比如对于:

 

将数据、代码、栈放入不同的段

   所以,我们应该考虑用多个段来存放数据、代码和栈。

   我们不能用下面的指令:

   “代码段”、“数据段”、“栈段”完全是我们的安排

   CPU如何知道去执行它们?

 

3.5  模块化实现:call 和 ret 指令

ret 和 retf

ret

retf

可以看出,如果我们用汇编语法来解释ret和retf指令,则:

示例

 

call 指令

CPU执行call指令,进行两步操作:

主要应用格式

依据位移进行转移的call指令

转移的目的地址在指令中的call指令

转移地址在寄存器中的call指令

转移地址在内存中的call指令

 

call 和 ret 的配合使用

   我们看一下程序的主要执行过程:

 

    (1)前三条指令执行后,栈的情况如下:

    

    (2)call 指令读入后,(IP) =000EH,CPU指令缓冲器中的代码为 B8 05 00;

             CPU执行B8 05 00,首先,栈中的情况变为:

             然后,(IP)=(IP)+0005=0013H。

    (3)CPU从cs:0013H处(即标号s处)开始执行。

    (4)ret指令读入后:(IP)=0016H,CPU指令缓冲器中的代码为 C3;CPU执行C3,相当于进行pop IP,执行后,栈中的情况为:

    

            (IP)=000EH;

    (5)CPU回到 cs:000EH处(即call指令后面的指令处)继续执行。

子程序的框架

 

参数和结果传递的问题

猜你喜欢

转载自blog.csdn.net/hc1151310108/article/details/82718418