收藏 分享(赏)

第4章 MASM汇编语言知识.ppt

上传人:hyngb9260 文档编号:8159763 上传时间:2019-06-11 格式:PPT 页数:57 大小:1.61MB
下载 相关 举报
第4章 MASM汇编语言知识.ppt_第1页
第1页 / 共57页
第4章 MASM汇编语言知识.ppt_第2页
第2页 / 共57页
第4章 MASM汇编语言知识.ppt_第3页
第3页 / 共57页
第4章 MASM汇编语言知识.ppt_第4页
第4页 / 共57页
第4章 MASM汇编语言知识.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、2019年6月11日星期二,1,第4章 MASM汇编语言知识,4.3 伪指令 4.2 汇编语句表达式 自学本节的详细内容 4.4 DOS功能调用和BIOS功能调用,2019年6月11日星期二,2,4.3 伪指令,1、伪指令语句 2、汇编语言源程序格式,2019年6月11日星期二,3,1、伪指令语句,伪指令是构成汇编语言指令系统的一部分; 指示性语句,为汇编程序提供一些辅助信息; 类型 变量定义:定义数据变量; 程序指示:安排程序中的数据存放位置; 段定义:程序中使用到的逻辑段的说明; 特点 没有对应的机器指令; 由汇编程序在翻译汇编语言源程序的时候执行。,2019年6月11日星期二,4,4.3

2、.1 变量定义伪指令,伪指令格式变量名 助记符 操作数 ; 注释 变量名 合法的标识符,可作为符号地址,可选项; 助记符 必选项,指示所定义变量的类型; 操作数 必选项,可有1多个操作数; 若具有1个以上操作数,需使用逗号“,”分隔;,2019年6月11日星期二,5,助记符,助记符用于确定操作数的类型; 每个操作数在内存中存放所占的字节数; 常用的助记符 DB(字节)、DW(字)、DD(双字) 其他助记符 DF(三字)、DQ(四字)、DT(十字节),2019年6月11日星期二,6,变量定义伪指令的操作数类型,可以定义数值; 立即数、已定义的常量、表达式; 字符、字符串; 可以只分配存储空间,而

3、不赋具体的数值; 使用通配符“?” 可以定义一段连续的存储空间; 使用DUP子句,2019年6月11日星期二,7,变量定义伪指令举例1常数和表达式,例1. 变量定义伪指令的操作数是数值时,均以二进制补码形式在内存中保存。 设常量定义为: NUM EQU 100 变量定义伪指令如下:A1 DB 10A2 DW NUM,100H,-1A3 DD 4*8,A1,A2,A3,10,100,100H,-1,4*8 =32 =20H,0A,64 00,00 01,FF FF,20 00 00 00,2019年6月11日星期二,8,变量定义伪指令举例2 字符、字符串,例2. 操作数是字符或字符串时,一般使用

4、DB来定义,以ASCII码的形式存放。STR1 DB A,BSTR2 DW ABSTR3 DD BASTR4 DB ABCD,STR1,STR2,STR3,STR4,41,42,42 41,41,42,41,42,43,44,00,00,2019年6月11日星期二,9,变量定义伪指令举例3 只分配存储空间,例3. 若在汇编期间只需要为变量分配存储空间,而不赋初值,则可以使用“?”作为操作数。BUF1 DB 5 , 6 , ? BUF2 DW 100H , ?,BUF1,BUF2,05,06,-,00 01,- -,2019年6月11日星期二,10,DUP复制说明符 重复次数n DUP (OPR

5、D1 , OPRD2 , ) 该说明符可嵌套使用; 例4. 操作数若使用DUP复制说明符,则表示定义重复数据,分配连续的存储空间。DATA1 DB 100 DUP(0)DATA2 DB 3 DUP (3 DUP (2) , 7),变量定义伪指令举例4 分配连续的存储空间,DATA1,100个,DATA2,2019年6月11日星期二,11,变量定义伪指令练习,请写出下列变量定义伪指令的内存分配情况。DATA1 DB 01H , A , 123 , BCDDB 1 , 2 DUP(2 , 3)DATA2 DW 0AB1CH , ? , 0DW 20 , 14H , -1DATA3 DD 234H

