1 / 131

第 4 章

第 4 章. 教学重点. 汇编语言源程序格式与开发 常量、变量和标号 汇编语言程序设计方法 顺序程序设计 分支程序设计 循环程序设计 子程序设计. §1 、 汇编语言简介. 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程是与其他高级语言程序设计大致相同. 一、源程序的构成及特点. 例:

denton
Télécharger la présentation

第 4 章

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. 第4章

  2. 教学重点 • 汇编语言源程序格式与开发 • 常量、变量和标号 • 汇编语言程序设计方法 • 顺序程序设计 • 分支程序设计 • 循环程序设计 • 子程序设计

  3. §1、汇编语言简介 • 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 • 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 • 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 • 汇编程序设计的过程是与其他高级语言程序设计大致相同

  4. 一、源程序的构成及特点 • 例: 1 DATA SEGMENT 2 SUM DB ? 3 DATA ENDS 4 CODE SEGMENT 5 ASSUME CS:CODE,DS:DATA 6 BEGIN: MOV AX,DATA 7 MOV DS,AX 8 MOV SUM,0 9 CYCLE: CMP SUM,9

  5. 10 JNA DONE 11 MOV AL,SUM 12 OUT PORT,AL 13 HLT 14 DONE:IN AL,PORT 15 ADD SUM,AL 16 JMP CYCLK 17 CODE ENDS 18 END BEGIN

  6. 特点: • 完整的汇编语言源程序由若干段组成,必须包含至少一个代码段,其他可有数据段、附加段或堆栈段,段与段之间的顺序可随意排列。但一般数据段要放在代码段之前。 • 每段以段定义语句SEGMENT开始,以ENDS结束。 • 每个代码段至少有一条设定代码段段基址的语句ASSUME ,其指明各段的段基址分别存于那个段寄存器。 • 通常一条语句占一行。 • 整个程序用END结束,否则错误。 • 源程序由语句序列构成

  7. 汇编语言(Assembly Language)――用助记符表示的指令以及使用它们编写程序的规则。汇编语言(Assembly Language)――用助记符表示的指令以及使用它们编写程序的规则。 • 汇编(Assembly)――将汇编语言书写的程序翻译成机器语言程序的过程。 • 汇编程序(Assembler)――将汇编语言书写的程序翻译成机器语言程序的软件。不要与汇编语言程序这个说法混淆,后者表示用汇编语言书写的程序,或称汇编语言源程序。

  8. 汇 编 • 汇编过程 • ASM86,MASM86(宏汇编) • 汇编语言的指令和机器语言的指令之间有一一对应的关系。

  9. 汇编程序的任务 汇编程序的任务是把汇编语言源程序模块转换为二进制的目标模块。  汇编程序把源文件转换为目标文件的过程需要对源文件进行两遍扫视。    • 汇编程序的输入是源文件(ASM),而主要输出是OBJ文件和LST文件。  第一遍扫视要确定源程序每一行的偏移地址,扫视后应提供一张符号表(或称标识符表),它把源程序所定义符号的偏移地址记录下来。第二遍扫视则产生所要求的OBJ、LST和CREF文件。

  10. 汇编程序在两遍扫视的过程中用到的主要工具有:1 地址计数器(Location counter)  汇编的第一遍扫视过程中,地址计数器的值可以用来确定每条指令的第一个字的偏移地址及数据段中变量名的值,这样就可以建立一张符号表。

  11. 2 符号表  汇编程序对源程序第一遍扫视的过程中建立了符号表,它把用户所定义的符号赋予当前地址计数器的值。3 机器指令表  它是一张固定的表格,给出所有指令的助记符及其对应的机器指令代码信息。4 伪操作表  给出所有伪操作名及有关信息。汇编程序在第一遍扫视后建立了符号表,在第二遍扫视的过程中,根据符号表、机器指令表和伪操作表把汇编语言指令翻译成机器语言指令,完成汇编任务。

  12. 二、汇编语言的语句格式 ⑴指令(执行)性语句——指令性语句用于表达处理器命令(也称硬指令),汇编后产生指令代码。规定CPU进行具体操作。 标号:指令助记符 操作数,操作数;注释 ⑵指示(说明)性语句——指示性语句即伪指令,不产生操作码,仅在汇编时起作用,指示源程序如何汇编、变量怎样定义、过程怎么设置等 名字 伪指令助记符参数,参数,…… ;注释

  13. 三、ASM—86的标记 1、标号、名字与标识符 • 标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔 • 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格没有冒号 • 标识符(Identifier)必须以字母开头;可以由字母、数字、下划线组成,默认情况下,不区别字母大小写;一般最多由31个字符,再长忽略不计。 • 一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字。 • (MASM,由字母数字和特殊字符?. @ _ $组成)

  14. 例 标号、名字和标识符 DATA SEGMENT SUM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX

  15. 例、判断下列标识符是否符合要求 M、PT\3、M2N、WMU、86ASE、 FGR#、F¥、”HG”、AAA、LOOP、 BDH1、KL L、3XD、G65、H7S3

  16. 2、保留字 • 保留字(Reserved Word)是汇编语言中有特定意义的字符(也称为关键字),主要有: • 指令助记符——例如:MOV、ADD • 伪指令助记符——例如:DB、DW • 操作符——例如:OFFSET、PTR • 寄存器名——例如:AX、CS • 其他的保留字——关系运算符等 例如:ABS、BYTE、DUP、COMMON、LE、LOW、SEG、EQ。 • 汇编语言大小写不敏感

  17. 3、界符(定义符) • 除字母、数字以外的8086允许使用的符号,可以做分隔符及表示一定的意义。 如:+、-、*、/、=、,、;、:等等。 4、常数指令中出现的固定值、立即数、地址等 范围 0—65535 • 可以有二进制(B)、十进制、八进制(Q)、十六进制(H)和字符串常数。

  18. 例:常数

  19. 字符串常量是用单引号或双引号括起来的单个字符或多个字符字符串常量是用单引号或双引号括起来的单个字符或多个字符 • 其数值是每个字符对应的ASCII码值 • 例如: ‘d’(等于64H) ‘AB’(等于4142H) ‘Hello, Assembly !’

  20. 5、注释 • 语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性 • 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理, 只在打印源程序时照原样打印。

  21. mfy@ustc.edu.cn 变 量 • 变量 • 代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。 • 为了便于对变量的访问,它常常以变量名的形式出现在程序中,它可以认为是存放数据存储单元的符号地址。 • (1)变量的定义与预置:定义变量就是给变量分配存储单元.且对这个存储单元赋于一个符号名(变量名),同时将这些存储单元预置初值。 • 定义变量是用数据定义伪指令DB,DW,DD等。例如:

  22. mfy@ustc.edu.cn 变 量 • 段属性(SEG):表示变量存放在哪一个逻辑段中(即变量所在段的段基值); • 偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节数; • 类型属性(TYPE):表示变量占用存储单元的字节数。

  23. mfy@ustc.edu.cn 变 量 • (2)数据定义伪指令:这种伪指令主要为数据项分配存储单元并预置初值。

  24. 四、表达式 • 数值表达式一般是指由运算符连接的各种常量所构成的表达式 • 汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量 • 表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定 • 汇编语言支持多种运算符 • 我们经常使用的是加减乘除(+ - * /) • 例如: mov ax,3*4+5 ;等价于:mov ax,17

  25. 1、操作数 可能是一个数据或是一个内存单元的地址 常用标号表示 如:PORT表示端口地址 存储器单元地址也常用标号表示 如: START:MOV AX, DATA1 ;START表示本条指令所在的地址 DATA1表示数据地址 其为物理地址包含段基址和偏移量

  26. 2、运算符 用运算符对一个或多个操作数进行运算,形成表达式。 ⑴算术运算符+、-、*、/、MOD(取余) 如:5+2-3*2 (=1) 19MOD7 (=5) 对地址运算只能用+、-,其余无意义 如:START+2、SUM-5 等 应用举例:P139

  27. ⑵逻辑运算符 AND、OR、NOT、XOR 逻辑运算按位进行,操作数必须是数据,结果也是数据 如:77H AND 84H (=04H) NOT 80H (=7FH) 注意:上述逻辑运算符与8086指令形式相同,但有本质区别,指令在执行时由CPU完成,逻辑运算符在汇编时完成 如: AND AL,86H AND PORT 设PORT=FOH 则汇编后本指令为: AND AL,80H

  28. ⑶关系运算符 6种 相等 EQ 不等 NE 小于 LT 大于 GT 小于等于 LE 大于等于 GE 关系运算符的操作数是2个数据,或同一段中2个存储单元的地址,汇编的结果: 关系成立值为 FFFFH 不成立值为0

  29. 例:MOV BX, PORT LT 50H 当PORT<50时,上条指令相当于 MOV BX,FFFFH 当PORT>50时,上条指令相当于 MOV BX,0 • 例:MOV BX,(( PORT LT 5)AND20) OR(( PORT GT 5)AND30) 如: PORT LT 5 成立 则为MOV BX,20H PORT GT 5 成立 则为MOV BX,30H

  30. ⑷分析运算符和综合(合成)运算符 将存储单元的地址分解为段基址、偏移量或者定义类型等。 5个分析运算符 • SEG:取内存单元的段基址 如 MOV AX,SEG DATA MOV DS,AX

  31. OFFSET 取内存单元的偏移量 如: MOV BX,OFFSET DAT1 • TYPE 运算符返回一个数值表示存储单元的类型 规定:字节1 字2 双字4 如:MOV AL,TYPE DAT1 ;若DAT1已定义为字节 则AL=1

  32. LENGTH 长度 计算一个已定义的存储区中存储单元的数目 注意:不是字节数,而是按照定义时的类型为基本单位计算 如:KAM DW 100 DUP(?) 则:LENGTH KAM (=100) 应用 MOV CX, LENGTH BUFF

  33. SIZE 尺寸 计算一个已定义的存储区的字节数 SIZE=LENGTH*TYPE 如上例中 SIZE KAM (=200)

  34. 另有2个综合运算符 • PTR 用它规定存储单元的类型,要与BYTE、WORD、DWORD联合使用 例: MOV BYTE PTR [2100H],0 NOT WORD PTR [SI] 另外:PTR 也可以改变一个已经规定了类型的存储单元的类型,但不另分配存储器。

  35. 例:DATA段中 XYZ DW 10 DUP(?) 然后用 PP EQU BYTE PTR XYZ QQ EQU BYTE PTR XYZ+1 KK EQU DWORD PTR XYZ+2 则:XYZ、XYZ+1单元为字节 XYZ+2~XYZ +5单元为双字 其余单元为字单元。

  36. THIS 与PTR相似用来改变存储区的类型。 不开辟新单元,与EQU联用 例:XYZ-2 EQU THIS BYTE XYZ-1 EQU THIS BYTE XYZ DW ? 则: XYZ-1=XYZ XYZ-2=XYZ+1 使用XYZ-1、XYZ-2时为字节单元 使用XYZ时为字单元。

  37. 相当于: XYZ DW? XYZ-1 EQU BYTE PTR XYZ XYZ-2 EQU BYTE PTR XYZ+1 THIS 常将EQU THIS右边的类型或距离赋给左边的变量或标号。

  38. 五、伪指令 1、标号赋值伪指令 EQU 给标号定义数值或其他标号 形式: 标号 EQU 表达式(数据或地址) 标号 EQU 旧标号(已赋值) 如:BOLD EQU 212 NEW EQU PORT+2 COUNT EQU CX CDB1 EQU ADE 用EQU定义过的标号未解除前不能重新定义,不用的标号可以解除。

  39. 解除语句:PURGE 形式:PURGE 标号1,标号2,…..标号n 2、定义存储单元的伪指令 规定存储单元的内容、长度及类型,最常用的是DB、DW 例: CR DB 0DH BUFF DW 3211H DO2 DB ? THIG DW 10 DUP(?)

  40. ST DB ‘how are you ?’ TABLE DB 00,01,03,02,06,04,05,07 DB 0FH,0EH,0CH,0DH,09,0BH,0AH,08 ALPH DB 5 DUP(1,2,4DUP(3),2DUP(1,0)) 定义时可以用表达式 如:IN-PORT DB PORT OUT-PORT DB POR+1 • DD 定义双字 DQ 定义4个字 DT 定义10个字

  41. 3、定义单元类型的伪指令 BYTE、WORD、DWORD常用在指令中 如:MOV BYTE PTR [DI],0 INC WORD PTR [BX+SI] JMP DWORD PTR [2000H] 4、段定义伪指令 SEGMENT、ENDS、ASSUME、ORG 在运行程序时,每条语句、所用数据等都在某一段中,因此因该给段起名字,规定段的起始地址,说明于其它段的关系等,要用段定义为指令。

  42. 一般用法:段名 SEGMENT ;段起始 … … 段名 ENDS ;段结束 另外: SEGMENT后可写[定位类型][联系类型][‘分类名’] 定位类型可用低4位为0、紧接起始、偶地址起始等 联系类型可规定各段不连接、同名连接等 分类名用单引号引起,在连接时起作用。

  43. 段设定语句 每个代码段中至少一条段设定语句,用来设定段寄存器的内容 一般形式: ASSUME CS:CODE,DS:DATA, SS:STACK,ES:DATA 除CS外,DS、SS、ES还需用MOV指令完成传送。 另外形式:ASSUME NOTHING 表示删除原设定过的段寄存器的内容。

  44. ORG 规定目标程序存放的偏移地址 形式:ORG 200H 例: DATA SEGMENT M1 DB2,3,4,5 ; M1偏移地址为0 DATA ENDS 比较:DATA SEGMENT ORG 2000H M1 DB2,3,4,5; M1偏移地址为2000H DATA ENDS

  45. 5、过程定义语句 PROC、ENDP、NEAR、FAR 定义过程:标号 PROC …. …. 标号 ENDP NEAR 表示段内调用形式如下: 标号 PROC NEAR (可省略) FAR 表示段间调用形式如下: 标号 PROC FAR

  46. 6、源程序结束伪指令 END 告诉汇编源程序到此结束,必须有END指 令,否则汇编出现错误。 形式:END 表达式(标号) 表达式的作用是将第一条指令的地址自动装入CS和IP。

  47. 例 :多字节相加 DATA SEGMENT FIRST DB 11H,22H,33H,44H SECOND DB 55H,66H,77H,88H SUM DB 20 DUP(?) DATA ENDS STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS

  48. CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX, DATA MOV DS,AX MOV AX, STACK MOV SS,AX MOV AX, TOP MOV SP,AX MOV SI, OFFSET FIRST MOV DI, OFFSET SUM

  49. MOV BX, OFFSET SECOND MOV CX, 04 CLD CLC ADITI: CALL AAA1 LOOP ADITI …. …. ….

  50. AAA1 PROC NEAR LODSB ADC AL, [BX] DAA STOSB INC BX RET AAA1 ENDP CODE ENDS END START

More Related