汇编第四章1

上传人:j****9 文档编号:54587575 上传时间:2018-09-15 格式:PPT 页数:57 大小:251KB
返回 下载 相关 举报
汇编第四章1_第1页
第1页 / 共57页
汇编第四章1_第2页
第2页 / 共57页
汇编第四章1_第3页
第3页 / 共57页
汇编第四章1_第4页
第4页 / 共57页
汇编第四章1_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《汇编第四章1》由会员分享,可在线阅读,更多相关《汇编第四章1(57页珍藏版)》请在金锄头文库上搜索。

1、1,第四章 汇编语言程序格式, 汇编程序功能 汇编语言程序格式 伪操作 操作符 上机过程,2,程序功能(Masm,Link),Edit progr,Progr.asm,Progr.obj,汇编程序(masm),Progr.exe,连接程序(Link),3,2.汇编语言程序格式汇编语言语句可由四项组成 格式为:名字 操作项 操作数 ; 注释MASM对语句格式的要求:1)大小写无关。2)每条语句必须占行,但可以使用续行符“”。3)为了提高可读性,应该使各个域对齐。,指令 伪操作(伪指令) 宏指令,操作所需信息,标号和变量,例: D1 segmentascstr db comput a D1 end

2、s Code1 segment.mov si ,-1mov al ,20h Next: inc si,4,变量与标号的3种属性:段地址、偏移地址、类型。变量的类型包括BYTE(字节)、WORD(字)、DWORD(双字)等。 . 标号的类型包括NEAR(表示在本段内引用)和FAR(表示在其他段中引用) 。地址表达式。 地址表达式的基本形式为:变量名或标号名 常数其类型由相应的变量或标号确定。 两个地址表达式的差表示两个地址之间的距离(字节数),两个地址必须在同一个段内。注意,不能将两个地址表达式相加。$是一个特殊的地址表达式,表示当前地址,即地址计数器的当前值。,如:mov bx ,block+

3、10,5,操作项,指令 伪操作(伪指令) 宏指令,伪操作: 汇编期间由汇编程序(MASM)处理的操作。数据定义分配存储区指示程序结束。,6,2. 伪操作, 处理器选择伪指令段定义伪指令ASSUME伪指令程序开始/结束伪指令数据定义及存储器分配伪指令表达式赋值伪指令 EQU地址计数器与对准伪指令LABEL伪指令,7,. 处理器选择伪指令,主要包括:.8086 .286 .286P .386 .386P.486 .486P .586 .586P .686 .686P在缺省方式下,MASM只承认8086指令。为了使用更高的CPU指令,必须使用处理器选择伪指令,分别表示其后面的代码使用相应CPU的指令

4、。其中,结尾的P表示使用特权指令。若使用32位CPU新增指令以及寄存器或内存寻址方式,则至少要用.386 伪指令。 一般放在程序最前,也可放在某条指令之前。,8,. 段定义伪指令 基本形式:段名 SEGMENT STACK USE16段名 ENDS其中,STACK仅用于堆栈段。USE16指出使用16位段。注意:(1)在实模式下,只能使用16位段,而32位段只能用于保护模式程序。故USE16可缺省(2)段名作为操作数 出现在指令中时,MASM 将其视为立即数,表示段 地址。,D1 segmentascstr db comput a D1 ends Code1 segmentASSUME CS:C

5、ode1, DS:D1mov ax , D1mov ds , ax Code1 ends,9,. ASSUME伪指令 基本形式:ASSUME 段寄存器名:段名, , 段寄存器名:段名功能: 指明段与段寄存器之间的对应关系.即告诉MASM某 个段的段地址在哪个段寄存器里。 当程序定义一个段后,需要告诉汇编器该段的段地址在哪个段寄存器中。ASSUME就提供这种信息。例如:ASSUME CS:CSEG, DS:DSEG, ES:ESEG, SS:SSEG 指出CSEG、DSEG、ESEG和SSEG分别为代码段、数据段、附加段和堆栈段。,10,例:d1 segment ;define data seg

6、ment.d1 ends d2 segment ;define extra segment.d2 ends code1 segment ;define code segmentassume cs:code1,ds:d1,es:d2 .code1 ends,11,程序开始/结束伪指令,结束伪指令 基本形式:END 地址功能:表示汇编语言源程序到此结束,对END之后的语句不再进行汇编。可选的地址指出程序执行的起始点,通常是标号或过程名。 若程序包含多个源文件,则每个源文件的最后必须有一条END语句,但只有主模块文件可以指出执行的起始地址。,12,开始伪指令 基本形式:NAME 模块名功能:为模块起

7、名字。也可用: TITLE text他们并非必须。,13, 数据定义及存储器分配伪指令(变量定义伪指令),功能:为数据分配内存空间,并设置相应内存单元的初始值。形式:变量名 变量定义符 操作数,操作数变量名是一个符号地址,表示其后操作数的首地址, 变量名为可选项,给出变量名只是为了按名存取其对应的内存单元。,14,例:编写一段显示字符串STRING的程序DATA SEGMENTSTRING DB HAPPY NEW YEAR!, 0DH , 0AH , $ COUNT DW 17DATA ENDS . . . 变量名 变量定义符 操作数,操作数,15,变量定义符主要包括下列几种:DB(Defi

8、ne Byte):定义字节,后面的每个操作数占1个 字节。DW(Define Word):定义字,后面的每个操作数占1个字。DD(Define Dword):定义双字,后面的每个操作数占2 个字。操作数可以是常数、 用EQU或=定义的符号常量、 表达式、 ?和DUP子句等。其中,?表示只保留内存空间,未定义初始值。复制操作符DUP子句的格式为: 重复次数 DUP (操作数,操作数),16,Such as: DATA SEGMENT D1 db 10,10H D2 dw -5 D3 dd 3*20, 0FFFDH DATA ENDS,0aH 10H FB FF 3C 00 00 00 FD FF