6、, ?,DATA1,DATA2,DATA3,2019年6月11日星期二,12,2019年6月11日星期二,12,4.3.2 常量定义伪指令,赋值伪指令EQU 格式: EQU 功能:用指定标识符来代替表达式值或符号; 表达式可以是数值,也可以字符或字符串、指令助记符等; 例如: DATA EQU 2MOVE EQU MOV 注意: 该语句仅为标识符来赋值,并不会分配存储空间; 汇编程序会将源程序中的标识符替换成对应的数值; 在同一程序中, EQU语句对一个符号名只能定义一次。,2019年6月11日星期二,13,等号伪指令,格式= 功能 定义标识符,来代替表达式的值; 与EQU语句的区别: 只能定

7、义数值; 在同一程序中可对一个符号名重复定义;,2019年6月11日星期二,14,4.3.5 定位伪指令ORG,格式: ORG 功能: 将其后的数据或指令从“数值表达式”所指定的位置开始存放。 例:,X1 DW 23H DB 23H X2 DB ABC,0DH,0AH X3 DB ?,23,X1,00,23,X2,41,42,43,0D,0A,X3,ORG 100H,ORG 200H,2019年6月11日星期二,15,4.3.7 MASM汇编语言源程序结构,一个汇编语言源程序应包含数据段、堆栈段和代码段; 数据段可以没有,也可以有一个或两个; 用一个时一般为DS段,可多扩展一个ES段; 堆栈段

8、可以直接定义,也可以使系统默认分配; 代码段CS必须要有; 源程序中的各逻辑段顺序可以随意安排,但通常数据段在前,代码段在后; 源程序形式有完整结构和简化结构两种;,2019年6月11日星期二,16,完整源程序的一般结构(建议初学者先掌握该结构),DATA1 SEGMENT,DATA1 ENDS, ,CODE1 SEGMENT,CODE1 ENDS,ASSUME CS:CODE1,DS:DATA1,START:,MOV AX,DATA1 MOV DS,AX,MOV AX,4C00H INT 21H,END START,;- ;-,逻辑段的定义,段说明ASSUME,可添加 堆栈段的定义,源程序结

9、束伪指令END,段起始的标号,合法标识符即可,返回DOS的功能调用,是所有汇编语言源程序的结束语句,只要有数据段,均需指令为段寄存器赋值,2019年6月11日星期二,17,段定义伪指令,格式段名 SEGMENT ;段体 段名 ENDS 段名 合法标识符,首尾段名要一致; 段名作为操作数时,表示立即数,其值为段地址; 段体 数据段中主要为数据定义伪指令; 代码段中主要为汇编指令。,详见课本P87定义格式,2019年6月11日星期二,18,段约定伪指令ASSUME,格式 ASSUME 段寄存器名:段名 , 段寄存器名:段名 , 功能 指明逻辑段和段寄存器的对应关系。 并不会为段寄存器赋值,需要指令

10、完成赋值; 例如: 段寄存器与逻辑段之间不一定是一一对应的关系。 取消段指定 ASSUME 段寄存器名:NOTHING,详见课本P89定义格式,ASSUME CS:CODE1,DS:DATA1,ES:DATA2,DATA1,2019年6月11日星期二,19,关于堆栈段,堆栈段的定义:STACK1 SEGMENT STACK DW 256 DUP(?) ;分配256个字单元 STACK1 ENDS 若源程序中无堆栈段定义,则系统会自动分配一个堆栈段,但连接时会产生一个警告信息: warning xxxx: no stack segment 警告信息不影响程序正常运行。 SS和SP的赋值可以指令完

11、成,也可通过参数STACK自动设置。,2019年6月11日星期二,20,源程序结束伪指令,指令格式END 地址 指令功能 表示汇编语言源程序结束; 可选的地址用于指出程序的起点,一般为标号或过程名表示的符号地址。,详见课本P90,2019年6月11日星期二,21,简化的源程序结构,.model small .stack .data .code .startup ;- ;- .exit end,MOV AX , DATA MOV DS , AX,MOV AX , 4C00H INT 21H,可添加子程序代码,存储模式,简化段定义伪指令,2019年6月11日星期二,22,存储模式说明,简化模式下,

12、必须使用.MODEL伪指令指明存储模式; 汇编程序根据该伪指令生成相应的ASSUME语句等; 可选的存储模式 TINY:COM文件使用; SMALL:一个数据段、一个代码段,只支持段内转移; COMPACT:多个数据段,一个代码段; MEDIUM:一个数据段,多个代码段,可以做段间转移; LARGE:多个数据段,多个代码段,必须64KB以下数组; HUGE:多个数据段,多个代码段,可用64KB以上数组; FLAT:80386以上的CPU模式下使用;,2019年6月11日星期二,23,简化段定义伪指令,简化段段名 .CODE:代码段,其后是汇编指令; .DATA:数据段,其后是变量定义伪指令;

