1 / 34

第二章 汇编语言与汇编程序

汇编过程. 检查源程序的语法错误,并给出出错信息。 产生 目标文件(. OBJ); 列表文件;(. LST ) 和 交叉索引文件(. CRF 文件) 。 展开宏指令。. 第二章 汇编语言与汇编程序. 宏汇编语言及编程. 汇编语言: 一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言 (机器语言的符号化描述) 。 宏汇编语言: 增加 伪、宏指令 语句构成汇编 语言程序设计语言 。. 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。. 连接程序. 机器码目标程序. MASM.EXE. LINK.EXE. 汇编 程序.

kory
Download Presentation

第二章 汇编语言与汇编程序

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 汇编过程 • 检查源程序的语法错误,并给出出错信息。 • 产生目标文件(.OBJ);列表文件;(.LST)和交叉索引文件(.CRF文件)。 • 展开宏指令。 第二章 汇编语言与汇编程序 • 宏汇编语言及编程 汇编语言:一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述)。 宏汇编语言:增加伪、宏指令语句构成汇编语言程序设计语言。 汇编: 汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序。

  2. 连接程序 机器码目标程序 MASM.EXE LINK.EXE 汇编程序 EXAM.ASM 汇编 EXAM.OBJ 连接 EXAM.LST 可选 ASCII 源程序 EXAM.EXE EXAM.COM EXAM.CRF 可执行程序 • 汇编过程 • 列表文件(.LST文件); • 同时列出汇编语言源程序和机器语言目标程序的文件。 • 交叉索引文件(.CRF文件) • 列出程序中使用的符号、变量和标号以及引用情况。 汇编与连接

  3. 常量、变量和标号 • 常量 汇编源程序翻译成机器码目标程序期间已经有确定数值的量。分为数字常量和符号常量两类。 • 宏汇编语句的基本格式 指令性语句——由指令构成 [标号:] 操作码操作数 [;注释] 如: START: MOV AX ,DATA 指示性语句——由命令(伪指令)构成 [名字/变量] 命令 参数 [;注释] 如: DATA SEGMENT AT 2000H (代码段不能如此指定段地址)

  4. 2.1符号指令中的表达式 2.1.1常量和数值表达式 • 常量 数字常量:直接用数字进行表示的常量。 二进制:10000100B、11110001020100B 十进制:12356D 十六进制:12ABH、0F56AH (字母打头必须前面补0,否则将出现汇编语法错误。) 如: MOV AX,100D MOV BL,0FAH MOV CL,1010 1000B

  5. 合法标识符: STA_124$ MOV_? @103 非法标识符: STA+124$ MOV ? 2.1符号指令中的表达式 符号常量:用标识符(常量名)表示的常量。 命名规则: 1)ASCII码字符 2)由A~Z、a~z、0~9 、?、@、$及下划线构成。 3)?不能单独作为标识符。 4)不能为保留字及运算符。

  6. 2.1符号指令中的表达式 • 符号常量定义 常量名 EQU(=) 数值或字母 例如: AA EQU 30 BB = 1000H CC EQU 10001010B QQ = ‘ABC’ MOV AX,AA MOV AL,AA MOV BX,BB 改善程序的可读性,程序的修改调试方便。 “=”可重复定义 EQU不可重复定义 常量不占有内存单元

  7. 2. 变量和地址表达式 变量是存储器中的数据或数据区的符号表示。 变量名即是数据的地址或数据区的首地址。 地址表达式是由变量、常量、寄存器(SI、DI、BX、BP)的内容和运算符组成的有意义的式子。 变量或地址表达式可给出指令中的存储器的地址。由于存储器是分段使用的,因此变量或地址表达式都具有3重属性:段地址、偏移地址和类型。

  8. 变量的段地址是指变量所在段的段首地址除以10H之商;变量的段地址是指变量所在段的段首地址除以10H之商; 变量的偏移地址是指变量所在段的段首址到该变量的字节距离; 变量的段地址和偏移地址分别用SEG或OFFSET两个算符来指定。 例如:变量W的段地址和偏移地址分别表示为SEG W和OFFSET W。

  9. [变量名]数据定义伪指令 表达式[,……] 变量名:数据的地址或数据区的首地址 数据定义伪指令:DB(定义字节)、DW(定义字)、DD(定义双字)、DQ(定义4字)、DT(定义10字节) 表达式:数值表达式、ASCII码字符串、地址表达式、?及n DUP(表达式) 变量的定义

  10. 例如,在数据段DATAl中定义的变量如下: Wl DW B3; B1 DB 'AB$’; W2 DW -5,1994H; B2 DB 4 DUP(?) ; D DD EB ; B3 DB 2 DUP(—1) DB l DUP(10,’E’) DB ’13’,1,3 在附加数据段DATA2中定义的变量如下: EB DB 8 DUP(?) EW DW ’AB’,’CD’

  11. 3. 标号 标号是指令地址的符号表示,也可以是过程名。 标号的定义方式有两种: (1)用“:”定义,直接写在指令助记符前。 如 CYCLE:MOV AL,[S1] (2)用PROC和ENDP伪指令定义过程。 标号代表指令的地址,因而它也有3个属性:段地址、偏移地址和类型。 标号的段地址:定义该标号所在段的段地址。 标号的偏移地址:标号所在段的段首址到该标号定 义指令的字节距离。 标号的类型有NEAR和FAR两种。

  12. 4. 标量和标号类型的变更 格式: 类型 PTR 地址表达式 PTR算符用来明确指出某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但仍保持它们原来的段地址和偏移地址属性不变。 如:BYTE PTR W1

  13. 4.1汇编语言的基本语法 • 段定义伪指令 • 格式:段名 SEGMENT [定位方式][组合方式][‘类别名’] … 段名 ENDS 定义了以段名命名的存贮段。汇编时给该段名分配一个段基值。 例如: DATA SEGMENT … DATA ENDS CODE SEGMENT … CODE ENDS 定义了二个段,段名分别为DATA、CODE。 • 指示性语句(伪指令)

  14. 4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • (X)定位方式:段的起始地址边界 • PAGE——指定起始地址的低8位是0,称页边界 • XXXX XXXX XXXX 0000 0000B • PARA——指定起始地址的低4位是0,称段边界 • XXXX XXXX XXXX XXXX 0000B • WORD——指定起始地址的低2位是0,称字边界 • XXXX XXXX XXXX XXXX XX00B • BYTE——指定起始地址为任意值。 • XXXX XXXX XXXX XXXX XXXXB • PARA为缺省方式

  15. 汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • (X)组合方式:连接程序时设定本段与其它段的连接方式。 • (模块化程序设计) • STACK:同名段构成一个连续的堆栈段,自动初始化SP。 • 空缺(NONE)不与任何段相连接。各段有独立段基址。 • (缺省方式)

  16. 4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段定义伪指令的参数 • 格式:段名 SEGMENT [定位类型][组合方式][‘类别名’] • (X)类别名:用单引号括起来的字符串。类别名相同的段按先后顺序存放在一连续的存贮区中,形成统一的物理段。(模块化程序设计)

  17. 4.1汇编语言的基本语法 • 指示性语句(伪指令) • 段寄存器说明伪指令 • 格式:ASSUME 段寄存器:段名1,段寄存器:段名2…… • 在代码段,告诉汇编程序CS、DS、ES、SS应具有的符号段基址,但是段寄存器(CS除外)还必须用传送指令赋值。一般紧跟在SEGMENT语句之后 例如:CODE SEGMENT PARA ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX ;传送指令赋值 …… CODE ENDS DATA SEGMENT …… DATA ENDS

  18. 4.1汇编语言的基本语法 • 指示性语句(伪指令) • 过程(子程序)定义伪指令 • 格式:过程名 PROC NEAR[FAR] • ………… • 过程名 ENDP • 过程名:过程的起始地址,如子程序定义。 • 类型:NEAR 近过程(主、子同段) • FAR 远过程(主、子在两个不同的代码段) 过程应由RET指令返回与远近无关。

  19. 4.1汇编语言的基本语法 • 宏汇编语言的基本格式 DATA SEGMENT • 由几个段构成,一般有数据段、代码段、堆栈段或附加数据段组成,至少要有一代码段。 • 代码段第一条指令必须有汇编起始标号START。 … DATA ENDS STACK SEGMENT STACK ‘STACK’ … STACK ENDS CODE SEGMENT BEGIN PROC FAR ASSUME CS:CODE,DS: DATA,SS:STACK … … RET BEGIN ENDP CODE ENDS END BEGIN PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX

  20. 2.5.1 系统功能调用 系统功能调用是IBM PC微机系统为汇编用户提 供的一个程序接口。系统功能调用共有4类。我们仅 介绍设备管理系统功能调用中基本的I/O管理功能。 使用系统功能调用的一般过程为:把调用号放入 AH中,设置入口参数,然后执行INT 21H指令,最后 分析处理出口参数。 键盘和显示器的DOS功能调用如表2-3所列。 本节仅介绍常用的1、2、9、10等4个系统功能调 用。

  21. 设置入口参数 在AH设置功能号m 执行中断指令INT N 分析、应用出口参数 调用方法

  22. 1. 1号功能调用 MOV AH,1 INT 21H 执行该调用时将等待键入,一旦有键按下就将该按键字符的ASCII码读入AL,并同时显示该字符。 2 . 2号功能调用 MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 本调用执行后,显示器显示待显示的字符。

  23. 3. 9号功能调用 MOV DX,待显示字符串的首偏移地址 MOV AH,9 INT 21H 本调用执行后,显示器显示待显示的字符串。执 行前要在DS数据段定义一以'$'结尾的字符串。 当需要输出数据区中某一字符串时,若该字符串 的尾部无 '$',一定要在其尾部置入一个 '$';若该字符 串中间就有 '$',则要采用2号功能调用逐个输出该字 符串中的字符。

  24. 4. 10号功能调用 MOV DX,数据区的首偏移地址 MOV AH,10 INT 21H 当需要输入字符串时,应在DS数据段中事先定 义一个变量数据区IBUF,其定义格式如下: IBUF DB 数据区大小,0,数据区大小 DUP(0) 其中:数据区大小是一个无符号数(2~255)。 执行该调用时将等待键入1~254个字符,键入的 字符数可以少不能多,最后以回车结束本调用。

  25. DUP(0)前的“数据区大小”应与前面一个“数据 区大小”一致,因为数据区的大小是由前面的即第1 个单元规定的,从第3个单元开始是预留给10号功能 调用装载键入字符的,留多了不能多装,是浪费;留 少了可多装,当输入的字符数超过预留的单元数时, 数据区就会自动往下延伸,冲掉紧跟其后的存储单元 中的内容,造成程序运行的混乱。第2个单元是预留 给装载10号功能调用时实际键入字符数的,实际键入 的字符数不包括回车(0DH)。

  26. 最后,要特别强调的是:2号功能调用、9号功能 调用和10号功能调用虽然未使用AL,但调用后也会破 坏AL中原来的内容。为防止AL中原来的内容被破坏 ,在调用前应先保护AL,调用后再恢复。

  27. 2.5.2 功能调用应用举例 例2 .5 编写汇编语言源程序,在显示器上显示 "wish you success!"。 只需将欲显示字符串的ASCII码存放到字节变量 数据区中(字节变量数据区一定要以 $ 结束),用9 号功能调用即可显示该字符串。程序如下: OBF DB ' wish you success!$ ' MOV DX, OFFSET OBF MOV AH, 9 INT 21H

  28. 例2 .6 将键入的4位十进制数(如5,则键入0005)以压缩BCD数形式存入字变量SW中。 程序如下:

  29. IBUF DB 5, 0, 5 DUP (0) MOV DX, OFFSET IBUF ;10号功能调用 MOV AH, 10 INT 21H MOV AX, WORD PTR IBUF+4 ;键入数的个位和十位送AX AND AX, 0F0FH ; ASCII码变非压缩BCD数 MOV CL, 4 SHL AL ,CL ;将十位移至AL的高4位 OR AL, AH ;将10位和个位拼合在AL中 MOV BYTE PTR SW,AL ;存BCD数字的十位和个位

  30. MOV AX, WORD PTR IBUF+2 ;键入数的百位和千位送AX AND AX, 0F0FH ; ASCII码变非压缩BCD数 SHL AL ,CL ;将千位移至AL的高4位 OR AL, AH ;千位和百位拼合在AL中 MOV BYTE PTR SW+1,AL;存千位和百位

  31. 例2 .7 "镜子"程序。 “镜子”程序的功能是接收并回显键盘输入的一 串字符,然后在下一行再将该串字符显示出来。可见 该功能主要由10号功能调用和9号功能调用来完成。 根据10号功能调用的入口参数,在数据段定义了字节 变量IBUF。第1个单元是允许键入字符数FFH,即最 多可接收除回车外的254个任意字符和一个回车;第2 单元是预留装载实际键入字符个数的;从第3单元开 始是预留装载键入字符的。

  32. 10号功能调用结束后,只要把字符 $放入存放回 车的单元 ,即可使用9号功能调用把自IBUF+2单元开始的字符送显示器显示。 "镜子"程序如下: OBUF DB '>' , 0DH, 0AH, ' $ ' IBUF DB 0FFH, 0, 255 DUP (0)

  33. MOV DX, OFFSET OBUF ;显示“>”, 回车,换行 MOV AH, 9 INT 21H MOV DX, OFFSET IBUF;键入并显示字符串 MOV AH, 10 INT 21H

  34. MOV BL, IBUF+1 ;取得实际键入的字符串长度 MOV BH, 0 MOV IBUF [BX+2], ‘$’;将"$"送字符串后 MOV DL, 0AH ;换行 MOV AH, 2 INT 21H MOV DX, OFFSET IBUF+2 ;再显示键入的字符串 MOV AH, 9 INT 21H

More Related