1 / 145

8086 汇编程序设计

8086 汇编程序设计. CS. ∑. ALU. DS. SS. ES. IP. 内部寄存器. 8086CPU 内部结构框图. 地址总线 20 位. 数据总线 16 位. 总线控制电路. 8086 总线 16 位数据总线. ALU 数据总线 16 位. 暂存器. 队列总线 8 位. EU 控制器. 标志寄存器. 指令执行单元 EU. 总线接口单元 BIU. 8086CPU 内部结构框图. 通用、指针及变址寄存器. 通用寄存器 指针及 变址寄存器. 隐含定义 缺省搭配. 段寄存器和指令指针寄存器. 段寄存器

matia
Download Presentation

8086 汇编程序设计

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. 8086 汇编程序设计

  2. CS ∑ ALU DS SS ES IP 内部寄存器 8086CPU内部结构框图 地址总线 20位 数据总线 16位 总线控制电路 8086总线 16位数据总线 ALU数据总线 16位 暂存器 队列总线 8位 EU 控制器 标志寄存器 指令执行单元EU 总线接口单元BIU 8086CPU内部结构框图

  3. 通用、指针及变址寄存器 • 通用寄存器 • 指针及 变址寄存器 隐含定义 缺省搭配

  4. 段寄存器和指令指针寄存器 • 段寄存器 • 指令指针寄存器 CS:IP 当前正指向的指令的地址 逻辑地址 物理地址 如CS=2000H IP=003AH 则物理地址为2003AH

  5. 物理地址的形成 • 四个段寄存器 CS DS SS ES • 逻辑地址由段寄存器和段内偏移量寄存器组成 • 物理地址 = 段寄存器的值 x 16 +段内偏移量寄存器的值

  6. 15 0 段 基 址 0000 15 0 段 内 偏 移 量 20 0 物 理 地 址 物理地址的形成(续) • 物理地址 = 段寄存器的值 x 16 + 段内偏移量寄存器的值 不同的段基址和段内偏移量可得到相同的物理地址,如: 1234:0005 1230:0045 1200:0345

  7. 逻辑地址的来源 • CS,IP指向代码段 • SS,SP指向堆栈段 CS IP • DS,BX(SI,DI)指向数据段 • ES,DI(串操作)指向附加段 DS BX(SI,DI) 段寄存器与段内指针寄存器有缺省搭配 SS SP

  8. 标志寄存器 • 运算结果标志 CF PF AF ZF SF OF • 系统状态标志 TF IF DF

  9. 运算结果标志 • 运算结果标志 CF PF AF ZF SF OF 字节:带符号数 -128 ~ 127 10000000 ~ 01111111(二进制) 字:带符号数 -32768 ~ 32767

  10. 系统状态标志 • 系统状态标志TF IF DF

  11. 汇编语言程序设计 1 汇编语言的基本语法 2 汇编语言程序设计

  12. 1 汇编语言的基本语法 • 汇编语言源程序的格式 • 常量、标识符和表达式 • 指示性语句(伪指令) • 名字与变量 • 指令性语句

  13. 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 汇编语言源程序的格式

  14. CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX,DATA MOV DS,AX ; DSDATA段基址 MOV AX,0 ; AX0 MOV DI,OFFSET SUM ; DI11 MOV BX,OFFSET ARRAY ; BX0 MOV CX,COUNT ; COUNT10 LOP: ADD AL,[BX] ; ALarray[0] ADC AH,0 ; 进位加到AH, INC BX : 见(汇编指令P45) LOOP LOP ; 见(汇编指令P99) MOV [DI],AX ; SUMarray[i] MOV AH,4CH ; 4CH号DOS功能调用 INT 21H ; 为结束程序, 见P62 CODE ENDS END START

  15. 汇编语言源程序格式的特点是: 1 .分段结构 2 .语句行 汇编语言程序的语句有两类: ( 1 ) 指令性语句: 机器指令的汇编形式 ( 2 ) 指示性语句(伪指令): 不是机器指令,用来告诉汇编程 序以什么方式去汇编和组织程序和数据. 汇编语言源程序的格式

  16. ( 1 ) 指令性语句 格式为: [ 标号 ]: 操作码 [ 操作数 ] [; 注释 ] 带方括号的为任选项, 标号是指令的符号地址, 操作码和操作数是用汇编语言指令表示的指令部分, 注释是对该语句在本程序中的功能的说明。 汇编语言源程序的格式

  17. 汇编语言源程序的格式 例:NEXT: MOV AL,[BX][SI] ;Load Byte AND AL,0FH • 标号 • 指令助记符 • 操作数 • 无操作数 LODSB • 单操作数 JMP GO_ON • 双操作数 AND AL,0FH • 注释 • 可有可无,有则增加源程序的可读性

  18. ( 2 ) 指示性语句 格式为: [ 名字 / 变量 ] 命令 [参数] [;注释 ] 命令指示汇编程序进行某种汇编操作, 参数是有关的数据, 名字是段名、符号名等标识符,变量用变量名表示。 汇编语言源程序的格式

  19. 汇编语言源程序的格式 例: CR EQU 0DH ;Carriage Return NUM DB 30H,31H,32H CODE ENDS ORG 100H … …

  20. 一、常量 其值在程序中不能改变的量, 在汇编语言源程序中的常量有: 数字常量、字符常量和符号常量 ( 1 ) 数字常量可以是二进制数、八进制数、十进制数或十六进制数表示 ( 2 ) 字符常量是用单引号‘ ’括起来的ASCII字符, 其值是该字符的ASCII代码值 常量、标识符和表达式

  21. ( 3 ) 符号常量是用标识符定义的常量。 例如,采用符号定义语句 PORTA EQU 80H, 则指令 MOV AL,PORTA 与指令 MOV AL,80H 等价。 常量、标识符和表达式

  22. 常量、标识符和表达式 • 标号名、符号名都称为标识符 • 字符个数1 ~ 31 • 首字符为字母;”?”;”@”;”_” • 其它字符为字母;”?”;”@”;”_”和数字 • 不能使用保留字 如:AX、MOV、CODE、ORG ……

  23. 表达式由操作数和运算符组成。 操作数可以是常量、名字、变量和标号等。 运算符包括算术运算符 逻辑运算符 关系运算符 分析运算符 合成运算符等。 常量、标识符和表达式

  24. 常量、标识符和表达式

  25. 一 、程序开始和结束语句 • NAME 命令:给程序模块命名 格式: NAME 名字 • TITLE 命令:名字作为每页标题打印出来,标题名字符不大于60个 格式: TITLE 名字 • END命令:主模块结束必须写上标号 格式: END [ 标号 ] 标号是程序中第一句指令性语句的标号。 指示性语句

  26. 二、段定义语句 用来定义一个段 • SEGMENT / ENDS命令 格式 :段名 SEGMENT [参数] ……. 段名 ENDS 段名由程序员定义,汇编时由系统为该段分配一个段基值,并将该值赋于段名。 指示性语句

  27. SEGMENT语句中的参数为: [ 定位类型 ] [ 组合类型 ] [ ‘ 类别 ’ ] 用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。都是任选项 指示性语句

  28. 指示性语句 段 名 伪指令 定位类型 组合类型 类别名 例:STACK1 SEGMENT PARA STACK ‘STACK’ DW 100HDUP(0) STACK1 ENDS • 段名:用户自选 • 定位类型 PAGE 256 PARA 16 缺省值 WORD 2 BYTE 1

  29. 指示性语句 • 组合类型 NONE 与其它段无关,缺省选择 PUBLIC 公开的,与其它PUBLIC类型的段邻接存放, 用同一个首址 COMMON 与另一个COMMON类型的段重叠(覆盖), 长度以最长的为准 STACK 与其它STACK类型的段连接,且对SP初始化 • 类别名 用‘ ‘表示,由用户设定

  30. 指示性语句 • ORG命令:偏移地址定位语句 指定某一语句在段内的偏移地址 格式 : ORG exp exp 为能计算出16位立即数的表达式 例: ORG 2000H ORG $ + 1000H

  31. ASSUME 命令:ASSUME 命令紧跟在代码段的SEGMENT语句之后,用于指示下述程序中段寄存器同指定段名的对应关系 格式 : ASSUME CS:段名1,DS:段名2, SS:段名3,ES:段名4 注意:ASSUME语句仅指出段寄存器同段名的对应关系,并未对段寄存器赋值,在程序中未用到的段寄存器不必指示。 指示性语句

  32. 指示性语句 例: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

  33. 三、过程定义语句 应用 PROC /ENDP命令定义过程( procedure ),过程即子程序,是程序的一部分,程序中用CALL指令调用过程,过程结束用RET指令返回程序。 格式 : 过程名 PROC 类型 …… 过程名 ENDP 类型为 FAR / [NEAR] 指示性语句

  34. 四、数据定义语句 用来为数据分配内存单元。 格式 : [ 变量 ] 命令 参数1,参数2,…… [;注释 ] 变量是内存中一组数的名字,由程序员在编程时用标识符定义,变量可以作为内存操作数来使用。 指示性语句

  35. 指示性语句 数据定义语句中的命令可以是: DB 定义字节数据(8 位) DW 定义字数据(16 位) DD 定义双字数据(32 位) DQ 定义8字节数据(64 位) DT 定义10字节数据(80 位)

  36. 参数是相应内存单元中的数据, 可以是: 数字常量……用各种规定的数制表示; 字符常量……用单引号括起来的ASCII字符; 符号常量……用EQU语句定义。 指示性语句

  37. ? 保留一个存储单位,以备程序执行过程中存入结果数据; ? ? ? ? 保留4个存储单位; ARY DB 4 DUP ( 43H ) 表示定义一个变量ARY,在内存中开辟一个数组,存放4个43H。 DUP 为复制符 格式 :复制次数 DUP (数据) 指示性语句

  38. 例: 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

  39. 在定义ARY6的语句中, 参数为已定义的变量ARY2, 其值为ARY2的偏移地址3004H; 在定义ARY7的语句中, 参数为已定义的变量ARY2, 其值为ARY2的偏移地址3004H和段基值2000H。 指示性语句

  40. 五、符号定义语句 • EQU 命令 等值命令 格式:名字/变量 EQU exp • = 命令 等号命令 格式 :名字 = exp • PURGE命令 用来撤消已定义的符号常量 格式 :PURGE 名字 可同时撤消几个己定义的名字 指示性语句

  41. 六、名字与变量 • 名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。 段名:在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值,例如: MOV AX , DATA1 MOV DS , AX 指示性语句

  42. 过程名:在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址,即过程的入口地址,有NEAR(此过程仅被过程所在的段调用)和FAR (此过程被别的程序段调用)之分。 符号常量名:由符号定义语句EQU、=来定义,对符号常量给以赋值。 指示性语句

  43. 变量 变量的定义和属性:变量由数据定义语句DB/DW /DD/DQ/DT来定义。 变量有三属性: 段属性……说明该变量在哪个存储段中; 偏移地址属性……说明该变量的段内偏移量; 类型属性……说明该变量所在内存数据的类型(字节、字、双字、8字节还是10字节)。 指示性语句

  44. 分析运算符 ( Analytic operator ) 用于把变量的三个属性分别取出来作为操作数。 有SEG 、OFFSET.、TYPE 、LENGTH 和SIZE。 SEG 变量名 ------ 取出变量的段基值 OFFSET 变量名------ 取出变量的偏移地址 TYPE 变量名------ 取出变量的类型值. 字节数据、字数据、双字数据、分别为1、2、4。8字节数据为8、10 字节数据为10。

  45. LENGTH 变量名: 表示变量所在数组的元素个数。 注意:只有当数据用DUP定义时,才适用,否则恒为 1 。 SIZE 变量名:表示变量所在数组的字节数。 注意: 同LENGTH, SIZE 变量 = LENGTH 变量 × TYPE 变量 指示性语句

  46. 合成运算符 PTR 运算符 类型 PTR exp 其中类型是 BYTE、WORD、DWORD ( 变量) FAR、NEAR ( 标号 ) exp为表达式, 是存储器操作数, 指示性语句

  47. PTR的应用 • 用于临时改变变量或标号的类型属性。 例如:BUFW DW 1234H,5678H MOV AX,BUFW MOV AL,BYTE PTR BUFW • 也可用来指定内存操作数的类型。 例如:INC BYTE PTR [ BX ] INC WORD PTR [BX ] 指示性语句

  48. 也可用EQU 和PTR定义一个新的变量名 例如:BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW 则 MOV AX,BUFW 和 MOV AL,BUFB 都是合法的。 指示性语句

  49. THIS 类型 类似于PTR 运算符, THIS与EQU一起用来定义一个新变量名。 例如 :BUFB EQU THIS BYTE BUFW DW 1234H,5678H EQU 语句必须紧跟DW语句,并且EQU语句在前。 指示性语句

  50. LABEL 命令 格式:变量/标号 LABEL 类型 用来定义语句中的变量(或标号) 例如: BUFB LABEL BYTE BUFW DW 1234H,5678H LABEL语句必须紧跟DW语句,并且LABEL语句在前。 指示性语句

More Related