13、.STACK 堆栈字节数:堆栈段,缺省1024字节; .STARTUP 用于代码段的开始,可自动初始化段寄存器; .EXIT 用于结束程序的运行;,2019年6月11日星期二,24,处理器选择伪指令,缺省方式下,汇编程序只处理16位系统的指令; 使用32位系统指令,需要在源程序开始指明处理器类型; .8086:默认类型; .286、.286P、.386、.386P、.486、.486P、.586、.586P、 .686、.686P P表示可使用特权指令; 一个源程序中可混合使用多种处理器选择伪指令。,2019年6月11日星期二,25,4.4 DOS功能调用和BIOS功能调用,BIOS功能调用

14、BIOS例行程序是系统加电自检时,所用到的主要I/O设备程序以及接口控制等功能模块; 直接调用这些模块,使程序员不必了解硬件接口的特性; DOS功能调用 DOS磁盘操作系统,有IO.SYS和MSDOS.SYS两个模块; DOS模块提供了更多更必要的测试,使用DOS调用比使用相应功能的BIOS操作更简易,而且对硬件的依赖性更少些。,课本P96,2019年6月11日星期二,26,DOS功能调用的使用方法,设置入口参数 (AH)=功能调用号 其他参数根据功能需要而不同,也可没有; 执行指令INT 21H,调用相应的DOS模块 获得输出参数 根据不同的功能从不同的位置获取,也可没有。,4.4.1 常用

15、的DOS功能调用,单字符输入 01号功能调用 单字符输出 02号功能调用 字符串输出 09号功能调用 字符串输入 0A号功能调用 程序结束返回 4C号功能调用,2019年6月11日星期二,27,2019年6月11日星期二,28,功能调用号:01H 入口参数:无 出口参数: (AL)=输入字符的ASCII码 举例:从键盘上获取一位十进制数据。 指令序列: 执行时状态: 光标等待键盘输入,输入一个字符“1”后返回; 在屏幕上可看到输入的字符; 出口参数: (AL)=31H 结果处理: 所需的十进制数据 = (AL) - 30H,1、单字符输入(01号功能调用),MOV AH , 01H INT 2

16、1H,2019年6月11日星期二,29,2、单字符输出(02号功能调用),功能调用号:02H 入口参数: (DL)=待输出字符的ASCII码 出口参数:无 举例:输出显示变量CHAR所存放的字母 指令序列: MOV AH , 02H MOV DL , CHAR INT 21H 若CHAR变量定义如上,则以上指令序列执行完毕会在屏幕上显示字符“F”。,CHAR DB F,2019年6月11日星期二,30,3、字符串输出(09号功能调用),功能调用号:09H 入口参数: (DS:DX)=待输出字符串的起始地址 欲输出字符串必须以“$”为结束事先存放于存储器中。 出口参数:无 试将变量String保

17、存的字符串显示出来。 变量定义: String DB “ABCD$” 指令序列:,“$”是作为显示终止符使用的!,MOV AX , SEG String MOV DS , AX LEA DX , String MOV AH , 09H INT 21H,2019年6月11日星期二,31,4、字符串输入(0A号功能调用),功能调用号:0AH 入口参数: (DS:DX)=存放输入字符串的起始地址 注意:存放输入字符串的缓冲区必须事先按格式定义; 缓冲区定义格式如:BUF DB n,?,n DUP(?)出口参数:在缓冲区中保存输入字符串及其长度。,缓冲区可接收的最大字符数,实际接收的字符个数,接收的字

18、符串,2019年6月11日星期二,32,从键盘上接收一个字符串举例,数据段定义:DATA1 SEGMENTbuf DB 5 , ? , 5 DUP(0)DATA1 ENDS 输入字符串的指令序列:MOV AX , SEG bufMOV DS , AXLEA DX , bufMOV AH , 0AHINT 21H以上指令序列执行,光标等待键盘输入,输入字符串“abcd”,以回车结束,即返回,存储单元的状态如右图。,buf,04,61,62,63,64,0D,2019年6月11日星期二,33,0A号DOS功能调用使用注意事项,输入字符串的长度限制 输入字符串的长度受限于缓冲区的第一个字节数据; 若

