汇编基础教程(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的作用:

    

 

在代码段中使用栈

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

  • assume cs:codesg
  •   codesg segment
  •          dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  •          ?
  •    code ends
  • 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指令后面的指令处)继续执行。

子程序的框架

 

参数和结果传递的问题

  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最实用,最简单编程软件。masm编程器汇编语言程序格式及MASM 汇编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连接后形成可执行文件(*.EXE)。 1、汇编语言程序的语句格式 汇编语源程序由语句序列构成。语句一般由分隔符分成的四个部分组成,它们有两种格式: (1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码中: 标号:硬指令助记符 操作数,操作数 ;注释 (2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编程序: 名字 伪指令助记符 参数,参数,... ;注释 ◆执行性语句中,冒号标号反映该指令的逻辑地址;说明性语句中的名字可以是变量名、名、子程序名或宏名等等,既反映逻辑地址又具有自身的各种属性。标号和名字很容易通过是否具有冒号来区分。 ◆硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令,伪指令助记符主要完成一些不产生CPU动作的说明性工作,在程序执行汇编程序完成处理。 ◆处理器指令的操作数可以是立即数、寄存器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号隔开。 ◆语句中由分号开始的部分是注释。 2、汇编语言源程序 这个以已经学过,主要有简化定义格式和完整定义格式 3、宏汇编程序MASM MASM6.11,安装文件5张软盘,默认安装在C:\MASM目录下,完整的MASM汇编系统包含很多文件,但最基本的有如下几个: ML.EXE 汇编程序 ML.ERR 汇编错误信息文件 DOSXNT.EXE MS-DOS扩展文件 LINK.EXE 连接文件 LIB.EXE 子程序库管理文件 如果采用集成开发环境PWB,主要涉及如下文件: PWWB.EXE 程序员工作平台 NMAKER.EXE 工程维护程序 NMAKE.EXE nmaker的MS-DOS扩展驱动程序 CV.EXE 源代码调试器CodeView CVPACK.EXE 调试信息压缩器,它为CODEVIEW准备一个可执行文件 HELPMAKE.EXE 帮助文件维护程序 BSCMAKE.EXE 浏览数据库创建程序 SBRPACK.EXE 浏览信息程序 PWBRMAKE.EXE BSCMAKE兼容驱动程序 *.MXT 各种PWB扩展工具文件 *.XXT 各种语言的PWB扩展文件 4、汇编语言的命令行开发过程 (1)原程序编写 用编辑软件书写*.asm源程序,如 LI6-1.ASM ;LI6-1.ASM .MODEL SMALL .STACK .DATA STRING DB 'Hello,Everybody!' .CODE .STARTUP MOV DX,OFFSET STRING MOV AH,9 INT 21H .EXIT 0 END (2)原程序汇编 汇编是将原程序翻译成由机器代码组成的目标模块文件的过程,如下: ML /c LI6-1.ASM 如果源程序没有语法错误,则生成一个目标模块文件LI6-1.OBJ (3)目标文件的连接 连接程序能把一个或多个目标文件和库文件和成一个可执行文件(.EXE、.COM文件),如下: LINK LI6-1.OBJ 连接程序的一般格式: LINK [/参数选项] OBJ文件列表 [EXE文件名,MAP文件名,库文件][;] 连接程序可以将多个模块文件连接起来,形成一个可执行文件;多个模块文件用“+”分隔。给出EE文件名就可以替代与第一个模块文件名相同的缺省名。给出MAP文件名将创建连接映像文件,否则不生成映像文件。库文件是指连接程序需要的子程序库等。“;”表示采用缺省值 事实上,ML汇编程序可以自动调用LINK连接程序(ML表示MASM和LINK),实现汇编和连接依次进行,如下即可完成可执行文件的生成: ML LI6-1.ASM ML的命令行格式如下: ML [/参数选项] 文件列表 [/LINK连接参数选项] 参数选项如下(注意参数是大小写敏感的): /AT——允许tiny存储模式(创建一个COM文件) /c——只汇编程序,不进行自动连接 /fl 文件名——川建一个汇编列表文件(扩展名LST) /Fr 文件名——创建一个可在PWB下浏览的.SBR源浏览文件 /Fo 文件名——根据指定的文件名生成模块文件,而不是采用缺省名 /Fe 文件名——根据指定的文件名生成可执行文件,而不是采用缺省名 /Fm 文件名——创建一个连接映像文件(扩展名MAP) /I 路径名——设置需要包含进(INCLUDE)源程序的文件的所在路径 /Sg——在生
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值