微机原理与接口技术-第5章 汇编程序设计_12

上传人:子 文档编号:52108015 上传时间:2018-08-18 格式:PPT 页数:39 大小:225.50KB
返回 下载 相关 举报
微机原理与接口技术-第5章 汇编程序设计_12_第1页
第1页 / 共39页
微机原理与接口技术-第5章 汇编程序设计_12_第2页
第2页 / 共39页
微机原理与接口技术-第5章 汇编程序设计_12_第3页
第3页 / 共39页
微机原理与接口技术-第5章 汇编程序设计_12_第4页
第4页 / 共39页
微机原理与接口技术-第5章 汇编程序设计_12_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《微机原理与接口技术-第5章 汇编程序设计_12》由会员分享,可在线阅读,更多相关《微机原理与接口技术-第5章 汇编程序设计_12(39页珍藏版)》请在金锄头文库上搜索。

1、第5章 汇编语言程序设计mov ax,12h call display Jmp 1234h1 1l数据定义伪指令l符号定义伪指令l段定义和段寄存器指定伪指令l过程定义伪指令l结束伪指令5.2 伪指令l伪指令是汇编程序对源程序进行汇编时处理的操作 ,完成处理器选择、定义程序模式、数据定义、分配 存储区、指示程序开始结束等功能。l伪指令本身不占用内存单元,也不会汇编成机器代 码,它们的功能是在汇编和链接时由相应的软件完成 的。2 2哪些是伪指令? DATA SEGMENT hello db “Welcome to the world of assembler!$“ DATA ENDS CODE S

2、EGMENT assume cs:CODE, ds:DATA start: mov ax, data mov ds, ax mov dx, offset hello mov ah, 9 int 21h mov ah, 1 int 21h mov ah, 4ch int 21h CODE ENDSEND start伪指令3 35.2.1 处理器选择伪操作功能:告诉汇编语言应该选择那一种指令,主要有 : .8086选择8086指令系统 .386选择80386指令系统 .836P选择保护方式下的80386指令系统 .486选择80486指令系统 .486P选择保护方式下的80486指令系统 .586

3、选择Pentium指令系统 .586P选择保护方式下的Pentium指令系统注:汇编程序的默认值是 .80864 45.2.2 数据定义伪指令用于定义变量,即内存单元或数据区。数据定义 伪指令的格式为:变量名 数据定义伪指令 操作数,操作数,常用的数据定义伪指令有如下几种:DB 定义字节DW 定义字DD 定义双字DQ 定义4字操作数可以是常数、变量或表达式5 5例1: DataB DB 10,5,10H DataW DW 100H,-4 DataD DD 12345678H汇编后的内存分配情况 如右图所示。05H 10H 00H 01H FCH FFH 78H 56H 34H 12H0AHDa

4、taBDataBDataWDataWDataDDataD10105 510H10H100H100H- -4 412345678H12345678H6 6例2:对于字节定义(DB)操作数可以是字符串,例 如 STR DBHELLO 汇编后的情况如图:STR0 H E L L O48H45H4CH4CH4FHSTR1 STR2 STR3 STR4 汇编时,每一个字符占用一个字节,从低地址开始 ,顺序存放。等价于: STR DB48H, 45H, 4CH, 4CH, 4FH 或STR DBH, E, L, L, O7 7注意下面两个定义的不同之处: DBAB ;A在低字节,B在高字节 DW AB ;

5、B在低字节,A在高字节 DDAB ;41H42H42H41H42H41H00H00HDB ABDW ABDD AB注意:字符串只可以在DB定义中可以使用。对于DW 、DD、DQ如果要使用字符串,最多只能有两个字符 。例如:DD ABCD ;错误8 8l 保留存储单元操作符? 操作数?用来保留存储空间,但不存入数据初值 例:ABC DB 0,1,2,3,4,OK,$RSV DW ?,?,?,?,?,?,?,?l复制操作符DUP 重复的数据可以使用复制操作符DUP,如上面RSV亦可 写成:RSV DW 8 DUP(?)? 与 DUP 的说明9 9$ 运算符 地址计数器l作用:保存当前正在汇编的指令