9、 00 00,D1,D2,D3,60d=0000003cH,操作数可以是 表达式,17,Such as: DATA SEGMENT a1 db 2 DUP(0, 2, ?) a2 db 100 DUP(?) DATA ENDS,0 20 2. .,a1,a2,操作数可以是 复制操作符DUP,100个字节单元,18,说明: (1)变量可以定义在任何段(包括代码段),但一般定义在数据段。 (2)用DB/DW/DD/DQ/DT定义的数据在内存按“低字节在低地址”的方式存放例如: S1 DB AB ; 等价于 S1 DB 41H, 42H S2 DW AB ; 等价于 S2 DW 4142H,S1S2

10、,41H 42H 42H 41H,19,(3)可以用DW把变量或标号的偏移地址存入存储器。 (4) 可以用DD把变量或标号的段地址和偏移地址存入存储器(段地址在高字,偏移地址在低字)。例如:X DB 10 ADDR1 DW X ADDR2 DD X ADDR1的内容(字)为变量X的偏移地址ADDR2的高字为X的段地址,低字为X的偏移地址,x ADDR1ADDR2,0AH 02H 00H 02H 00H 00H 20H,2000:0002,20,(5)MASM是强类型的。即: 变量在定义后,其类型便被确定,使用时要注意类型匹配。例如:OP1 DB ?, ?OP2 DW ?, ?下列两条指令执行不

11、同类型的操作:MOV OP1 + 1, 0 ; 字节操作指令,将0作为1 个字节送到地址OP1 + 1MOV OP2 + 2, 0 ; 字操作指令,将0作为1个字送到地址OP2 + 2,21,下列两条指令是错误的:MOV OP1, AX ; 类型不匹配MOV OP2, AL ; 类型不匹配若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理?可以采用后面要介绍的类型操作符PTR等。,22, 表达式赋值伪指令 EQU(符号定义伪指令 ),基本形式:符号名 EQU 表达式符号名 = 常数表达式功能:给表达式指定一个名字(当程序中多次出现同一个表达式时,更加方便)。说明: (1)=

12、 后的表达式只能是常数,对于字符或字符串,汇编时按整数处理。例如: COUNT = 20 MOV CX, COUNT ; 等价于MOV CX, 20(2)EQU后的表达式可以是数值、字符串、寄存器名、指令助记符等。,23,例: ALPHA EQU 7Beta EQU ALPHA+8(3)EQU不能重复定义,而 = 可重复定义,其作用域从定义点到重新定义之前。Such as:.E=7.E=E+1.,24, 地址计数器与对准伪指令1. 地址计数器2. ORG伪指令3. EVEN伪指令,地址计数器 ( $ 的使用)$ -地址计数器的值 Such as1:Jne $+6 ;跳转到这条指令的首地址加6的

13、地址.Jne-运算结果不相等时则转移(ZF=0),25,Such as2:array dw 1, 2, $+4, 3, $+4,array,01H 00H 02H 00H 7cH 00H 03H 00H 80H 00H,0074H 0075 0076 0077 0078 0079 007a 007b 007c,26,2. ORG通常,段中的数据或指令是按顺序一个接着一个存放的。ORG可以设置数据或代码的偏移地址。形式:ORG 常数表达式功能 :设置其后数据或代码的起始偏移地址为n (n为常数表达式的值)。也就是将地址计数器的值置为n。,27,【例】 已知下列数据段,指出变量V1、V2的偏移地址

14、。data segment org 200hv1 dw 1,2 org $ + 4 v2 db 6 data ends,v1 v2,01H 00H 02H 00H06H,0200H 0201 0202 0203 0204 0205 0206 0207 0208,28,3。EVEN伪指令使其后的地址从偶数开始.Such as:data segment org 200hv1 db 1 ;EA=0200Heven v2 dw 6 ;EA=0202Hdata ends,29, LABEL伪指令基本形式:名字 LABEL 类型功能:指定名字的类型,地址由所在 位置确定。然而,并不为名字分配内存空间。说明:当类型是BYTE、WORD、DWORD时,名字作为相应类型的变量;当类型是NEAR或FAR时,名字作为相应类型的标 号。,30,【例】 定义地址相同、类型不同的两个变量。ba label bytewa dw 50 dup (?)将100个字节的数组首地址赋予两个不同类型的变量:字节类型变量BA与字类型变量WA。尽管WA + 2与BA + 2指向同一内存地址,但下列两条指令的操作类型不同:mov wa + 2, 0 ; 将0作为1个字送到; 地址wa + 2mov ba + 2, 0 ; 将0作为1个字节送到地址 ; ba + 2,

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

当前位置:首页 > 中学教育 > 初中教育

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