19、缓冲区定义: BUF DB 10 , ? , 10 DUP(0)则最多可输入9个字符; 字符串输入的回车结束符也会保存于缓冲区中 缓冲区初始化: 若输入的字符串最终需要输出,则可在缓冲区定义时,将其初始化为“$”,以使输出的字符串能够正常结束。 注意,最后输入的回车符的处理。,2019年6月11日星期二,34,例. 输入字符串,并换行回显。,DATA1 SEGMENTbuf DB 10 , ? , 10 DUP(“$“) DATA1 ENDS CODE1 SEGMENTASSUME CS:CODE1,DS:DATA1 START: MOV AX , DATA1MOV DS , AXLEA DX

20、 , bufMOV AH , 0AHINT 21H,MOV AH , 2MOV DL , 10INT 21HMOV DL , 13INT 21HLEA DX , buf+2 MOV AH , 09HINT 21HMOV AX , 4C00HINT 21H CODE1 ENDSEND START,4.2 汇编语句表达式,1、运算符 2、表达式,2019年6月11日星期二,35,2019年6月11日星期二,36,1、运算符,数值运算符 算术运算符、逻辑运算符、关系运算符 属性运算符 段属性SEG、偏移属性OFFSET、类型属性TYPE 长度属性LENGTHOF、容量属性SIZEOF 属性修改运算符

21、 强制类型PTR,2019年6月11日星期二,37,算术运算符,运算符类型 +(正号)、-(负号) +(加)、-(减)、*(乘)、/(除)、MOD(取模) 算术运算符与立即数、常量、括号等构成数值表达式。 变量不能参与算术运算构成数值表达式。 例如:120+(321-90) mod 3322*5/32,=120+231 mod 3,=120+0 =120 =78H,= 1610/32 = 50 =32H,2019年6月11日星期二,38,逻辑运算符,运算符类型 AND(与)、OR(或)、NOT(非)、XOR(异或) SHL(左移)、SHR(右移) 逻辑运算符可与立即数、常量、括号等构成数值表达

22、式。 变量不能参与逻辑运算。 例如:1 SHL 347H AND 0FHNOT 56H,=08H,=07H,=0A9H,2019年6月11日星期二,39,关系运算符,运算符类型 EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于) 关系运算符可与立即数、常量、变量、括号等构成数值表达式。 关系运算只能有0(假)和0FFH(真)两个返回值。 返回值以二进制补码形式表示,位数由目的操作数决定; 例如:MOV AX , 120 LT 100HMOV AL , 21 EQ 21H,(AX)=0FFFFH,(AL)= 0,2019年6月11日星期二,40,属性操作符

23、,属性操作符是面向变量或标号的; 属性操作符的类型 返回值型:获取变量或标号的相关属性返回值; 强制转换型:强制改变变量或标号的相关属性; 变量和标号是在数据定义和程序中设置的标识符; 变量:表示数据的地址B1 DB 12H 标号:表示指令的地址LOOP1: MOV AX , BX,2019年6月11日星期二,41,段属性操作符 SEG,格式:SEG 功能 返回标识符所在段的段地址; 例如: MOV AX , SEG NEXT MOV BX , SEG DATA 若存储器如右所示,则以上指令执行后(AX) = 1000H, (BX) = 2000H,NEXT,DATA,代码段 CS,数据段 D

24、S,1000H,2000H,2019年6月11日星期二,42,偏移量属性操作符 OFFSET,格式: OFFSET 功能 返回该标识符的段内偏移地址; 例如:数据段定义如下: X1 DW 12H , 100H X2 DD 0 X3 DB ? , A 若执行指令:MOV AX , OFFSET X1 MOV BX , OFFSET X3(AX) = 0000H,(BX) = 0008H,X1,X2,数据段,0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 0009H,X3,2019年6月11日星期二,43,类型属性操作符 TYPE,格式T

25、YPE 功能 返回变量和标号的类型值; 类型值 变量:每个变量所占的字节数; 标号:标号的NEAR、FAR类型;,2019年6月11日星期二,44,类型属性操作符举例,例如:数据段定义如下: X1 DW 12H , 100H X2 DD 0若执行指令:MOV AX , TYPE X1 MOV BL , TYPE X2则(AX) = 0002H,(BL) = 04H,X1,X2,数据段,0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H,2019年6月11日星期二,45,长度属性操作符 LENGTHOF,格式 LENGTHOF 只能应用于变量; 功能

26、返回变量所定义的数据个数; 例如 变量定义为:ARRAY1 DW 2 DUP(0,1) , 1 则指令MOV AL , LENGTHOF ARRAY1后,(AL)= ;,5,课本上的是LENGTH,LENGTH对于DUP定义的变量,不能确切反映实际的元素个数!,2019年6月11日星期二,46,容量属性操作符 SIZEOF,格式: SIZEOF 只能应用于变量; 功能: 返回变量的所占存储单元的数目; 例如 变量定义为:ARRAY1 DW 2 DUP(0,1) , 1 则指令MOV AL , SIZEOF ARRAY1后,(AL)= ;,0AH,2019年6月11日星期二,47,强制属性操作符