6、地址l例3: ARRAY DW 1,2,$+4,3,4,$+80 0 0 2 0 0 7 C 0 0 0 3 0 0 0 40 1ARRAY00740 0 8 6 0 00078007E0078+4=007C007E+8=0086假定假定ARRAYARRAY分配的分配的 偏移地址为偏移地址为00740074, 则存储区分配情况则存储区分配情况 如图所示如图所示1010l例4: TABLE DB 2 DUP(?, 2 DUP(1, 2)BUFFER DW TABLE, $+3 设TABLE的偏移地址为0080H,则汇编后如下图所示:BUFFER0080H02HTABLE008AH 008BH 0

7、08CH 008DH01H?H02H0089H10 Bytes?02H01H01H01H 02H 80H 00H 8FH 00H1111例5: 数据定义的综合例子M1DB 15, 67H, 11110000B, ? M2 DB 15, AB$ M3 DW 4*5 M4 DD 1234H M5 DB 2 DUP(5, A) M6 DW M2; M2的偏移量 M7 DD M2; M2的偏移量、段基址设以上数据自1234:0000开始存放,则为:0F 67 F0 00 31 35 41 42 24 14 00 34 12 00 00 05 41 05 41 04 00 04 00 34 121212

8、DataD DD3CH nAddrDWDataD fAddr DDDataD DataD- -3C00 000000 040020 0020nAddrfAddr偏移地址偏移地址段地址例6: 数据与地址现设DataD数据的地址是0400H:2000H0400H:2000H1313修改属性的运算符l格式: 类型说明符 PTR 地址表达式l类型说明符:地址表达式是内存操作数时:BYTE、WORD、DWORD地址表达式是语句标号、过程名时:FAR、NEARl地址表达式:语句标号、过程名、内存操作数。lPTR运算符的功能是在本条指令中临时修改由地址表达式指向的内存单元、语句标号或子程序的属 性。1414

9、PTR运算符的应用程序设计时,若遇到下列情况之一,必须用程序设计时,若遇到下列情况之一,必须用PTRPTR运算运算符修改或确认内存操作数的类型:符修改或确认内存操作数的类型: n n汇编程序无法确定操作数类型时:汇编程序无法确定操作数类型时:MOV BYTE PTR BX, 5MOV BYTE PTR BX, 5 MOV WORD PTR BX, 5MOV WORD PTR BX, 5 INC WORD PTR BXINC WORD PTR BXn n强制类型转换:强制类型转换: ABC DB 1, 2, 3, 4, 5, 6, 7, 8 MOV AL,ABC5 ; al6 MOV BX, W

10、ORD PTR ABC1 ; bx0302h151516例:MOVBYTE PTRDI,0 ;字节类型MOVWORD PTRDI,0 ;字类型MOVDI,0B5H ;类型不定PTR也可用来进行强制类型转换 例:STR1 DW ? ;STR1定义为字类型MOVAX,STR1 ;合法MOVAL,STR1 ;非法MOV AL,BYTE PTR STR1 ;合法1616THIS运算符l功能:为同一存储单元取另一别名用于为同一存储单元的数据定义不同的数据类型。l例: WBUFFER EQU THIS WORDBUFFER DB 20 DUP(?)这样就给同一片存储单元,取了二个具有不同数 据类型的变量名

11、。于是,在指令中,引用不同的变量 名,就可使用其不同的数据属性: 如果引用变量名WBUFFER,则是按“字”属性来访 问 如果引用变量名BUFFER,则是按“字节”属性来访 问 17175.2.3 符号定义伪指令把一个表达式用一个符号表示,以后凡出现该表 达式的地方都可用这个符号表示。类似于C语言中 的#define。 符号定义伪指令有两种:EQU,=用EQU定义的符号在同一个程序中不能再定 义。用”=”定义的符号可在任何时候进行重定义 。二者均不占用存储空间,仅是给符号赋值 1818例:“EQU 和 =” 的例子FIVE EQU 5COUNT EQU CXTEN EQU 10DIST = B

12、YTE PTRSI+BPGOTO = JMP MOV COUNT,TENADD DIST, FIVEDIST = WORD PTRSI+BP+1ADD DIST, AXGOTO LABEL 定义引用1919EQU用途l增加程序可读性、缩短程序书写长度、避免因为 某些修改而带来的程序不一致性。l除了以上用途外,经常使用EQU的一个场合是与 配合,得到变量分配的字节数。l例如: MSG DB This is first string. COUNTEQU $MSG MOV CL, COUNT ; CLMSG的串长2120205.2.4 段定义伪指令汇编语言程序是按段来组织程序和数据的。与存储器的物理

13、段相对应,汇编语言程序中的段称 为逻辑段。汇编连接后被映射到物理段中。 在编写汇编语言源程序时,每条指令和每个变量 都必须具备段属性。通常一个程序有若干段,而且每 一个段有一个段名。段定义伪指令是逻辑段的定界语句,源程序中每一 个逻辑段都必须用段定义伪指令实现定界。段定义伪指令:SEGMENT、ENDS、ASSUME、ORG212122段定义伪指令的格式l格式:段名 SEGMENT 定位参数 链接参数 类别 段长 度 段体段名 ENDSl说明: 定位参数、链接参数、类别、段长度是段定义语句的4 个属性参数,可以根据需要选用其中的14个,也可以全 部缺省。2222这两个伪指令总是成对出现,SEG

14、MENT说明了一 个段的开始,ENDS说明了一个段的结束。每个段必须有一个段名,通常选用与本段相关的 名字(DATA、STACK、CODE),段开始与结束 的段名必须一致。对数据段和堆栈段,段中的语句一般是变量定义 。对代码段则是指令语句。如: data SEGMENTdata ENDS SEGMENTSEGMENT和ENDSENDS伪指令伪指令2323ASSUME:段约定语句在代码段中,还必须明确段和段寄存器的关系, 这由ASSUME语句来指定。如ASSUME CS:code, DS:data, ES:data语句中的 code 和 data 为段名。这个语句说明:1. CS 将指向名字为

15、code 的代码段2. DS 和 ES 将指向名字为 data 的数据段2424但要注意,ASSUME伪指令只是告知汇编程序有关 段寄存器与段的关系,并没有给段寄存器赋予实 际的初值。故下面的语句MOVAX,DATA ;DATA为段名MOVDS,AXMOVES,AX 将段基址装入段寄存器。如果程序中用到堆栈段 ,则SS也需装入实际的初值。 代码段基地址不需要程序员装入CS寄存器,而由 OS负责装入。2525SEGMENT语句后可以带有可选参数,用以规定逻辑 段的其他一些属性属性。1 1) ) 定位定位参数参数:通知链接程序,本逻辑段的目标代码在 存储器中如何存放。 PARAPARA: : 逻辑段从一个节 (16个字节) 的边界开始。 (默认类型) BYTE :BYTE : 逻辑段从字节边界开始,即段可以从任何 地址开始。 WORD :WORD : 逻辑段从字边界开始。 PAGEPAGE : : 逻辑段从页边界开始。256字节称为一页 ,故段的起始物理地址

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号