html5-img
1 / 78

第三章 汇编语言程序设计

第三章 汇编语言程序设计. 1. 4. 2. 3. 本章重点. 汇编语言源程序的结构 及 语句格式. 伪指令. 功能调用. 汇编语言程序设计. 3.1 汇编语言基础 ——3.1.1 计算机设计语言. 机器语言 汇编语言 高级语言. 面向机器 的语言. 机器语言. 汇编语言. 高级语言. 2. 汇编语言. 用汇编语言编写源程序,经过汇编程序和 连接程序生成目标程序和执行程序 文件名.ASM 文件名.OBJ 文件名.EXE. 目标 程序. 连接. 汇编. 汇编语言 源程序. 执行 程序. 编辑程序

chelsi
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. 第三章 汇编语言程序设计

  2. 1 4 2 3 本章重点 汇编语言源程序的结构及语句格式 伪指令 功能调用 汇编语言程序设计

  3. 3.1 汇编语言基础 ——3.1.1计算机设计语言 机器语言 汇编语言 高级语言 面向机器 的语言 机器语言 汇编语言 高级语言

  4. 2. 汇编语言 用汇编语言编写源程序,经过汇编程序和 连接程序生成目标程序和执行程序 文件名.ASM文件名.OBJ 文件名.EXE 目标 程序 连接 汇编 汇编语言 源程序 执行 程序 编辑程序 EDIT.EXE 汇编程序 MASM.EXE TASM.EXE 连接程序 LINK.EXE

  5. 2. 汇编语言 • 汇编语言源程序 用助记符编写 汇编语言源程序 机器语言目标程序 汇编程序 源程序的编译程序

  6. 2. 汇编语言——汇编程序 • 汇编程序的主要功能 • 是将由汇编语言(助记符)编写的源程序 • 翻译成 • 用机器语言(二进制代码)编写的目标程序 。

  7. 3.1.2 汇编语言程序结构 汇编语言源程序通常由一个或几个程序 模块组成,每个模块一般由三个逻辑段组成: 数据段——存放数据、变量 堆栈段——堆栈区域 代码段——存放程序指令

  8. 3.1.2 汇编语言程序结构 堆栈段名 SEGMENT … 堆栈段名 ENDS 代码段名 SEGMENT … 代码段名 ENDS 数据段名 SEGMENT … 数据段名 ENDS 附加段名 SEGMENT … 附加段名 ENDS

  9. 基本的汇编语言程序框架 stack SEGMENT PARA ‘stack‘ DB 100 DUP(‘stack’) stack ENDS data SEGMENT <数据、变量在此定义> data ENDS code SEGMENT ASSUME CS:code, DS:data, ES:data, SS:stack start: MOV AX, data MOV DS, AX MOV ES, AX <此处加入你自己的程序段> MOV AH, 4CH INT 21H code ENDS END start 堆栈段 数据段 代码段

  10. 3.1.3 汇编语言程序语句——类型 • 汇编语言的语句类型有指令性语句、指示性语句。 指令性语句—指令 指示性语句—伪指令 CPU执行的语句,能够生成目代码 CPU不执行,而由汇编程序执行的语句,不生成目标代码

  11. 3.1.3 汇编语言程序语句——格式 指令性语句: [标号: ]指令助记符[目的操作数],[源操作数] [;注释] 操作码 注释前加分号 指令的符号地址,标号后要有冒号 如:START; MOV AX,1000H ;1000H送AX寄存器 指示性语句格式: [名字]伪指令助记符 操作数 1[,操作数2,…] [;注释] 变量的符号地址,其后不加冒号 指示性语句中至少有一个操作数 如:DSEG SEGMENT DB 32,45H,09H,0ACH

  12. 3.1.3 汇编语言程序语句——格式 • 区分标号和名字 • 标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。 • 英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。

  13. 3.1.3 汇编语言程序语句——格式 操作码: 指令码 命令CPU要完成的操作 伪指令助记符 指示汇编程序要完成的操作 用来定义变量,分配存储单元 指示程序开始和结束等 注释: • 用分号作为注释的开始 • 用于说明程序或语句的功能,以便于阅读和理解

  14. 3.1.4 汇编语言操作数 寄存器 存储器单元 常量 变量或标号 表达式 操作数 数据项

  15. 3.1.4 汇编语言操作数——常量 • 常量:指在汇编时已经有确定数值的量。 • 数字常量:没有任何属性的纯数值 • 二进制数,以B结尾。如01001101B。 • 十进制数,如85。 • 十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。 • 字符串常量:用引号括起的1个字符或多个字符 例:‘A’,‘ERROR!’ 汇编时被译成ASCII码45H,52H,52H,4FH,52H,21H

  16. 3.1.4 汇编语言操作数——常量的应用 在程序中,常量主要出现在: 1)指令语句源操作数中做立即数,它应与目的操作数的位数相一致,可以是8位或16位的。 2)在指令语句中的基址加变址的寻址方式中作位移量。 3)在数据定义伪指令中。 例如: MOV AX,1234H MOV BX,[SI+32H] DB 12H;定义一个字节数据

  17. 3.1.4 汇编语言操作数——变量 变量——即内存中的存储单元或数据区的符号表示。这些数据在程序运行期间随时可以修改。 变量名——是存储单元(数据区)的符号地址或名字。即是数据的地址或数据区的首地址。可由数据定义伪指令定义。 • 变量也有三个属性: • 段地址—变量所在段的段地址 • 偏移量—变量单元地址与段首地址之间的位移量。 • 类 型—有BYTE、WORD和DWORD三种。 • 变量在程序中作为存储器操作数被引用

  18. 3.1.4 汇编语言操作数——变量的定义与预置 定义变量就是给变量分配存储单元,且对这个存储单元赋予一个符号名,即变量名,同时将这些存储单元预置初值。 VAR-DATA SEGMENT DATA1 DB 12H DATA2 DB 34H DATA3 DW 9876H VAR-DATA ENDS

  19. 3.1.4 汇编语言操作数——变量属性 定义变量是用数据定义伪指令DB,DW,DD等。经过定义的变量,每个变量均有三个属性: (1)段属性(SEG) (2)偏移量属性(OFFSET) (3)类属性(TYPE)

  20. 3.1.4 汇编语言操作数——变量段属性 • 段属性(SEG):表示变量存放在哪一个逻辑中,即变量所在段的段基值。 例如: VAR-DATA SEGMENT DATA1 DB 12H DATA2 DB 34H DATA3 DW 9876H VAR-DATA ENDS 三个变量都存放在VAR_DATA逻辑段中。当在指令中要对这些变量进行存取操作时,事先要把它们所在段的段基值存放在某一个段寄存器中。

  21. 3.1.4 汇编语言操作数——变量偏移量属性 • 偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节 数。 例如:变量DATA1的偏移量为0,而DATA2的偏移量为1,DATA3的偏移量为2。 • 段属性和偏移量属性构成了变量的逻辑地址。 类属性 • 类属性(TYPE):表示变量占用存储单元的字节数 • 类属性是由数据定义伪指令DB,DW,DD来规定的 变量DATA1,DATA2的类属性为字节;而DATA3的类属性为字;如果用DD定义,类属性为双字。

  22. 3.1.4 汇编语言操作数——标号 • 标号——指令所在内存单元的符号地址 • 有三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR: NEAR—表示标号所在语句与转移指令/ 调用指令在同一码段内,跳转时 只需改变IP即可。 FAR—标号所在语句与转移指令/调用 指令不在同一代码段内。 若没有对类型进行说明,默认为NEAR。 • 标号通常作为转移指令或CALL指令的转移地址。

  23. 3.1.4 汇编语言操作数——标识符 • 标识符——标号和变量名 使用规则 组成:A-Z(不分大小写), 0-9, ?@ . _ $ 不能以数字开头,句号(.)只能作为首字符 长度小于31个字符 不能与保留字(指令助记符、伪指令、预定义符号等)重名 不能重复定义 例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #HELP, +

  24. 3.1.4 汇编语言操作数——表达式 • 表达式是常数、寄存器、标号、变量与 运算符的组合。 • 有数字表达式和地址表达式两种。 • 汇编时按优先规则对表达式进行计算,计算出具 体的数值或地址。运行时不能改变。 • 表达式中的运算符有6类: 算术、逻辑、关系、取地址、属性、杂类。

  25. 3.1.4 汇编语言操作数——表达式 1)算术运算符—— +、-、*、/,MOD • 用于数字表达式, • 例:MOV AX,4*1024 汇编后的形式为: MOV AX,4096 • 用于地址表达式, • 例:LEA SI,TAB+3 • 若TAB的偏移地址为1000H, 则汇编后的形式为:LEA SI,[1003H]

  26. 例:MOV CL,36H AND 0FH 汇编后:MOV CL,06H 例:AND AX, 3FC0H AND 0FF00H 汇编后:AND AX, 3F00H。 不要把逻辑运算符与逻辑运算指令混淆 逻辑运算符只能用于数字表达式中 3.1.4 汇编语言操作数——表达式 2)逻辑运算符—— AND、OR、XOR、NOT

  27. 3.1.4 汇编语言操作数——表达式 3)关系运算符——EQ、NE、LT、GT、LE、GE • 关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1 关系为假,结果为全0 例:MOV BX,PORT GT 300H 若PORT的值大于300H, 汇编后: MOV BX,0FFFFH 否则汇编后:MOV BX,0

  28. OFFSET只能取静态的偏移地址; LEA指令即可取静态,也可取动态的偏移地址 3.1.4 汇编语言操作数——表达式 4)取地址运算符——SEG、OFFSET SEG:取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 例:VAR DB 12H …… MOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG VAR ;取变量VAR的段地址 注意,以下指令的异同: MOV BX, OFFSET VAR LEA BX, VAR

  29. 3.1.4 汇编语言操作数——表达式 5)取值运算符——TYPE、LENGTH、SIZE • TYPE 取变量的类型值(1,2,4) • 变量的类型:存取该变量中的数据所需要的字节数 • 例如:用DB定义的变量,其类型为1; • 用DW定义的变量,其类型为2; • 用DD定义的变量,其类型为4;依次类推。

  30. 3.1.4 汇编语言操作数——表达式 5)取值运算符——TYPE、LENGTH、SIZE • LENGTH 取所定义变量的长度 (即变量中元素的个数) • SIZE 取所定义存储区的字节数 (=TYPE*LENGTH) 例:VAR DW 1,2,3,4,5 则 TYPE VAR = 2 LENGTH VAR = 5 SIZE VAR = 10

  31. 3.1.4 汇编语言操作数——表达式 6)属性运算符——PTR • 用来指定地址操作数的类型。 格式:<类型> PTR <地址操作数> 类型∈{BYTE, WORD, DWORD, NEAR, FAR} • BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址 • NEAR、FAR 用于描述转移、调用的目的地址

  32. 3.1.4 汇编语言操作数——表达式 7)其它运算符 • 方括号: [ ]方括号中内容为操作数的偏移地址 • 段转移符 段寄存器名:[ ]用于修改默认的段基地址 • 例: MOV AX,[BX] MOV AX,ES:[BX]

  33. 例:MOV BYTE PTR[DI],0 ;字节类型 MOV WORD PTR[DI],0 ;字类型 MOV [DI],0B5H ;类型不定 例:STR1 DW ? ;STR1定义为字类型 MOV AX,STR1 ;合法 MOV AL,STR1 ;非法 MOV AL,BYTE PTR STR1 ;合法 PTR也可用来进行强制类型转换 3.1.4 汇编语言操作数——表达式

  34. 3.2程序结构伪指令 1 段定义伪操作 seg_name SEGMENT seg_name ENDS 2 过程定义伪操作 proc_name PROC NEAR(或FAR) proc_name ENDP

  35. 3.2程序结构伪指令 3 ASSUME伪操作 ASSUME 段寄存器名:段名 注:数据段必须在程序中用两条指令装入段地址 MOV AX,DTSEG MOV DS,AX 4 程序结束伪操作 END [label]

  36. 3.2程序结构伪指令——细解 • 汇编语言程序是按段来组织程序和数据的。 和存储器的物理段相对应,汇编语言程序 中的段称为逻辑段。 汇编连接后被映射到物理段中。 • 三类段:代码(程序)、数据、堆栈 • 段定义伪指令:SEGMENT、ENDS、ASSUME、ORG • 定义一个段的基本格式: 段名SEGMENT [定位类型][组合方式][类别] <汇编语言语句> 段名ENDS

  37. 3.2伪指令——SEGMENT和ENDS • 这两个伪指令总是成对出现,二者前面的段 名应一致。SEGMENT说明了一个段的开始,ENDS 说明了一个段的结束。 • 对数据段和堆栈段,段中的语句一般是变量定 义。对代码段则是指令语句。 如: data SEGMENT <指令语句> data ENDS

  38. 3.2程序结构伪指令——ASSUME • 在代码段中,还必须明确段和段寄存器的 关系,这由ASSUME语句来指定。如 ASSUME CS:code, DS:data, ES:data 语句中的code和data为段名。 这个语句说明: 1. CS将指向名字为code的代码段 2. DS和ES将指向名字为data的数据段

  39. 3.2程序结构伪指令——ASSUME 注意:ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句 MOV AX,DATA MOV DS,AX MOV ES,AX 将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。 代码段基地址不需要程序员装入CS寄存器,而由OS负责装入。

  40. 3.2程序结构伪指令——逻辑段的属性: • 1) 定位类型 • 说明如何确定逻辑段的边界。有四种: • PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为××××0H。——默认类型 • BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。 • WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。 • PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为×××00H。

  41. 3.2程序结构伪指令——逻辑段的属性: • 2) 组合类型 • 说明不同模块中同名段的组合方式。 • PUBLIC : 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。 • COMMON: 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。 • AT <数值表达式> : 按绝对地址定位,段地址就是表达式的值。 • STACK : 专用于说明堆栈段,组合方式同PUBLIC

  42. 3.2程序结构伪指令——逻辑段的属性: 3) 类别 用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。 如:在模块1中有段定义: seg1 SEGMENT PARA STACK ‘stack’ … seg1 ENDS 在模块2中有段定义: seg2 SEGMENT PARA STACK ‘stack’ … seg2 ENDS 则连接时这两个段被安排在一起。

  43. 3.2程序结构伪指令——ORG • ORG规定了段内的指令或数据存放的开始地址 (偏移地址的初值),其格式为: ORG <表达式> • 表达式的值即为开始地址,从此地址起连续存放程序或数据。 例: ABC SEGMENT ORG 100H begin: … … ABC ENDS 指令从100H开始存放

  44. 3.2 程序结构伪指令——数据定义 1 数据类型 BYTE、WORD、DWORD 等 2 数据定义伪指令 DB 定义字节 DW 定义字 DD 定义双字 DQ 定义8字节 DT 定义10字节 DUP 复制操作数 EQU 赋值 = 赋值(可重复赋值)

  45. 3.2 程序结构伪指令——数据定义 • 该伪指令主要为数据项分配存储单元并预初值。 • 该伪指令构成的语句格式是: DB 变量名+ DW +表达式1,表达式2,… DD 其中表达式1,表达式2,…是给变量赋予的初值。表达式可以有如下几种情况: (1)数值表达式 (2)?表达式 (3)字符串表达式 (4)带DUP表达式

  46. 3.2 程序结构伪指令——数据定义 数值表达式 • 例如:DA_BYTE DB 50H, 50 DA_WORD DW 0A3F1H, 4981H 变量DA_BYTE的内容为50H,它的下一个字节为32H。 DA_WORD字单元内容为0A3F1H,它的下一字单元为4981H。 ?表达式 • 不带引号的?表示可预置任何内容。 • 例如:DA_B DB ?, ? DA_W DW ?, ? 第一条语句是要求汇编程序分配两个字节单位,第二条语句是要求分配两个字单元。这些单元里现在可以是任意值。

  47. 3.2 程序结构伪指令——数据定义 带DUP表达式 • DUP是定义重复数据操作符。 • 使用DUP操作符格式是: DB 变量名+ DW +表达式1 DUP (表达式2) DD 其中表达式1是重复的次数,表达式2是重复的内容例如: BB1 DB 12H DUP(’ABCD’) BB2 DW 10H DUP(4)

  48. 3.2 程序结构伪指令——数据定义 例 题 ARRAY1 DB 2 DUP(0,1,2,?) ARRAY2 700bytes ARRAY2 DB 100 DUP(0, 2 DUP(1,2), 0, 3)

  49. 例1: DATA_B DB 10,5,10H DATA_W DW 100H,-4 DATA_D DD 0FFFBH 汇编后的内存分配情况 如右图所示。 3.2 程序结构伪指令——数据定义 0AH DATA_B 10 05H 5 10H 10H 00H DATA_W 100H 01H FCH -4 FFH FBH DATA_D FFH 0FFFBH 00H 00H

  50. 3.2 程序结构伪指令——数据定义 例2:操作数可以是字符串,例如 STR DB ‘HELLO’ 汇编后的情况如图: STR 48H ‘H’ ‘E’ 45H 4CH ‘L’ ‘L’ 4CH ‘O’ 4FH 注意下面两个定义的不同之处: DB ‘AB’;41H在低字节,42H在高字节 DW ‘AB’ ;42H在低字节,41H在高字节

More Related