27、 PTR,格式:PTR PTR 功能: 将标识符的类型属性临时性地强制为指定的类型; 该强制只在本条指令内有效; 常用的类型: BYTE、WORD、DWORD、NEAR、FAR,变量的类型,标号的类型,2019年6月11日星期二,48,强制属性操作符举例,例如:数据段定义如下: X1 DW 12H , 100H X2 DD 1234H X3 DB 10 , A 请问以下指令是否正确: MOV AX , X1 MOV AX , X2 MOV AX , X3,X1,X2,字,字,双字,字节,字节,正确, (AX)=0012H,WORD PTR X2,WORD PTR X3,(AX)=1234H,(

28、AX)=410AH,X3,2019年6月11日星期二,49,运算符的优先顺序,LENGTHOF、SIZEOF、() SEG、OFFSET、TYPE *、/、MOD、SHL、SHR HIGH、LOW +、- EQ、NE、LT、GT、LE、GE NOT AND OR、XOR,优先权依次降低,2019年6月11日星期二,50,2、表达式,表达式是由运算符、操作符、常量和变量等构成的式子; 表达式要在程序的汇编过程中计算出具体数值的,各个部分的值需要在汇编期间完全确定; 注意:表达式中不能出现寄存器,因为在汇编期间程序尚未执行,寄存器中的数值不确定! 表达式又可分为数值表达式和地址表达式。 数值表达式

29、表示数据,可作为立即数使用; 地址表达式表示地址,一般由符号地址等构成。,2019年6月11日星期二,51,表达式的构成,数值表达式 由立即数、常量、字符或字符串与数值运算符构成; 字符或字符串使用时,应用引号括起来; 由变量、标号与属性操作符构成; 由两个符号地址相减构成表示二者之间距离的表达式; 地址表达式 由变量、标号、运算符(+、-)、地址计数器$构成; 典型的地址表达式:符号地址Imm;,2019年6月11日星期二,52,地址表达式举例,例如:数据段定义如下: X1 DW 12H , 100H X2 DD 1234H X3 DB 10 , A 地址表达式 MOV AX , X1+2

30、MOV AX , X1+1 MOV AL , BYTE PTR X2-2 MOV AL , X3+1 注意:地址表达式的类型与标识符的类型相同。,X1,X2,X3,(AL)=00H,(AL)=41H,(AX)=0100H,(AX)=0000H,2019年6月11日星期二,53,地址表达式作为变量定义伪指令的操作数,变量定义伪指令的操作数可以是表达式,包括数值表达式和地址表达式; 例如: ORG 100H DATALIST DB 1,2,3 ADDR1 DW DATALIST ADDR2 DD NEXT NEXT: MOV AL , 12H ADDR1= 0100H ADDR2占用4个字节保存指

31、令的地址段地址和偏移地址。,2019年6月11日星期二,54,地址计数器引用符号$,符号使用方法 格式: $ Imm 其值表示当前偏移量计数器的值Imm的立即数; 功能:用于构成地址或数据表达式; 例如:,ORG 100H D1 DB 12H W1 DW $ , $ ORG $+3 B1 DB 43H,12,D1,01,01,W1,03,01,43,B1,空出3个单元,2019年6月11日星期二,55,注意区分,变量的类型 字节、字、双字,可使用PTR、THIS等操作符改变类型; 符号变量和符号常量 伪指令DB、DW、DD等定义符号变量,标识符表示地址; 定义符EQU、=等定义符号常量,标识符

32、表示数值; 数值表达式和地址表达式 数值表达式中可使用多种运算符; 除关系运算、属性操作外,数值表达式大多不允许变量参与; 地址表达式中变量的运算一般只使用+、- 运算符; 一般形式为:符号地址立即数;,2019年6月11日星期二,56,本章小结,必须熟练掌握汇编语言源程序的完整结构格式; 掌握常用的变量、常量定义伪指令的使用; 理解常量和变量的区别; 熟悉常用的属性操作符,能够适当应用数值和地址表达式; 掌握并能熟练使用常用的DOS功能调用; 理解DOS功能调用的实质,熟悉入出口参数的设置;,本章作业,P1173、4、5、9、11 讲完指令后完成的作业:6、7、8、12、14、15,2019年6月11日星期二,57,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报