下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第四章 汇编语言及其程序设计,2,主要内容,几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计 系统调用,汇编语言的程序结构 常用的伪指令 三种程序结构的设计 顺序结构 分支结构 循环结构 子程序结构,重难点,第4章 汇编语言程序设计,3,几个概念,汇编语言、汇编语言源程序、汇编、汇编程序,源程序 .asm,目标程序 .obj,结果 debug DOS下执行,执行,可执行程序 .exe,4,4.1 8086汇编语言的语句,1. 指令性语句指令性语句用于表达处理器指令,汇编后对应一条指令代码(目标代码),因而是可执行语句 标号: 操作数 ;注释
2、 2. 指示性语句指示性语句指示源程序如何汇编、变量怎样定义、过程怎么设置,也称为伪指令,汇编时不产生目标代码,是不可执行语句 名字 参数 ;注释,5,指令与伪指令,指令(Instruction) 让CPU产生动作,在程序执行时才处理。 指令就是第3章学习的处理器指令,与具体的处理器有关、与汇编程序无关。 伪指令(Directive) 不产生CPU动作,在程序执行前由汇编程序处理。 伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令。,指令和伪指令采用易于记忆的符合表达,这就是助记符,6,保留字,保留字(Reserved Word)是汇编程序已经使用的标识符(也
3、称为关键字),主要有: 指令助记符例如:MOV、ADD 伪指令助记符例如:DB、DW 操作符例如:OFFSET、PTR 寄存器名例如:AX、CS,汇编语言大小写不敏感,7,常量,常量表示一个固定的数值,它又分成多种形式 常数 字符串 符号常量 数值表达式,8,(1) 常数,由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数。,9,(2) 字符串,字符串常量是用单引号括起来的单个字符或多个字符 。 其数值是每个字符对应的ASCII码值 。 例如: d(等于64H) AB(等于4142H) Hello, Assembly !,10,(3) 符号常量,
4、符号常量使用标识符表达一个数值 用来为常量定义符号名 符号定义伪指令有“等价EQU”和“等号”: 符号名 EQU 数值表达式 符号名 数值表达式 EQU不能重复定义符号名,但“”允许重复定义。例如: X = 7;等效于:X equ 7 X = X+5;“X EQU X+5”是错误的,11,(4) 表达式,表达式一般是由运算符连接的各种常量所构成。 汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量。 表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定。 经常使用的是加减乘除( * / )。 例如: mov ax,3*4+5;等价于:mov ax
5、,17 and ax, 3 and 5 ;等价于:and ax, 1,12,4.2 8086汇编中的伪指令,4.2.1 符号定义语句 等值语句格式: 符号名 EQU 表达式 PORT EQU 1234 BUFF EQU PORT58 MEM EQU DS:BP20H COUNT EQU CX ABC EQU AAA,13,4.2.2 变量定义语句,变量实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变。 变量需要事先定义才能使用。 变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化。 定义后的变量可以利用变量名等方法引用其中
6、的数据,即变量的数值。,14,(1) 变量的定义,变量定义的汇编语言格式为: 变量名 伪指令 初值表 变量名为用户自定义标识符,表示初值表首元素的逻辑地址,常称为符号地址。变量名也可以没有 初值表是用逗号分隔的参数,主要由常量、数值表达式或“?”组成。其中“?”表示未赋初值 多个存储单元如果初值相同,可以用复制操作符DUP进行定义: 重复次数 DUP(重复参数) 变量定义伪指令有DB、DW、DD等,15,字节变量的定义DB,DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值。 初值表中每个数据一定是字节量,存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也
7、可以是字符串常数,16,字节变量定义实例,;数据段 Xdb a,-5 db 2 dup(100),? Ydb ABC,17,字变量的定义DW,DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值。 初值表中每个数据是字,一个字单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数,18,字变量定义实例,;数据段 countdw 8000h,?,AB maxintequ 64h numberdw maxint arraydw maxint dup(0),19,双字变量的定义DD,DD伪指令用于分配一个或多个双字
8、单元,并可以将它们初始化为指定值。 初值表中每个数据是一个32位的双字量: 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 vardd DD 0,?,12345678h farpoint DD 00400078h,20,(2)变量的应用,变量具有存储单元的逻辑地址。 程序代码中 : 通过变量名引用其指向的首个数据。 通过变量名加减位移量存取以首个数据为基地址的前后数据。,21,变量的定义,bv1db 100,01100100b,64h,d ;字节变量:不同进制表达同一个数值,内存中有4个64H minint= 5 ;符号常量:mini
9、nt数值为5,不占内存空间 bv2db -1,minint,minint+5 ;内存中数值依次为FFH,5,0AH db ?,2 dup(20h) ;预留一个字节空间,重复定义了2个数值20H wv1dw 2010h,4*4 ;字变量:两个数据是2010H、0010H,共占4个字节 wv2dw ? ;wvar2是没有初值的字变量,22,变量的定义(续),dvardd 12347777h,87651111h,? ;双字变量:2个双字数据,一个双字空间 abcdb a,b,c,?;定义字符,实际是字节变量 maxintequ 0ah;符号常量:maxint10 stringdb ABCDEFGHI
10、J ;定义字符串:使用字节定义DB伪指令 crlfsdb 13,10,$ ;回车符0DH、换行符0AH和字符$24H array1dw maxint dup(0) ;10个初值为0的字量,可以认为是数组 arraydb 2 dup(2,3,2 dup(4) ;6个字节内容依次为:02 03 04 04 02 03 04 04,23,(3) 变量的定位,汇编程序按照指令的先后顺序一个接着一个分配存储空间。 定位伪指令ORG控制数据或代码所在的偏移地址。 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如: ORG 100h ;从100H处安排数据或程序 ORG $+10
11、; 偏移地址加10,即跳过10个字节空间 汇编语言程序中,符号“$”表示当前偏移地址值。,24,程序计数器$,汇编程序有一个当前位置计数器,用来记录正在汇编的数据或指令目标代码存放在当前段内的偏移量。 $表示位置计数器的当前值。例如: BLOCK DB Hello NUM EQU $-BLOCK ;NUM=5,25,习题1:下列语句在存储器中各分配多少字节? (1) VR1DW9 (2) VR2DW 4 DUP(?),2 (3) CONT EQU 10 (4) VR3 DD CONT DUP(?) (5) VR4 DB 2 DUP(?,CONT DUP(0) (6) VR5 DB How ar
12、e you?,26,(4)名字和标号的属性,名字和标号是用户自定义的标识符。 名字指向一条伪指令, 标号指向一条指令。 名字和标号一经使用便具有两类属性: 逻辑地址名字和标号对应存储单元的逻辑地址,含有段地址和偏移地址; 类型变量名的类型可以是BYTE、WORD和DWORD等;标号、段名、子程序名的类型可以是NEAR和FAR,分别表示段内或段间调用 汇编程序提供操作符TYPE,以便获取这些属性值,27,1)、 地址操作符,地址操作符取得名字或标号的段地址和偏移地址,28,举例,; 数据段 BUFFER DB ? ; 代码段 MOV BX, OFFSET BUFFER MOV BX, SEG B
13、UFFER,LEA BX, BUFFER,29,2) 类型操作符,类型操作符对名字或标号的类型属性进行设置 类型名 PTR 名字/标号 其中类型名可以是BYTE、WORD、DWORD, 或者是NEAR、FAR 对变量: LENGTH 操作符获知某变量名指向多少个数据项 SIZE 操作符获知某变量共占用多少字节空间 TYPE 操作符获取变量类型值,30,举例,;数据段 STUFF DD 12345678H ;代码段 MOV CL, BYTE PTR STUFF MOV CH, BYTE PTR STUFF+1 MOV AX, WORD PTR STUFF MOV DX, WORD PTR STU
14、FF+2,; (CL)=78H,; (CH)=56H,; (AX)=5678H,; (DX)=1234H,31,段名 SEGMENT 段名 ENDS,三、段定义语句,(1) SEGMENT定义一个逻辑段,并给逻辑段赋予一个段名。 (2) 常见的段名如:CODE, DATA, STACK,32,2、段假设语句 ASSUME 段寄存器名:段名, 3、ORG伪指令、地址计数器 $ ORG伪指令格式: ORG 4、END 表示源代码结束 格式为: END 常数或表达式.,33,四、过程定义语句 过程名 PROC NEAR/FAR RET 过程名 ENDP,34,伪指令小结,符号定义语句 EQU = 数
15、据定义语句 DB DW DD DUP 段定义语句 SEGMENT/ENDS ASSUME 过程定义语句 PROC/ENDP 其他 ORG $ END 常用运算符 AND OR XOR NOT OFFSET SEG LENGTH SIZE TYPE PTR,35,4.4 汇编语言程序设计,常用的汇编语言程序框架: DATA SEGMENT;定义数据段 VAL1 DB 12H , 8EH ;定义变量 DATA ENDS ;数据段结束 CODE SEGMENT;定义代码段 ASSUME DS:DATA , CS: CODE;段属性说明 START: MOV AX , DATA;初始化DS MOV D
16、S , AX MOV AX , 4C00H;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束,36,框架一: DATA SEGMENT;定义数据段 VAL1 DB 12H , 8EH ;定义变量 DATA ENDS ;数据段结束 CODE SEGMENT;定义代码段 ASSUME DS:DATA , CS: CODE;段属性说明 START: MOV AX , DATA;初始化DS MOV DS , AX ; 填写代码 MOV AX , 4C00H;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束,37
17、,框架二: DATA SEGMENT;定义数据段 VAL1 DB 12H , 8EH ;定义变量 DATA ENDS ;数据段结束 CODE SEGMENT;定义代码段 MAIN PROC FAR ASSUME DS:DATA , CS: CODE;段属性说明 START: PUSH DS MOV AX , 0 PUSH AX MOV AX,DATA MOV DS,AX ;填写代码 RET MAIN ENDP CODE ENDS ;代码段结束 END START ;源程序结束,38,程序开始,为了指明程序开始执行的位置,需要使用一个标号(例题中采用了start标识符) 连接程序会根据程序起始点
18、正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值 连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值 大多数程序需要数据段,程序的执行开始应是: start:mov ax, data;data表示数据段的段地址 mov ds,ax;设置DS,39,程序终止,应用程序执行结束,应该将控制权交还操作系统 汇编语言程序设计中,有多种返回DOS的方法,但一般利用DOS功能调用的4CH子功能实现,它需要的入口参数是AL返回数码(通常用0表示程序没有错误) 于是,应用程序的终止代码就是: mov ax,4c00h int 21h,40,汇编结束,汇编结束表示
19、汇编程序到此结束将源程序翻译成目标模块代码的过程 源程序的最后必须有一条END伪指令 END 标号 可选的“标号”参数指定程序开始执行点,连接程序据此设置CS和IP值(例题中采用了start标识符),41,4.6.2 系统功能调用方法,汇编程序提供给汇编语言程序员的功能非常有限 程序员需要利用ROM-BIOS和操作系统提供的资源 系统功能调用是程序设计的一个重要方面,42,系统功能调用步骤,通常按照如下4个步骤进行: 在AH寄存器中设置系统功能调用号 在指定寄存器中设置入口参数 用中断调用指令( INT i8)执行功能调用 根据出口参数分析功能调用执行情况,43,DOS输入输出功能调用,DOS
20、利用21H号中断提供给用户近百个系统功能,主要包括设备管理、目录管理和文件管理三个方面的功能 重点掌握: 输入一个字符,01H号功能调用 输出一个字符,02H号功能调用 输出一个字符串,09H号功能调用,44,1)01H号DOS功能调用,输入一个字符 功能调用号:AH01H 入口参数:无 功能调用:INT 21H 出口参数:AL键入字符的ASCII码,;输入一个字符 mov ah,01h;设置功能调用号 int 21h;功能调用 mov dl,al;使用出口参数,45,2)02H号DOS功能调用,输出一个字符 功能调用号:AH02H 入口参数:DL欲显示字符的ASCII码 功能调用:INT 2
21、1H 出口参数:无,;显示一个问号“ ?” mov ah,02h;设置功能调用号 mov dl,?;设置入口参数 int 21h;功能调用,46,例题-回车换行,mov ah,2 mov dl,0dh;回车功能的ASCII码是0DH int 21h mov ah,2 mov dl,0ah;换行功能的ASCII码是0AH int 21h,47,3)09H号DOS功能调用,输出一个字符串 功能调用号:AH09H 入口参数: DS:DX欲显示字符串在内存中的首地址(逻辑地址形式:DS段地址,DX偏移地址),内存中的字符串以ASCII码形式保存,最后必须添加一个“$”结尾(并不显示) 功能调用:INT
22、 21H 出口参数:无,48,例题-在屏幕上显示一段信息,;数据段(定义要显示的字符串) stringdb Hello, Assembly !,0dh,0ah,$ ;代码段(显示字符串的程序) mov dx,offset string mov ah,9 int 21h,Hello,Assembly!,49,4)结束用户程序的方法,MOV AH, 0 INT 21H,50,4.4 程序设计基本方法,4.4.1 程序设计概述 4.4.2 顺序结构程序设计 4.4.3 分支结构程序设计 4.4.4 循环结构程序设计 4.4.5 子程序设计,51,4.4.1 程序设计概述,1程序设计的步骤 (1)分析
23、问题 (2)建立数学模型 (3)确定算法 (4)绘制流程图 (5)分配内存空间 (6)编制程序与静态检查。 (7)上机调试 (8)试运行和分析结果 (9)整理资料投入运行 2返回DOS的方法 MOV AH,4CH ;功能号送AH INT 21H ;返回DOS 3程序的基本结构 顺序结构,分支结构,循环结构,52,4.4.2 顺序程序设计,没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就是顺序程序 顺序结构是最基本的程序结构 完全采用顺序结构编写的程序并不多见,53,例4-1:教材P81页 Data segment BLOCK dw 0abcdH BUFF DD ? DATA
24、 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX,54,MOV DX,BLOCK MOV AX,DX AND AX,0F0FH AND DX,0F0F0H MOV CL,4 SHR DX,CL LEA BX,BUFF MOV BX+0,AL MOV BX+1,DL MOV BX+2,AH MOV BX+3,DH MOV AX,4C00H INT 21H CODE ENDS END START,BLOCK 2字节送AX,AX取1,2字节,DX取2,4字节,DX右移4BIT,55,例4-4: 查表,在以TAB
25、LE为首地址的内存中顺序存有06的立方数表,现从键盘上输入一个数( =6),求其立方值,结果保存到RES单元中。 算法为: 取TABLE表的首地址,输入(1号调用)值即为表的偏移量,查表即可得到立方值,56,DATA SEGMENT TABLEDB0,1,8,27,64,125,216 RESDB? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AH,1 ;1号调用 INT 21H AND AL,0FH ;屏蔽高4位,即把ASICII码转换为数据 LEA BX,TABLE ;取表的首地
26、址 XLAT ;查表指令 MOV RES,AL ;结果送RES单元 MOV AH,4CH INT 21H CODE ENDS END START,57,上机实验一,58,4.4.3 分支程序设计,分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志 转移指令Jcc和JMP可以实现分支控制 分支结构有 单分支结构 双分支结构 多分支结构,59,单分支结构,条件成立跳转,否则顺序执行分支语句体 注意选择正确的条件转移指令和转移目标地址,实例:求绝对值,60,例4.5计算有符号数AX的绝对值,cmp ax,0 jge nonneg;条件满足(AX0),
27、转移 neg ax;条件不满足,求补 nonneg:mov result,ax;条件满足,61,双分支结构,条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,实例:显示BX的最高位,62,例4.8 显示BX的最高位,shl bx,1;BX最高位移入CF标志 jc one;CF1,即最高位为1,转移 mov dl,30h ;CF0,即最高位为0:DL30H0 jmp two;一定要跳过另一个分支体 one:mov dl,31h;DL 31H1 two:mov ah,2 int 21h;显示,可以用JNC替换JC,63,例4
28、.8显示BX的最高位(续),shl bx,1;BX最高位移入CF标志 jnc one;CF0,即最高位为0,转移 mov dl,31h ;CF1,即最高位为1:DL31H1 jmp two;一定要跳过另一个分支体! one:mov dl,30h;DL 30H0 two:mov ah,2 int 21h;显示,转换为单分支结构,64,例4.8 显示BX的最高位(另解),mov dl,0 ;DL30H0 shl bx,1;BX最高位移入CF标志 jnc two;CF0,即最高位为0,转移 mov dl,1 ;CF1,即最高位为1:DL31H1 two:mov ah,2 int 21h;显示,编写分
29、支程序,需留心分支的开始和结束,65,例4.8 显示BX的最高位(无分支),mov dl,0 shl bx,1;BX最高位移入CF标志 adc dl,30h ;CF0,DL030h030H0 ;CF1,DL030h131H1 two:mov ah,2 int 21h;显示,66,例4.9 显示压缩BCD码,;数据段 BCDdb 34h ;代码段 mov dl,BCD test dl,0ffh;如果BCD码为0,显示0 jz zero;双分支结构 test dl,0f0h;如果BCD码高位为0,不显示0 jz one;单分支结构,67,例4.9 显示压缩BCD码,mov cl,4;处理高位 sh
30、r dl,cl or dl,30h;转换为ASCII码 mov ah,2;显示高位 int 21h mov dl,BCD and dl,0fh one:or dl,30h;处理低位 jmp two zero:mov dl,0 two:mov ah,2 int 21h,68,多分支结构,多分支结构是多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行,69,N,例4.10统计学生成绩,将成绩在100分90分之间的定为“A”,依此类推,小于60分,定为“E”。(默认分数放在AL寄存器中,成绩等级放在DL寄存器中),AL90,Y,“A”,N,N,N,结束,70,CMP AL,90 JNC
31、A CMP AL,80 JNC B CMP AL,70 JNC C CMP AL,60 JNC D JMP E,A: MOV DL,A JMP RETURN B: MOV DL,B JMP RETURN C: MOV DL,C JMP RETURN D: MOV DL,D JMP RETURN E: MOV DL,E RETURN:MOV AH,4CH INT 21H,71,例4.11大小写字母转换,;如果DL是一个小写字母,则转换为大写 cmp dl,a;小于小写字母a,不需要处理 jb disp cmp dl,z;大于小写字母z,也不需要处理 ja disp sub dl,20h;是小写字
32、母,则转换为大写 disp:,72,4.4.4 循环程序设计,循环程序结构是满足一定条件的情况下,重复执行某段程序 循环结构的程序通常有3个部分: 循环初始部分为开始循环准备必要的条件,如循环次数、循环体需要的数值等 循环体部分指重复执行的程序部分,其中包括对循环条件等的修改程序段 循环控制部分判断循环条件是否成立,决定是否继续循环,73,循环控制,循环结构程序的设计关键是循环控制部分 循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构: “先判断、后循环”结构 “先循环、后判断”结构 循环结束的控制可以用循环次数,还可以用特定条件等,于是又有: 计数控制循环 条件控制循环
33、,74,先循环后判断的循环结构,结束,初始化,循环的初始状态,循环体,循环的工作部分 及修改部分,计数控制循环 条件控制循环,修改部分,控制条件,Y,N,75,计数控制循环,计数控制循环利用循环次数作为控制条件 易于采用循环指令LOOP和JCXZ实现 初始化:将循环次数或最大循环次数置入CX 循环体 循环控制:用LOOP指令对CX减1,并判断是否为0,76,例4.12-用二进制显示BL内容,mov cx,8;CX8(循环次数) again:shl bl,1;左移进CF,从高位开始显示 mov dl,0;MOV指令不改变CF adc dl,30h;DL030HCF ;CF若是0,则DL 0 ;CF若是1,则DL 1 mov ah,2 int 21h;显示 loop again ;CX减1,如果CX未减至0,则循环,计数控制循环 先循环后判断,77,条件控制循环,条件控制循环需要利用特定条件判断循环是否结束 条件控制循环用条件转移指令判断循环条件 转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或结束,便
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆调度管理制度
- 肾衰竭健康指导手册
- 2025 议论文论证结构的合理安排课件
- 外包培训考试试题及答案
- 2025年临床执业医师《药理学》测试题
- 药品电子商务规范试题及答案
- 医保支付改革三基三严考试题库及答案
- 医疗安全专项行动试题及答案
- 洛南社区工作者考试题库及答案
- 汽车销售企业法律法规及经营规范岗前培训试题及答案
- 2026贵州省气象部门第二批公开招聘应届毕业生22人考试参考题库及答案解析
- 2026甘肃安泰集团有限责任公司招聘工作人员6人考试备考题库及答案解析
- 2026年咸宁职业技术学院单招职业倾向性测试题库及答案详解(网校专用)
- 2026年上饶职业技术学院单招职业技能测试模拟测试卷附答案解析
- 迟到考勤考核制度
- 2025年番禺水务集团笔试及答案
- 电厂设备刷漆制度规范
- 潜水医学PPT完整全套教学课件
- 制浆造纸设备与机械
- 2023年黑龙江省高职单招面试题库及答案解析
- TZJXDC 002-2022 电动摩托车和电动轻便摩托车用阀控式铅酸蓄电池
评论
0/150
提交评论