1.45k likes | 1.69k Views
8086 汇编程序设计. CS. ∑. ALU. DS. SS. ES. IP. 内部寄存器. 8086CPU 内部结构框图. 地址总线 20 位. 数据总线 16 位. 总线控制电路. 8086 总线 16 位数据总线. ALU 数据总线 16 位. 暂存器. 队列总线 8 位. EU 控制器. 标志寄存器. 指令执行单元 EU. 总线接口单元 BIU. 8086CPU 内部结构框图. 通用、指针及变址寄存器. 通用寄存器 指针及 变址寄存器. 隐含定义 缺省搭配. 段寄存器和指令指针寄存器. 段寄存器
E N D
CS ∑ ALU DS SS ES IP 内部寄存器 8086CPU内部结构框图 地址总线 20位 数据总线 16位 总线控制电路 8086总线 16位数据总线 ALU数据总线 16位 暂存器 队列总线 8位 EU 控制器 标志寄存器 指令执行单元EU 总线接口单元BIU 8086CPU内部结构框图
通用、指针及变址寄存器 • 通用寄存器 • 指针及 变址寄存器 隐含定义 缺省搭配
段寄存器和指令指针寄存器 • 段寄存器 • 指令指针寄存器 CS:IP 当前正指向的指令的地址 逻辑地址 物理地址 如CS=2000H IP=003AH 则物理地址为2003AH
物理地址的形成 • 四个段寄存器 CS DS SS ES • 逻辑地址由段寄存器和段内偏移量寄存器组成 • 物理地址 = 段寄存器的值 x 16 +段内偏移量寄存器的值
15 0 段 基 址 0000 15 0 段 内 偏 移 量 20 0 物 理 地 址 物理地址的形成(续) • 物理地址 = 段寄存器的值 x 16 + 段内偏移量寄存器的值 不同的段基址和段内偏移量可得到相同的物理地址,如: 1234:0005 1230:0045 1200:0345
逻辑地址的来源 • CS,IP指向代码段 • SS,SP指向堆栈段 CS IP • DS,BX(SI,DI)指向数据段 • ES,DI(串操作)指向附加段 DS BX(SI,DI) 段寄存器与段内指针寄存器有缺省搭配 SS SP
标志寄存器 • 运算结果标志 CF PF AF ZF SF OF • 系统状态标志 TF IF DF
运算结果标志 • 运算结果标志 CF PF AF ZF SF OF 字节:带符号数 -128 ~ 127 10000000 ~ 01111111(二进制) 字:带符号数 -32768 ~ 32767
系统状态标志 • 系统状态标志TF IF DF
汇编语言程序设计 1 汇编语言的基本语法 2 汇编语言程序设计
1 汇编语言的基本语法 • 汇编语言源程序的格式 • 常量、标识符和表达式 • 指示性语句(伪指令) • 名字与变量 • 指令性语句
DATA SEGMENTAT 2000H ARRAY DB a1,a2,a3,…a10 ;a1~a10为立即数 COUNT EQU $ - ARRAY ; 10-0=10 SUM DW ? ; 值不定 DATA ENDS STACK SEGMENTPARA STACK ‘STACK’ STAK DB 10 DUP (?) ; 复制10个不定值 TOP EQU LENGTH STAK ; Length是取变量长度的操作符 STACK ENDS ; Top=10. 见P44 汇编语言源程序的格式
CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX,DATA MOV DS,AX ; DSDATA段基址 MOV AX,0 ; AX0 MOV DI,OFFSET SUM ; DI11 MOV BX,OFFSET ARRAY ; BX0 MOV CX,COUNT ; COUNT10 LOP: ADD AL,[BX] ; ALarray[0] ADC AH,0 ; 进位加到AH, INC BX : 见(汇编指令P45) LOOP LOP ; 见(汇编指令P99) MOV [DI],AX ; SUMarray[i] MOV AH,4CH ; 4CH号DOS功能调用 INT 21H ; 为结束程序, 见P62 CODE ENDS END START
汇编语言源程序格式的特点是: 1 .分段结构 2 .语句行 汇编语言程序的语句有两类: ( 1 ) 指令性语句: 机器指令的汇编形式 ( 2 ) 指示性语句(伪指令): 不是机器指令,用来告诉汇编程 序以什么方式去汇编和组织程序和数据. 汇编语言源程序的格式
( 1 ) 指令性语句 格式为: [ 标号 ]: 操作码 [ 操作数 ] [; 注释 ] 带方括号的为任选项, 标号是指令的符号地址, 操作码和操作数是用汇编语言指令表示的指令部分, 注释是对该语句在本程序中的功能的说明。 汇编语言源程序的格式
汇编语言源程序的格式 例:NEXT: MOV AL,[BX][SI] ;Load Byte AND AL,0FH • 标号 • 指令助记符 • 操作数 • 无操作数 LODSB • 单操作数 JMP GO_ON • 双操作数 AND AL,0FH • 注释 • 可有可无,有则增加源程序的可读性
( 2 ) 指示性语句 格式为: [ 名字 / 变量 ] 命令 [参数] [;注释 ] 命令指示汇编程序进行某种汇编操作, 参数是有关的数据, 名字是段名、符号名等标识符,变量用变量名表示。 汇编语言源程序的格式
汇编语言源程序的格式 例: CR EQU 0DH ;Carriage Return NUM DB 30H,31H,32H CODE ENDS ORG 100H … …
一、常量 其值在程序中不能改变的量, 在汇编语言源程序中的常量有: 数字常量、字符常量和符号常量 ( 1 ) 数字常量可以是二进制数、八进制数、十进制数或十六进制数表示 ( 2 ) 字符常量是用单引号‘ ’括起来的ASCII字符, 其值是该字符的ASCII代码值 常量、标识符和表达式
( 3 ) 符号常量是用标识符定义的常量。 例如,采用符号定义语句 PORTA EQU 80H, 则指令 MOV AL,PORTA 与指令 MOV AL,80H 等价。 常量、标识符和表达式
常量、标识符和表达式 • 标号名、符号名都称为标识符 • 字符个数1 ~ 31 • 首字符为字母;”?”;”@”;”_” • 其它字符为字母;”?”;”@”;”_”和数字 • 不能使用保留字 如:AX、MOV、CODE、ORG ……
表达式由操作数和运算符组成。 操作数可以是常量、名字、变量和标号等。 运算符包括算术运算符 逻辑运算符 关系运算符 分析运算符 合成运算符等。 常量、标识符和表达式
一 、程序开始和结束语句 • NAME 命令:给程序模块命名 格式: NAME 名字 • TITLE 命令:名字作为每页标题打印出来,标题名字符不大于60个 格式: TITLE 名字 • END命令:主模块结束必须写上标号 格式: END [ 标号 ] 标号是程序中第一句指令性语句的标号。 指示性语句
二、段定义语句 用来定义一个段 • SEGMENT / ENDS命令 格式 :段名 SEGMENT [参数] ……. 段名 ENDS 段名由程序员定义,汇编时由系统为该段分配一个段基值,并将该值赋于段名。 指示性语句
SEGMENT语句中的参数为: [ 定位类型 ] [ 组合类型 ] [ ‘ 类别 ’ ] 用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。都是任选项 指示性语句
指示性语句 段 名 伪指令 定位类型 组合类型 类别名 例:STACK1 SEGMENT PARA STACK ‘STACK’ DW 100HDUP(0) STACK1 ENDS • 段名:用户自选 • 定位类型 PAGE 256 PARA 16 缺省值 WORD 2 BYTE 1
指示性语句 • 组合类型 NONE 与其它段无关,缺省选择 PUBLIC 公开的,与其它PUBLIC类型的段邻接存放, 用同一个首址 COMMON 与另一个COMMON类型的段重叠(覆盖), 长度以最长的为准 STACK 与其它STACK类型的段连接,且对SP初始化 • 类别名 用‘ ‘表示,由用户设定
指示性语句 • ORG命令:偏移地址定位语句 指定某一语句在段内的偏移地址 格式 : ORG exp exp 为能计算出16位立即数的表达式 例: ORG 2000H ORG $ + 1000H
ASSUME 命令:ASSUME 命令紧跟在代码段的SEGMENT语句之后,用于指示下述程序中段寄存器同指定段名的对应关系 格式 : ASSUME CS:段名1,DS:段名2, SS:段名3,ES:段名4 注意:ASSUME语句仅指出段寄存器同段名的对应关系,并未对段寄存器赋值,在程序中未用到的段寄存器不必指示。 指示性语句
指示性语句 例:DATA SEGMENT BUF DB 100H DUP(0) DATA ENDS STACK1 SEGMENT DW 80H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK1 … … CODE ENDS
三、过程定义语句 应用 PROC /ENDP命令定义过程( procedure ),过程即子程序,是程序的一部分,程序中用CALL指令调用过程,过程结束用RET指令返回程序。 格式 : 过程名 PROC 类型 …… 过程名 ENDP 类型为 FAR / [NEAR] 指示性语句
四、数据定义语句 用来为数据分配内存单元。 格式 : [ 变量 ] 命令 参数1,参数2,…… [;注释 ] 变量是内存中一组数的名字,由程序员在编程时用标识符定义,变量可以作为内存操作数来使用。 指示性语句
指示性语句 数据定义语句中的命令可以是: DB 定义字节数据(8 位) DW 定义字数据(16 位) DD 定义双字数据(32 位) DQ 定义8字节数据(64 位) DT 定义10字节数据(80 位)
参数是相应内存单元中的数据, 可以是: 数字常量……用各种规定的数制表示; 字符常量……用单引号括起来的ASCII字符; 符号常量……用EQU语句定义。 指示性语句
? 保留一个存储单位,以备程序执行过程中存入结果数据; ? ? ? ? 保留4个存储单位; ARY DB 4 DUP ( 43H ) 表示定义一个变量ARY,在内存中开辟一个数组,存放4个43H。 DUP 为复制符 格式 :复制次数 DUP (数据) 指示性语句
例: DATA1 SEGMENT AT 2000H ORG 3000H ARY1 DB 12H,34H,56H,78H ARY2 DW 1234H,5678H ARY3 DB ‘A’,’B’,’C’,’D’,,’ABCD’ ARY4 DW ‘AB’ ARY5 DD ‘AB’ ARY6 DW ARY2 ARY7 DD ARY2
在定义ARY6的语句中, 参数为已定义的变量ARY2, 其值为ARY2的偏移地址3004H; 在定义ARY7的语句中, 参数为已定义的变量ARY2, 其值为ARY2的偏移地址3004H和段基值2000H。 指示性语句
五、符号定义语句 • EQU 命令 等值命令 格式:名字/变量 EQU exp • = 命令 等号命令 格式 :名字 = exp • PURGE命令 用来撤消已定义的符号常量 格式 :PURGE 名字 可同时撤消几个己定义的名字 指示性语句
六、名字与变量 • 名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。 段名:在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值,例如: MOV AX , DATA1 MOV DS , AX 指示性语句
过程名:在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址,即过程的入口地址,有NEAR(此过程仅被过程所在的段调用)和FAR (此过程被别的程序段调用)之分。 符号常量名:由符号定义语句EQU、=来定义,对符号常量给以赋值。 指示性语句
变量 变量的定义和属性:变量由数据定义语句DB/DW /DD/DQ/DT来定义。 变量有三属性: 段属性……说明该变量在哪个存储段中; 偏移地址属性……说明该变量的段内偏移量; 类型属性……说明该变量所在内存数据的类型(字节、字、双字、8字节还是10字节)。 指示性语句
分析运算符 ( Analytic operator ) 用于把变量的三个属性分别取出来作为操作数。 有SEG 、OFFSET.、TYPE 、LENGTH 和SIZE。 SEG 变量名 ------ 取出变量的段基值 OFFSET 变量名------ 取出变量的偏移地址 TYPE 变量名------ 取出变量的类型值. 字节数据、字数据、双字数据、分别为1、2、4。8字节数据为8、10 字节数据为10。
LENGTH 变量名: 表示变量所在数组的元素个数。 注意:只有当数据用DUP定义时,才适用,否则恒为 1 。 SIZE 变量名:表示变量所在数组的字节数。 注意: 同LENGTH, SIZE 变量 = LENGTH 变量 × TYPE 变量 指示性语句
合成运算符 PTR 运算符 类型 PTR exp 其中类型是 BYTE、WORD、DWORD ( 变量) FAR、NEAR ( 标号 ) exp为表达式, 是存储器操作数, 指示性语句
PTR的应用 • 用于临时改变变量或标号的类型属性。 例如:BUFW DW 1234H,5678H MOV AX,BUFW MOV AL,BYTE PTR BUFW • 也可用来指定内存操作数的类型。 例如:INC BYTE PTR [ BX ] INC WORD PTR [BX ] 指示性语句
也可用EQU 和PTR定义一个新的变量名 例如:BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW 则 MOV AX,BUFW 和 MOV AL,BUFB 都是合法的。 指示性语句
THIS 类型 类似于PTR 运算符, THIS与EQU一起用来定义一个新变量名。 例如 :BUFB EQU THIS BYTE BUFW DW 1234H,5678H EQU 语句必须紧跟DW语句,并且EQU语句在前。 指示性语句
LABEL 命令 格式:变量/标号 LABEL 类型 用来定义语句中的变量(或标号) 例如: BUFB LABEL BYTE BUFW DW 1234H,5678H LABEL语句必须紧跟DW语句,并且LABEL语句在前。 指示性语句